Відповідні посилання тут і тут , але ось коротка версія:
У вас є вхід двох цілих чисел a
і b
між негативною нескінченністю та нескінченністю (хоча за потреби я можу обмежити діапазон, але функція все одно повинна приймати негативні введення).
Визначення символу Kronecker
Ви повинні повернути символ Kronecker (a|b)
для входів a
і b
куди
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
де b = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
і p_i
і e_i
є простими елементами та експонентами в основній факторизації b
.
Для непарного розквіту p
, (a|p)=a^((p-1)/2) (mod p)
як визначено тут .
для b == 2
,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
для b == -1
,(n|-1)={-1 for n<0; 1 for n>0
Якщо a >= b
, (a|b) == (z|b)
де z == a % b
. За цією властивістю, як пояснено тут і тут , a
є квадратичним залишком, b
якщо z
є, хоча a >= b
.
(-1|b)
= 1
якщо b == 0,1,2 (mod 4)
і -1
якщо b == 3 (mod 4)
. (0|b)
є , 0
за винятком (0|1)
що 1
, тому що (a|1)
завжди 1
і для негативних a
, (-a|b) == (-1|b) * (a|b)
.
Вихід символу Kronecker завжди -1, 0 or 1
, де вихід є, 0
якщо a
і b
є якісь загальні фактори. Якщо b
є непарне просте, (a|b) == 1
якщо a
є квадратичним залишком мода b
, і -1
якщо це не квадратичний залишок.
Правила
Ваш код повинен бути програмою або функцією.
Входи повинні бути в порядку
a b
.Вихід повинен бути або
-1
,0
або1
.Це кодовий гольф, тому ваш код не повинен бути ефективним, просто коротким.
Немає вбудованих модулів, які безпосередньо обчислюють Kronecker або пов'язані з ними символи Jacobi та Legendre. Інші вбудовані модулі (наприклад, для основної факторизації) - це чесна гра.
Приклади
>>> 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
Це складна функція, тому, будь ласка, повідомте мене, якщо щось незрозуміле.