Линейки Голомба - это наборы неотрицательных целых чисел, так что никакие две пары целых чисел в наборе не находятся на одинаковом расстоянии друг от друга.
Например, [0, 1, 4, 6]
является линейкой Голомба, потому что все расстояния между двумя целыми числами в этом наборе уникальны:
0, 1 -> distance 1
0, 4 -> distance 4
0, 6 -> distance 6
1, 4 -> distance 3
1, 6 -> distance 5
4, 6 -> distance 2
Для простоты в этом вызове (и поскольку перевод тривиален), мы навязываем, что правитель Голомба всегда содержит число0
(который предыдущий пример делает).
Поскольку этот набор имеет длину 4
, мы говорим, что это правитель порядка Голомба 4
. Наибольшее расстояние в этом наборе (или элементе, поскольку 0
оно всегда в наборе) составляет 6
, поэтому мы говорим, что это линейка Голомба длины 6
.
Твое задание
Найти Голомбу правитель порядка 50
к 100
(включительно) , которые имеют как малые длины , как вы можете найти. Правители, которые вы находите, не обязательно должны быть оптимальными (см. Ниже).
Оптимальность
Голомбы линейка порядка N
, называются оптимальным , если нет других Голомб линейки порядкаN
, который имеет меньшую длину.
Оптимальные линейки Голомба известны для заказов менее 28 , хотя с увеличением порядка находить и доказывать оптимальность все сложнее и сложнее.
Следовательно, не ожидается, что вы найдете оптимальную линейку Голомба для любого из порядков между 50
и 100
(и даже менее ожидаемо, что вы сможете доказать, что они оптимальны).
В выполнении вашей программы нет временных ограничений.
базисный
В списке ниже приведен список длины Голомбы правителей от 50
до 100
(в порядке убывания) оценивал с помощью наивной стратегии поиска (благодаря @PeterTaylor для этого списка):
[4850 5122 5242 5297 5750 5997 6373 6800 6924 7459 7546 7788 8219 8502 8729 8941 9881 10199 10586 10897 11288 11613 11875 12033 12930 13393 14046 14533 14900 15165 15687 15971 16618 17354 17931 18844 19070 19630 19669 20721 21947 22525 23290 23563 23880 24595 24767 25630 26036 26254 27218]
Сумма всех этих длин есть 734078
.
счет
Ваш счет будет суммой длин всех ваших правителей Голомба между 50
и 100
, деленными на сумму длин правителей Голомба между 50
и 100
в базовой линии:734078
.
Если вы не нашли линейку Голомба для определенного заказа, вы должны вычислить свой счет таким же образом, используя двойную длину в базовой линии для этого конкретного заказа.
Ответ с самым низким счетом выигрывает.
В случае ничьей сравниваются длины самого большого порядка, в котором два ответа различаются, и выигрывает самый короткий. Если оба ответа имеют одинаковую длину для всех заказов, то ответ, опубликованный первым, выигрывает.
источник
n
-n(n-1)/2
это количество положительных различий. Поэтому наименьшая возможная оценка в этой задаче147050/734078 > 0.2003193
.Ответы:
C #, 259421/734078 ~ = 0,3534
методы
Наконец, я нашел более-менее читаемое объяснение метода проективного поля (метод Зингера) в конструкциях обобщенных множеств Сидона , хотя я все еще думаю, что его можно немного улучшить. Оказывается, он больше похож на метод аффинного поля (метод Бозе), чем на другие статьи, которые я читал.
Обратите внимание, что эти методы между ними дают наиболее известные значения для каждой длины, превышающей 16. Томас Рокицки и Гил Догон предлагают вознаграждение в размере 250 долларов за каждого, кто их бьет за длину от 36 до 40000. Поэтому любой, кто победит этот ответ, получит денежную компенсацию. приз.
Код
C # не очень идиоматичен, но мне нужно, чтобы он компилировался со старой версией Mono. Кроме того, несмотря на проверку аргументов, это не код качества производства. Я не доволен типами, но я не думаю, что есть действительно хорошее решение для этого в C #. Может быть, в F # или C ++ с безумными шаблонами.
Результаты
К сожалению, добавление линеек заняло бы у меня около 15 тыс. Символов, превышающих ограничение размера поста, поэтому они находятся на вставке .
источник
Python 3, оценка 603001/734078 = 0,82144
Наивный поиск в сочетании со строительством Эрдеша – Турана:
Для нечетных простых чисел p это дает асимптотически оптимальную линейку Голомба.
источник
p
и длины около2p^2
, тогда как существуют линейки Голомба порядкаn
и длины примерноn^2
асимптотически.2p^2
иp^2
.Mathematica, оценка 276235/734078 <0,376302
Функция
ruzsa
реализует конструкцию линейки Голобма (также называемую множеством Сидона), найденную в Imre Z. Ruzsa. Решение линейного уравнения в множестве целых чисел. I. Acta Arith., 65 (3): 259–282, 1993 . Для любого простого числаp
эта конструкция дает линейку Голомба сp-1
элементами, содержащимися в целых числах по модулюp(p-1)
(это еще более сильное условие, чем быть линейкой Голомба в самих целых числах).Другое преимущество работы с целыми числами по модулю
m
состоит в том, что любая линейка Голомба может вращаться ( одна и та же константа добавляется ко всем элементам по модулюm
) и масштабироваться (все элементы умножаются на одну и ту же константу, если эта константа относительно простаm
). результат - все еще правитель Голомба; иногда наибольшее целое число значительно уменьшается при этом. Таким образом, функцияscaledRuzsa
пробует все эти масштабирования и записывает результаты.manyRuzsaSets
содержит результаты выполнения этой конструкции и масштабирования для всех первых 32 простых чисел (выбранных произвольно, но 32-е простое число 131 значительно больше 100); в этом наборе почти 57 000 правителей Голомба, на вычисление которых уходит несколько минут.Конечно, первые
k
элементы правителя Голомба сами образуют правителя Голомба. Таким образом, функцияtryGolomb
смотрит на такую линейку, созданную из любого из наборов, вычисленных выше. Последняя строкаTable...
выбирает лучшую Голомбу линейку он может, каждый заказ от50
к100
, от всех Голомбы правителей нашли таким образом.Найденные длины были:
Первоначально я собирался объединить это с двумя другими конструкциями, такими как Singer и Bose; но кажется, что ответ Питера Тейлора уже реализовал это, так что, вероятно, я бы просто восстановил эти длины.
источник
m
ты можешь свободно вращаться / масштабироваться. Посмотрите на[0, 1, 4, 6]
мод 7. Если я добавлю 1, мы получим[0, 1, 2, 5]
, что не является правителем Голомба.[0, 1, 4, 6]
не является правителем Голомба мод-7, потому что1 – 0
равен0 – 6
по модулю 7, например.