Соответствующие ссылки здесь и здесь , но вот краткая версия:
У вас есть входные данные двух целых чисел a
и b
между отрицательной бесконечностью и бесконечностью (хотя при необходимости я могу ограничить диапазон, но функция все равно должна принимать отрицательные входные данные).
Определение символа Кронекера
Вы должны вернуть символ Кронекера (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
if 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)
.
Вывод символа Кронекера всегда -1, 0 or 1
, где вывод, 0
если a
и b
имеют какие-либо общие факторы. If b
- нечетное простое число, (a|b) == 1
if a
- квадратичный вычет mod b
, а -1
if - это не квадратичный вычет.
правила
Ваш код должен быть программой или функцией.
Входы должны быть в порядке
a b
.Выход должен быть либо
-1
,0
либо1
.Это кодовый гольф, поэтому ваш код не обязательно должен быть эффективным, просто коротким.
Нет встроенных модулей, которые напрямую вычисляют Кронекера или связанные символы Якоби и Лежандра. Другие встроенные модули (например, для первичной факторизации) являются честной игрой.
Примеры
>>> 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
Это сложная функция, поэтому, пожалуйста, дайте мне знать, если что-то неясно.