Relevante Links hier und hier , aber hier ist die Kurzversion:
Sie haben eine Eingabe von zwei ganzen Zahlen a
und b
zwischen negativer Unendlichkeit und Unendlichkeit (obwohl ich bei Bedarf den Bereich einschränken kann, aber die Funktion muss immer noch negative Eingaben akzeptieren).
Definition des Kronecker-Symbols
Sie müssen das Kronecker-Symbol (a|b)
für Eingaben a
und b
wo zurückgeben
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
wo b = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
und p_i
und e_i
sind die Primzahlen und Exponenten in der Primfaktorisierung von b
.
Für eine ungerade Primzahl p
, (a|p)=a^((p-1)/2) (mod p)
wie hier definiert .
Für b == 2
,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
Für b == -1
,(n|-1)={-1 for n<0; 1 for n>0
Wenn a >= b
, (a|b) == (z|b)
wo z == a % b
. Durch diese Eigenschaft und wie hier und hier erklärt , a
ist ein quadratischer Rest von b
if z
is, obwohl a >= b
.
(-1|b)
= 1
wenn b == 0,1,2 (mod 4)
und -1
wenn b == 3 (mod 4)
. (0|b)
ist 0
außer für (0|1)
was ist 1
, weil (a|1)
ist immer 1
und für negativ a
, (-a|b) == (-1|b) * (a|b)
.
Die Ausgabe des Kronecker-Symbols ist immer dort -1, 0 or 1
, wo die Ausgabe ist, 0
wenn a
und b
hat gemeinsame Faktoren. If b
ist eine ungerade Primzahl, (a|b) == 1
if a
ist ein quadratischer Rest mod b
und -1
wenn ist es kein quadratischer Rest.
Regeln
Ihr Code muss ein Programm oder eine Funktion sein.
Die Eingänge müssen in der Reihenfolge sein
a b
.Der Ausgang muss entweder
-1
,0
oder1
.Dies ist Code Golf, daher muss Ihr Code nicht effizient sein, sondern nur kurz.
Keine eingebauten Elemente, die den Kronecker oder die zugehörigen Jacobi- und Legendre-Symbole direkt berechnen. Andere integrierte Funktionen (z. B. zur Primfaktorisierung) sind Freiwild.
Beispiele
>>> 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
Dies ist eine komplizierte Funktion. Bitte lassen Sie mich wissen, wenn etwas unklar ist.
quelle
Antworten:
CJam (70 Bytes)
Online-Demo (mit Mathematica generierte Testfälle).
Präparation
Ich habe verschiedene Möglichkeiten gefunden,
(a|2)
um die gleiche Anzahl von Zeichen zu bewerten , und habe mich für die mit der klarsten Darstellung entschieden.integer array <W=
Ist IMO eine ziemlich elegante Art, Fallbacks zu machen: Wenn die Ganzzahl größer als die Länge des Arrays ist, wählen wir das letzte Element aus.Andere Kommentare
Es ist enttäuschend, dass für ungerade Primzahlen
p
der direkte Fermat-Stil(a|p)
so kurz ist, weil es eine sehr gute Möglichkeit gibt,(a|n)
positive ungerade zu finden,n
die ich verwenden wollte. Die Basis ist Zolotarevs Lemma:Dies wurde von Frobenius zu verstärkt
und von Lerch zu
Siehe Brunyate und Clark, Erweiterung des Zolotarev-Frobenius-Ansatzes auf quadratische Reziprozität , The Ramanujan Journal 37.1 (2014): 25-50 für Referenzen.
Und es kann leicht einen Schritt weiter gestärkt werden (obwohl ich dies in der Literatur nicht gesehen habe)
Beweis: Wenn
a
es Koprime ist, verwendenb
wir Zolotarev-Frobenius-Lerch; Andernfalls ist die Karte keine Permutation, und das Levi-Civita-Symbol ist0
wie gewünscht.Dies ergibt die Jacobi-Symbolberechnung
Die spezielle Behandlung, die für
(a|-1)
und erforderlich ist,(a|2)
bedeutet jedoch, dass ich keinen Weg gefunden habe, das Kronecker-Symbol zu berechnen, das bei diesem Ansatz kürzer ist: Es ist kürzer, die Primzahlen einzeln zu faktorisieren und zu behandeln.quelle
Python 3,
747369335 BytesAls Beispiel Antwort, nur leicht Golf gespielt, und um Ihnen eine Vorstellung davon zu geben, wie eine Antwort aussehen wird.
Und ja, die Primfaktorisierungs- und Lauflängencodierungsbits werden von Pyth mit Entschuldigungen an isaacg abgeschnitten .
quelle
Mathematica,
169175165 Bytesquelle
LabVIEW, 44 Bytes LabVIEW-Grundelemente
Da es symmetrisch ist, habe ich die Eingänge getauscht, wenn a größer als b war.Repräsentiert jetzt die reale Formel
zählen wie immer nach
für den wahren Fall
quelle
(a|b) != (b|a)
in allen Fällen. In den meisten Fällen ja, aber nicht in allen. Obwohl es funktionieren würde, wenn Sie reduzieren,a mod b
anstatt sie zu tauschen.Julia, 195 Bytes
Dies ist eine rekursive Funktion
k
, die zwei Ganzzahlen akzeptiert und eine Ganzzahl zurückgibt.Ungolfed:
quelle
Haskell, 286 Bytes
Wahrscheinlich nicht vollständig optimiert, aber eine tapfere Anstrengung. Das Kronecker-Symbol ist definiert als die Infix-Funktion a # b, dh
quelle