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


