您有两个整数的输入,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
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)
。
Kronecker符号-1, 0 or 1
的输出始终为,其中输出0
if a
和b
具有任何公因子。如果b
是奇素数,(a|b) == 1
如果a
是二次余数 MOD 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
这是一个复杂的功能,所以如果有任何不清楚的地方,请告诉我。