Rilevanti collegamenti qui e qui , ma ecco la versione breve:
Hai un input di due numeri interi a
e b
tra infinito negativo e infinito (anche se se necessario, posso limitare l'intervallo, ma la funzione deve comunque accettare input negativi).
Definizione del simbolo di Kronecker
È necessario restituire il simbolo Kronecker (a|b)
per gli input a
e b
dove
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
dove b = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
, ed p_i
e e_i
sono i numeri primi e gli esponenti nella fattorizzazione primaria di b
.
Per uno strano numero primo p
, (a|p)=a^((p-1)/2) (mod p)
come definito qui .
Per b == 2
,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
Per b == -1
,(n|-1)={-1 for n<0; 1 for n>0
Se a >= b
, (a|b) == (z|b)
dove z == a % b
. Con questa proprietà, e come spiegato qui e qui , a
c'è un residuo quadratico di b
if z
, anche se a >= b
.
(-1|b)
= 1
se b == 0,1,2 (mod 4)
e -1
se b == 3 (mod 4)
. (0|b)
è 0
tranne (0|1)
che è 1
, perché (a|1)
è sempre 1
e per negativo a
, (-a|b) == (-1|b) * (a|b)
.
L'output del simbolo Kronecker è sempre -1, 0 or 1
, dove l'output è 0
se a
e b
ha dei fattori comuni. If b
è un numero primo dispari, (a|b) == 1
if a
è un mod di residuo quadraticob
e -1
se non lo è non è un residuo quadratico.
Regole
Il tuo codice deve essere un programma o una funzione.
Gli ingressi devono essere nell'ordine
a b
.L'output deve essere o
-1
,0
o1
.Questo è il golf del codice, quindi il tuo codice non deve essere efficiente, solo breve.
Nessun built-in che calcola direttamente il Kronecker oi relativi simboli Jacobi e Legendre. Altri built-in (ad esempio per la scomposizione in fattori primi) sono fair game.
Esempi
>>> 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
Questa è una funzione complicata, quindi per favore fatemi sapere se qualcosa non è chiaro.