Linijki Golomb są zestawami liczb całkowitych nieujemnych, tak że żadne dwie pary liczb całkowitych w zestawie nie są w tej samej odległości od siebie.
Na przykład [0, 1, 4, 6]
jest linijką Golomb, ponieważ wszystkie odległości między dwiema liczbami całkowitymi w tym zestawie są unikalne:
0, 1 -> distance 1
0, 4 -> distance 4
0, 6 -> distance 6
1, 4 -> distance 3
1, 6 -> distance 5
4, 6 -> distance 2
Dla uproszczenia tego wyzwania (a ponieważ tłumaczenie jest trywialne), narzucamy, że linijka Golomba zawsze zawiera liczbę0
(co robi poprzedni przykład).
Ponieważ ten zestaw ma długość 4
, mówimy, że jest to władca Golomb z rzędu 4
. Największa odległość w tym zestawie (lub elemencie, ponieważ 0
zawsze jest w zestawie) 6
, dlatego mówimy, że jest to władca Golombów o długości 6
.
Twoje zadanie
Znajdź Golomb władców kolejności 50
do 100
(włącznie), które mają za małe długości , jak można znaleźć. Znalezione linijki nie muszą być optymalne (patrz poniżej).
Optymalność
N
Mówi się, że linijka Golomb jest optymalna, jeśli nie ma innej linijki Golomb N
o mniejszej długości.
Optymalni władcy Golomb są znani z rozkazów mniejszych niż 28 , chociaż znalezienie i udowodnienie optymalności jest coraz trudniejsze wraz ze wzrostem rozkazu.
Dlatego nie oczekuje się, że znajdziesz optymalną linijkę Golombów dla któregokolwiek z rozkazów pomiędzy 50
i 100
(a jeszcze mniej oczekuje się, że możesz udowodnić, że są optymalne).
Nie ma ograniczeń czasowych w wykonywaniu programu.
Linia bazowa
Poniższa lista to lista długości władców Golomb od 50
do 100
(w kolejności) ocenianych za pomocą naiwnej strategii wyszukiwania (dzięki @PeterTaylor za tę listę):
[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]
Suma wszystkich tych długości wynosi 734078
.
Punktacja
Twój wynik będzie suma długości wszystkich władców Golomb między 50
i 100
, podzielonej przez sumę długości władców Golomb pomiędzy 50
i 100
na początku badania: 734078
.
W przypadku, gdy nie znalazłeś linijki Golomb dla konkretnego zamówienia, obliczasz swój wynik w ten sam sposób, używając podwójnej długości w linii podstawowej dla tego konkretnego zamówienia.
Odpowiedź z najniższym wynikiem wygrywa.
W przypadku remisu porównuje się długości największego zamówienia, w którym obie odpowiedzi różnią się, i wygrywa najkrótsza. W przypadku, gdy obie odpowiedzi mają takie same długości dla wszystkich zamówień, wygrywa odpowiedź, która została wysłana jako pierwsza.
źródło
n
jestn(n-1)/2
, ponieważ to jak wiele pozytywnych różnice istnieją. Dlatego najmniejszy możliwy wynik w tym wyzwaniu to147050/734078 > 0.2003193
.Odpowiedzi:
C #, 259421/734078 ~ = 0,3534
Metody
W końcu znalazłem mniej lub bardziej czytelne wyjaśnienie metody pola rzutowego (metoda Singera) w Konstrukcjach uogólnionych zestawów sidonowych , chociaż nadal uważam, że można ją nieco poprawić. Okazuje się, że jest bardziej podobna do metody pola afinicznego (metoda Bosego) niż inne artykuły, które czytałem.
Zakłada to znajomość skończonych pól . Rozważmy, że jest siłą pierwszą i niech F ( q ) będzie naszym polem bazowym.q=pa F(q)
Metoda pola afinicznego działa na . Wziąć generator g 2 o F ( Q 2 ) , a nie od zera elementów K o F ( q ) i za zestaw { : g 2F(q2) g2 F(q2) k F(q) Wartości te tworzą modułową modulę Golomb mod q 2 - 1 . Dalsze linijki można uzyskać, mnożącmoduł q 2 - 1 przez dowolną liczbę, która jest koprime z modułem.
Zauważ, że te metody między nimi dają najbardziej znane wartości dla każdej długości większej niż 16. Tomas Rokicki i Gil Dogon oferują nagrodę w wysokości 250 USD za każdego, kto pokonuje ich na długości od 36 do 40000. Dlatego każdy, kto pokonał tę odpowiedź, czeka na pieniądze nagroda.
Kod
C # nie jest bardzo idiomatyczny, ale potrzebuję go do skompilowania ze starą wersją Mono. Ponadto, pomimo sprawdzania argumentów, nie jest to kod jakości produkcji. Nie jestem zadowolony z typów, ale nie sądzę, że istnieje naprawdę dobre rozwiązanie w C #. Może w F # lub C ++ z szalonym szablonem.
Wyniki
Niestety dodanie linijek zabrałoby mi około 15 000 znaków powyżej limitu rozmiaru postu, więc są one na pastebinie .
źródło
Python 3, wynik 603001/734078 = 0,82144
Naiwne wyszukiwanie w połączeniu z konstrukcją Erdős – Turan:
Dla nieparzystych liczb pierwszych p daje to asymptotycznie optymalną linijkę golomb.
źródło
p
i długości2p^2
, podczas gdy istnieją linijki Golomb wn
przybliżeniu i długościn^2
asymptotycznie.2p^2
ip^2
.Mathematica, wynik 276235/734078 <0,376302
Ta funkcja
ruzsa
implementuje konstrukcję linijki Golobma (zwanej także zestawem Sidonów ) znalezionej w Imre Z. Ruzsa. Rozwiązywanie równania liniowego w zbiorze liczb całkowitych. I. Acta Arith., 65 (3): 259–282, 1993 . Biorąc pod uwagę liczbę pierwsząp
, ta konstrukcja daje linijkę Golomb zp-1
elementami zawartymi w module liczb całkowitychp(p-1)
(jest to nawet silniejszy warunek niż bycie władcą Golomb w samych liczbach całkowitych).Kolejną zaletą pracy w module liczb całkowitych
m
jest to, że dowolną linijkę Golomba można obracać (ta sama stała dodawana do wszystkich elementów modulom
) i skalować (wszystkie elementy pomnożone przez tę samą stałą, o ile ta stała jest względnie pierwszam
), i wynikiem jest nadal władca Golomb; czasami największa liczba całkowita jest znacznie zmniejszana. Dlatego funkcjascaledRuzsa
wypróbowuje wszystkie te skalowania i rejestruje wyniki.manyRuzsaSets
zawiera wyniki wykonania tej konstrukcji i skalowania dla wszystkich pierwszych 32 liczb pierwszych (wybranych nieco arbitralnie, ale 32 liczba pierwsza, 131, jest znacznie większa niż 100); w tym zestawie znajduje się prawie 57 000 władców Golombów, których obliczenie zajmuje kilka minut.Oczywiście pierwsze
k
elementy samego władcy Golombów tworzą władcę Golombów. Tak więc funkcjatryGolomb
patrzy na taką linijkę wykonaną z dowolnego zestawu obliczonego powyżej. Ostatnia liniaTable...
wybiera najlepszego władcę Golomb, jaki może, w dowolnej kolejności od50
do100
, spośród wszystkich władców Golomb znalezionych w ten sposób.Znalezione długości to:
Pierwotnie zamierzałem połączyć to z dwiema innymi konstrukcjami, Singer i Bose; ale wydaje się, że Petera Taylora już to zaimplementowała, więc prawdopodobnie po prostu odzyskałbym te długości.
źródło
m
możesz dowolnie obracać / skalować. Spójrz na[0, 1, 4, 6]
mod 7. Jeśli dodam 1, otrzymamy[0, 1, 2, 5]
, który nie jest władcą Golombów.[0, 1, 4, 6]
nie jest linijką Golomb mod-7, ponieważ na przykład1 – 0
równa się0 – 6
modulo 7.