Zadanie polega na znalezieniu nietrywialnego czynnika liczby złożonej.
Napisz kod, który znajdzie niebanalny czynnik liczby złożonej tak szybko, jak to możliwe, pod warunkiem, że Twój kod nie będzie miał więcej niż 140 bajtów. Wynik powinien być po prostu czynnikiem, który znalazłeś.
Twój kod może pobierać dane wejściowe i generować dane w dowolny dogodny sposób, na przykład jako argumenty funkcji.
Przypadki testowe, które wymieniają wszystkie czynniki (wystarczy tylko jeden wynik)
187: 11 17
1679: 23 73
14369648346682547857: 1500450271 9576890767
34747575467581863011: 3628273133 9576890767
52634041113150420921061348357: 2860486313 5463458053 3367900313
82312263010898855308580978867: 264575131106459 311111111111113
205255454905325730631914319249: 2860486313 71755440315342536873
1233457775854251160763811229216063007: 1110111110111 1000000000063 1111111999999
1751952685614616185916001760791655006749: 36413321723440003717 48112959837082048697
Nie uzyskam odpowiedzi na następujący trudny przypadek testowy, który może być interesujący w testowaniu:
513231721363284898797712130584280850383: 40206835204840513073 12764787846358441471
Wynik
Twój wynik to łączny czas na uwzględnienie wszystkich powyższych przypadków testowych z karą 10 minut za każdą nieudaną faktoryzację (wszystkie zaokrąglone do najbliższej sekundy). Twój kod powinien działać również dla innych liczb całkowitych, co nie powinno po prostu kodować tych odpowiedzi.
Zatrzymam twój kod po 10 minutach.
Jeśli dwie osoby otrzymają ten sam wynik, pierwsza odpowiedź wygrywa.
Ograniczenia
W kodzie nie można używać żadnej funkcji wbudowanej ani funkcji biblioteki, która dokonuje podziału na liczby całkowite. Możesz założyć, że wejście zajmuje mniej niż 256 bitów. Wszystkie liczby wejściowe będą złożone.
Jak będę miał czas?
Będę dosłownie uruchamiał się time ./myprog
na moim systemie Ubuntu, aby wykonać pomiar czasu, więc proszę również dostarczyć mi pełny program do uruchomienia, który zawiera dowolną zdefiniowaną przez ciebie funkcję.
Uwaga dotycząca języków skompilowanych
Czas kompilacji nie może zająć więcej niż 1 minutę na moim komputerze.
Czy to rzeczywiście możliwe?
Jeśli zignorujesz ograniczenia miejsca, każde z nich może zostać rozłożone na mniej niż 2 sekundy na moim komputerze przy użyciu czystego kodu Pythona + pypy.
Czym jest nietrywialny algorytm faktoringowy?
Algorytm Rho Pollarda jest szybki i nadaje się do gry w golfa. Oczywiście istnieje wiele innych sposobów na uwzględnienie liczby całkowitej .
Jeszcze szybsze jest sito Quadratic . Wyciśnięcie tego na 140 bajtów wygląda na poważne wyzwanie.
Wiodące wyniki
- SEJPM , 10 minut kary za ostatni przypadek testowy + 16 sekund w Haskell
2 ** 1024
?2
czy2, 2
?Odpowiedzi:
Haskell,
100979189877267 bajtówWypróbuj online!
-3 bajty dzięki @flawr
-6 bajtów dzięki @flawr ponownie
-2 bajty dzięki @flawr jeszcze raz
-2 bajty dzięki zoptymalizowanemu zestawowi parametrów
-1 bajtów dzięki @flawrs kolejny raz
-14 bajtów dzięki wymaganiu na konieczność wysyłania tylko jednego bajtu o współczynniku
-5 dzięki @AndersKaseorg
Działa to dla pierwszych 5 przypadków testowych w niezauważalnym czasie.
To prawdopodobnie przekroczy limit czasu w największym przypadku testowym.
Zasadniczo zwraca to zwykle jeden nietrywialny czynnik w czasie proporcjonalny do pierwiastka kwadratowego z najmniejszego czynnika.
Nie będzie działać na każdym wejściu, ponieważ nie zmienia wielomianu, a wykrycie wyjątkowego przypadku jest trudne do wykonania w 140 bajtach.
Nie będzie również generować pełnego faktoryzacji, ale raczej nietrywialny czynnik i podział danych wejściowych przez ten czynnik.
Nie posortuje również czynników według wielkości.
Zastosowaną metodą jest faktoring Pollarda-Rho ze standardową wartością początkową 2 (przy standardowym
x^2+1
wielomianu zastosowanym jeden raz) i niestandardowym wielomianowym stałym współczynnikiem 7 (ponieważ1
nie zadziałał z 1679) dla wszystkich dalszych ocen.Pełny program (
factor.hs
):Skompiluj jako
$ ghc factor.hs
(wymagaghc
zainstalowania).Uruchom jako
$ ./factor <number>
.Przykładowy przebieg:
Nieskluczony kod:
Oblicza nietrywialny czynnik, wywołując
g
wartości początkowe. Wielomian jest wstępnie zastosowany tutaj 2 i ponownie zastosowany do wyniku (5), dzięki czemu dane wejścioweg
(w klauzuli „gdzie” ) zawsze można łatwo wykorzystać do testu gcd.g
(wersja golfowa korzysta z infix#
), a następnie próbuje obliczyć nietrywialny czynnikd
(w klauzuli where w wersji bez gry w golfa, liniowy w grze w golfa) jako różnicę między dwoma wejściami dog
, jeśli się powiedzie, zwraca ten czynnik , w przeciwnym razie ponawia. Tutaj może generowaćn
jako dane wyjściowe, jeślia==b
iw ten sposób zwraca tylko trywialny czynnik, właściwe podejście do obsługi tego byłoby albo zmieniać wartości początkowe po tym zdarzeniu, albo zmienić wielomian.źródło
|1<2=s a#(s$s b)
|c<-s b=s a#s c
myślę, że można je zastąpić :) (też: dlaczego nie opublikujesz linku do TIO ?)abs
, ponieważb
zawsze jest to nieujemne. (Być może miałeś na myśliabs$b-a
, alegcd
akceptujesz negatywne argumenty i zawsze daje to wynik nieujemny.) To sprowadza to do mniej niż połowy tweeta!Pari / GP , 137 bajtów, ~ 5 sekund
Korzystanie z wbudowanych operacji GP krzywej eliptycznej (i niektórych niedostosowanych dostrajania parametrów) :
ecm
jest funkcją, która (powinna) zwrócić czynnik. Wypróbuj online!Test:
Nie golfowany:
Niestety obsługa współczynników 2 i 3 wymaga wielu bajtów. Bajty, które mogły zostać użyte do dodania etapu 2:
źródło
Aksjomat, 137 bajtów 9 minut
powyżej funkcji p (), która implementowałaby algorytm p-1 do faktorowania poniżej tego, co należy skopiować do pliku w celu przetestowania na funkcji p ()
wyniki tutaj:
źródło
Aksjomat, 10 minut + 31 sekund
z () to funkcja rho, jedna funkcja 137 bajtów; ungolfed z () i nazwij go rho (). Zakłada się, że gcd (0, n) = n, więc pętla zatrzyma się i powróci do błędu n.
wyniki (z () są poprawne dla wszystkich oprócz ostatniego numeru 1751952685614616185916001760791655006749 nie są uwzględniane (10 minut))
źródło
Python 3 ,
10099 bajtów,45 4039 sekund + 10 minut karyWypróbuj online!
Używa Pollard-Rho z wartością początkową 2 i wielomianem x ^ 2 + 1.
źródło
pow
(z trzecim argumentem), aby poprawić szybkość wykonywania.