Legendre符号系统
定义
用于判定模p平方剩余
设p是素数,a是整数,legendre符号定义为
(
a
p
)
=
{
1
,
若a是模p的平方剩余
−
1
,
若a是模p的平方非剩余
0
,
若p|a
(\frac{a}{p}) = \begin{cases} 1&,\text{若a是模p的平方剩余}\\ -1&,\text{若a是模p的平方非剩余}\\ 0&,\text{若p|a} \end{cases}
(pa)=⎩⎪⎨⎪⎧1−10,若a是模p的平方剩余,若a是模p的平方非剩余,若p|a
判定
-
Euler判定法制
设P是奇素数,则对于任意整数a,有
( a p ) = a p − 1 2 ( m o d p ) (\frac ap )= a^{\frac {p-1}2}(mod \quad p) (pa)=a2p−1(modp)
使用模重复平方运算可快速判断
-
推论
- ( 1 p ) = 1 (\frac 1p) = 1 (p1)=1
- ( − 1 p ) = ( − 1 ) p − 1 2 (\frac {-1}p ) = (-1)^{\frac {p-1}2} (p−1)=(−1)2p−1
-
定理
p是奇素数
- ( a p ) = ( a + k p p ) (\frac ap) = (\frac{a+kp}{p}) (pa)=(pa+kp)
- ( a b p ) = ( a p ) ( b p ) (\frac{ab}{p}) = (\frac ap)(\frac bp) (pab)=(pa)(pb)
- 若(a,p) = 1, 则 ( a 2 p ) = 1 (\frac{a^2}{p}) = 1 (pa2)=1
- ( 2 p ) = ( − 1 ) p 2 − 1 8 (\frac 2p)=(-1)^{\frac {p^2-1}{8}} (p2)=(−1)8p2−1
-
二次互反律
设p,q是互素的奇素数
( q p ) = ( − 1 ) p − 1 2 ∙ q − 1 2 ( p q ) (\frac qp) = (-1)^{\frac {p-1}{2}\bullet \frac{q-1}{2}}(\frac pq) (pq)=(−1)2p−1∙2q−1(qp)
算法实现
def l_fast(a, p):
while a < 0:
a = (a + p) % p
if a == 0:
return 0
if a == 1:
return 1
e = 0
a1 = a
s = 0
while a1 % 2 == 0:
a1 = a1 // 2
e = e + 1
if e % 2 == 0:
s = 1
elif p % 8 == 1 or p % 8 == 7:
s = 1
elif p % 8 == 3 or p % 8 == 5:
s = -1
if p % 4 == 3 and a1 % 4 == 3:
s = -s
if a1 == 1:
return s
return s * l_fast(p % a1, a1)
public class Legendre {
public int L_FAST(int a, int p) {
while (a < 0) a = (a + p) % p;
if (a == 0) return 0;
if (a == 1) return 1;
int e = 0, a1 = a, s = 0;
while (a1 % 2 == 0) {
a1 = a1 / 2;
e++;
}
if (e % 2 == 0) s = 1;
else {
if (p % 8 == 1 || p % 8 == 7) s = 1;
else if (p % 8 == 3 || p % 8 == 5) s = -1;
}
if (p % 4 == 3 && a1 % 4 == 3) s = -s;
if (a1 == 1) return s;
else return s * L_FAST(p % a1, a1);
}
public static void main(String[] args) {
Legendre legendre = new Legendre();
System.out.println(legendre.L_FAST(17, 37));
}
}