Wprowadzenie
W teorii liczb mówimy, że liczba jest gładka, gdy wszystkie jej czynniki pierwsze wynoszą co najwyżej . Na przykład 2940 jest 7-gładki, ponieważ .
Tutaj definiujemy parę smooth jako dwie kolejne liczby całkowite, z których obie są smooth. Przykładem 7-gładkiej pary będzie ponieważ i . Ciekawostka: to właściwie największa 7-gładka para .
Størmer udowodnił w 1897 r., Że dla każdego istnieje tylko skończenie wiele par gładkich , a fakt ten znany jest jako Twierdzenie Størmera .
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która, biorąc pod uwagę liczbę podstawową , wypisuje lub zwraca wszystkie pary gładkich bez duplikowania (kolejność w parze nie ma znaczenia) w dowolnej kolejności.
Należy zauważyć, że dla liczb pierwszych i , przy założeniu, że , wszystkie pary gładkie są również parami gładkimi.
Próbki we / wy
Input: 2
Output: (1, 2)
Input: 3
Output: (1, 2), (2, 3), (3, 4), (8, 9)
Input: 5
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (8, 9), (9, 10), (15, 16), (24, 25), (80, 81)
Input: 7
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (14, 15),
(15, 16), (20, 21), (24, 25), (27, 28), (35, 36), (48, 49), (49, 50), (63, 64),
(80, 81), (125, 126), (224, 225), (2400, 2401), (4374, 4375)
Ograniczenie
Program lub funkcja powinny teoretycznie zakończyć się w skończonym czasie dla wszystkich danych wejściowych. Standardowe luki są domyślnie niedozwolone.
Zwycięskie kryteria
Ponieważ jest to wyzwanie związane z golfem , wygrywa najkrótszy ważny zgłoszenie dla każdego języka.
źródło
(1, 2)
części produkcji jest obowiązkowe?(1, 2)
parę.Odpowiedzi:
JavaScript (ES7),
234232 bajtyZnajduje rozwiązania, rozwiązując równania Pell w postaci , gdzie jest liczbą gładką kwadratową.x2)- 2 qy2)= 1 q P.
Jest to implementacja procedury Derricka Henry'ego Lehmera , wywodząca się z oryginalnej procedury Størmera.
Zwraca obiekt, którego klucze i wartości opisują pary gładkie.P.
Wypróbuj online!
W jaki sposób?
W funkcji pomocnika sprawdza, czy dany całkowita jest liczba -smooth gdy jest wywołana , lub kwadratowy wolny 1 liczba -smooth gdy jest wywoływana z .s n P. i = 0 P i = 1 P. i = 1
Szukamy wszystkich wolnych od kwadratów liczb 1 gładkich w , gdzie jest używane jako górna granica dla.P. [ 1 .. PP.- 1 ] P.P. P.!
Dla każdej liczby znalezionej powyżej szukamy podstawowego rozwiązania równania Pell :n x2)- n y2)= 1
(powyższy kod jest nierekurencyjną wersją mojej odpowiedzi na to inne wyzwanie )
Po znalezieniu podstawowego rozwiązania obliczamy rozwiązania pomocą , używając relacji powtarzalności:(x1, y1) (xk, yk) k ≤ m a x ( 3 , ( P+ 1 ) / 2 )
Dla każdego sprawdzamy, czy jest nieparzyste i oba i są gładkie. Jeśli tak, przechowujemy je w obiekcie .xk xk ( xk- 1 ) / 2 ( xk+ 1 ) / 2 P r
1: Ponieważ nie testuje pierwotności dzielników, funkcja będzie faktycznie prawdziwa dla niektórych niekwadratowych liczb swobodnych, nawet jeśli zostanie wywołana z . Chodzi o to, aby odfiltrować większość z nich, aby rozwiązać zbyt wiele bezużytecznych równań Pell.s i=1
źródło
x = ~-x / 2
i.-~P / 2
Czy są to jakieś zaokrąglenia ...~x
to bitowe NIE, które oblicza-(x+1)
. Dlatego~-x
jest-(-x+1)
=x-1
i-~x
jest-(-(x+1))
=x+1
. Podobnie jak wszystkie operacje bitowe w JS, uwzględniana jest tylko 32-bitowa część całkowita. Dlatego mogą być rzeczywiście używane do zaokrąglania. Ale zarówno jak i są już tutaj liczbami całkowitymi. P.Galaretka ,
1614 bajtówWypróbuj online!
Sprawdza pary do co jest nieefektywne dla większych ale powinno zapewnić, że żadna nie zostanie pominięta.4k k
Dzięki @JonathanAllan za uratowanie 1 bajtu!
Wyjaśnienie
źródło
05AB1E , 8 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Galaretka , 123 bajty
Wypróbuj online!
Pełny program, który pobiera pojedynczy argument, i zwraca listę list par. Powyższy kod nie sortuje ostatecznego wyniku, ale robi to łącze TIO.k
źródło
Haskell ,
118107 bajtów-11 bajtów dzięki nim
Wypróbuj online!
q n
oblicza listę wszystkich czynników pierwszychn
f k
generuje listę par gładkich dla danego k, filtrując listę wszystkich parźródło
[2..n]
wewnątrzp
i na nim inlineq
. Wypróbuj online!Galaretka , 24 bajty
Wypróbuj online!
Zajmuje to dużo czasu dla 7, ale oblicza się znacznie szybciej, jeśli usuniesz kwadrat silni: Wypróbuj online!
Wyjaśnienie:
-3 bajty dzięki @JonathanAllen
źródło
(8,9)
k!
(z wyjątkiem 3, która ma niewielką silnię, ponieważ jest małą liczbą).Python 3 + sympy, 116 bajtów
Wypróbuj online!
Python 3 + sympy, 111 bajtów
Wypróbuj online!
Dwie odmiany mojej odpowiedzi na żelki, ale w Pythonie 3. Obie definiują funkcję, która przyjmuje argument
k
. Pierwszy zwraca listę krotek par, które spełniają kryteria. Drugi drukuje je na standardowe wyjście.źródło
Wolfram Language (Mathematica) , 241 bajtów
używa równań Pell
Wypróbuj online!
źródło
Pyth , 15 bajtów
Wypróbuj online!
Wykorzystuje obserwację Nicka Kennedy'ego, że żadna liczba wyjściowa nie będzie większa niż
4^k
.źródło
05AB1E , 16 bajtów
Wyjaśnienie:
źródło
Stax , 14 bajtów
Uruchom i debuguj
To nie jest najkrótszy możliwy program, ale zaczyna generować dane wyjściowe, gdy tylko zostaną znalezione pasujące pary. Kończy się ostatecznie , ale dane wyjściowe są wytwarzane w miarę ich znajdowania.
źródło
Rubinowy , 89 + 8 = 97 bajtów
-rprime
[i, i+1]
false
false
Wypróbuj online!
źródło