Ważne linki tutaj i tutaj , ale oto krótka wersja:
Masz wejście dwóch liczb całkowitych a
i b
między ujemną nieskończonością a nieskończonością (chociaż w razie potrzeby mogę ograniczyć zakres, ale funkcja musi nadal akceptować ujemne dane wejściowe).
Definicja symbolu Kronecker
Musisz zwrócić symbol Kronecker (a|b)
dla danych wejściowych a
i b
gdzie
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
gdzie b = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
i p_i
i e_i
są liczbami pierwszymi i wykładnikami w rozkładzie liczb pierwszych na b
.
Dla nieparzystej liczby pierwszej p
, (a|p)=a^((p-1)/2) (mod p)
jak zdefiniowano tutaj .
dla b == 2
,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
dla b == -1
,(n|-1)={-1 for n<0; 1 for n>0
W przypadku a >= b
, (a|b) == (z|b)
w którym z == a % b
. Ta właściwość, jak wyjaśniono tu i tutaj , a
jest kwadratową pozostałością b
if z
, chociaż a >= b
.
(-1|b)
= 1
jeśli b == 0,1,2 (mod 4)
i -1
jeśli b == 3 (mod 4)
. (0|b)
jest 0
wyjątkiem (0|1)
, który jest 1
, bo (a|1)
jest zawsze 1
i dla negatywu a
, (-a|b) == (-1|b) * (a|b)
.
Dane wyjściowe symbolu Kronecker są zawsze -1, 0 or 1
, gdzie dane wyjściowe są, 0
jeśli a
i b
mają jakieś wspólne czynniki. If b
jest nieparzystą liczbą pierwszą, (a|b) == 1
jeśli a
jest kwadratowym modem pozostałościb
, a -1
jeśli nie jest kwadratowym reszty.
Zasady
Twój kod musi być programem lub funkcją.
Dane wejściowe muszą być w kolejności
a b
.Dane wyjściowe muszą być albo
-1
,0
albo1
.To jest kod golfowy, więc twój kod nie musi być wydajny, tylko krótki.
Brak wbudowanych funkcji, które bezpośrednio obliczają Kronecker lub powiązane symbole Jacobi i Legendre. Inne wbudowane elementy (na przykład w przypadku pierwszej faktoryzacji) to uczciwa gra.
Przykłady
>>> kronecker(1, 5)
1
>>> kronecker(3, 8)
-1
>>> kronecker(15, 22)
1
>>> kronecker(21, 7)
0
>>> kronecker(5, 31)
1
>>> kronecker(31, 5)
1
>>> kronecker(7, 19)
1
>>> kronecker(19, 7)
-1
>>> kronecker(323, 455625)
1
>>> kronecker(0, 12)
0
>>> kronecker(0, 1)
1
>>> kronecker(12, 0)
0
>>> kronecker(1, 0)
1
>>> kronecker(-1, 5)
1
>>> kronecker(1, -5)
1
>>> kronecker(-1, -5)
-1
>>> kronecker(6, 7)
-1
>>> kronecker(-1, -7)
1
>>> kronecker(-6, -7)
-1
Jest to skomplikowana funkcja, więc daj mi znać, jeśli coś jest niejasne.
źródło
Odpowiedzi:
CJam (70 bajtów)
Demo online (przypadki testowe wygenerowane za pomocą Mathematica).
Sekcja
Znalazłem kilka sposobów oceniania
(a|2)
dla tej samej liczby znaków i zdecydowałem się użyć tego z najczystszą prezentacją.integer array <W=
jest IMO dość eleganckim sposobem na wykonywanie awarii: jeśli liczba całkowita jest większa niż długość tablicy, wybieramy ostatni element.Inne komentarze
Rozczarowuje fakt , że w przypadku liczby nieparzystej
p
bezpośredni styl Fermata(a|p)
jest tak krótki, ponieważ istnieje bardzo golfowy sposób na znalezienie(a|n)
dodatniej liczby nieparzystej, zn
której chciałem skorzystać. Podstawą jest lemat Zolotareva:Zostało to wzmocnione przez Frobeniusa do
i przez Lerch do
Patrz Brunyate i Clark, Rozszerzanie podejścia Zolotareva -Frobeniusa do kwadratowej wzajemności , The Ramanujan Journal 37.1 (2014): 25-50 w celach informacyjnych.
I można to z łatwością wzmocnić o krok dalej (chociaż nie widziałem tego w literaturze) do
Dowód: jeśli
a
jest to prawo autorskie,b
wówczas używamy Zolotarev-Frobenius-Lerch; w przeciwnym razie mapa nie jest permutacją, a symbol Levi-Civita jest odpowiedni0
.Daje to obliczenie symbolu Jacobi
Ale specjalne traktowanie wymagane
(a|-1)
i(a|2)
oznacza, że nie znalazłem sposobu na obliczenie symbolu Kroneckera, który byłby krótszy przy takim podejściu: krótszy jest faktoryzować liczby pierwsze i traktować je indywidualnie.źródło
Python 3,
747369335 bajtówJako przykładowa odpowiedź, tylko lekko golfa, i dać ci wyobrażenie, jak będzie wyglądać odpowiedź.
I tak, główne czynniki i bity kodujące długość przebiegu są kopiowane z Pytha z przeprosinami do isaacga .
źródło
Mathematica,
169175165 bajtówźródło
LabVIEW, 44 bajty Prymitywy LabVIEW
Ponieważ jest symetryczny, zamieniłem wejścia, jeśli a było większe niż b.Reprezentuje teraz prawdziwą formułę
liczenie jak zawsze według
w prawdziwym przypadku
źródło
(a|b) != (b|a)
we wszystkich przypadkach. W większości przypadków tak, ale nie we wszystkich. Chociaż zadziałałoby, gdybyś je zmniejszyła mod b
zamiast zamienić.Julia, 195 bajtów
Jest to funkcja rekurencyjna,
k
która akceptuje dwie liczby całkowite i zwraca liczbę całkowitą.Nie golfowany:
źródło
Haskell, 286 bajtów
Prawdopodobnie nie do końca zoptymalizowany, ale dzielny wysiłek. Symbol Kroneckera jest zdefiniowany jako funkcja infix a # b, tj
źródło