文章目录
一、介绍
1.定义
当存在某个
x
x
x,可以使得式子
x
2
≡
n
(
m
o
d
x^2≡n(mod
x2≡n(mod
p
)
p)
p)成立时,称“n是模p的二次剩余”;
当对任意x不成立时,称“n是模 p的二次非剩余”。
例如,满足模11的二次剩余的数有:
1
,
3
,
4
,
5
,
6
1,3,4,5,6
1,3,4,5,6
模11二次非剩余的数有:
2
,
6
,
7
,
8
,
10
2,6,7,8,10
2,6,7,8,10
至于 0 0 0,即不是二次剩余也不是二次非剩余。
2.定理
对于方程 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p),如果 p p p是一个奇质数(即 p p p为大于2的质数),那么在集合 { 1 , 2 , … , p − 1 } \{1,2,…,p-1\} {1,2,…,p−1}中,有 p − 1 2 \frac{p-1}{2} 2p−1个数满足模 p p p的二次剩余,剩下的 p − 1 2 \frac{p-1}{2} 2p−1个数为模 p p p的二次非剩余。
证明:
第一步:对于任何一个整数 X X X来说, X 2 % p X^2\%p X2%p都可以写为: x 2 % p ( x ∈ { 1 , 2 , … , p − 1 } ) x^2\%p(x \in \{1,2,…,p-1 \}) x2%p(x∈{1,2,…,p−1})
X
=
k
∗
p
+
x
X=k*p+x
X=k∗p+x
X
2
%
p
=
(
k
∗
p
+
x
)
2
%
p
⇒
x
2
%
p
X^2\%p=(k*p+x)^2\%p\Rightarrow x^2\%p
X2%p=(k∗p+x)2%p⇒x2%p
第二步:证明 x 2 x^2 x2与 ( p − x ) 2 (p-x)^2 (p−x)2在模 p p p条件下同余
将
(
p
−
x
)
2
(p-x)^2
(p−x)2进行展开得到
(
p
2
−
2
p
x
+
x
2
)
(p^2-2px+x^2)
(p2−2px+x2),再对
p
p
p取模,得到
x
2
x^2
x2
证毕。
第三步:证明在
{
1
,
2
,
…
,
p
−
1
2
}
\{1,2,…,\frac{p-1}{2} \}
{1,2,…,2p−1}中,不同的
x
x
x所对应
x
2
x^2
x2对p取模的结果不同
反证法:若存在不同的
x
x
x,
y
y
y处于集合中,且
x
2
≡
y
2
(
m
o
d
x^2≡y^2(mod
x2≡y2(mod
p
)
p)
p)
那么就推出
p
∣
(
x
2
−
y
2
)
⇒
p
∣
(
x
−
y
)
(
x
+
y
)
p|(x^2-y^2)\Rightarrow p|(x-y)(x+y)
p∣(x2−y2)⇒p∣(x−y)(x+y)
由于
(
x
+
y
)
<
p
(x+y)<p
(x+y)<p,这个式子成立的唯一可能就是
x
=
=
y
x==y
x==y,与条件相矛盾。
证毕。
由上方的三个证明可以得知,前 p − 1 2 \frac{p-1}{2} 2p−1个数对应 x 2 x^2 x2对p取模的结果与后 p − 1 2 \frac{p-1}{2} 2p−1个数相同,而且,前 p − 1 2 \frac{p-1}{2} 2p−1个数对应 x 2 x^2 x2对p取模的结果各自不同,说明集合 { 1 , 2 , … , p − 1 } ) \{1,2,…,p-1 \}) {1,2,…,p−1})对应的 x 2 x^2 x2对p取模的结果有 p − 1 2 \frac{p-1}{2} 2p−1个,再结合证明一,进行推广,所有整数对应的 x 2 x^2 x2对p取模的结果有 p − 1 2 \frac{p-1}{2} 2p−1个
也就是在集合 { 1 , 2 , … , p − 1 } \{1,2,…,p-1\} {1,2,…,p−1}中,有 p − 1 2 \frac{p-1}{2} 2p−1个数满足模 p p p的二次剩余,剩下的 p − 1 2 \frac{p-1}{2} 2p−1个数为模 p p p的二次非剩余。
二、判别
1.勒让德符号(Legendre Symbol)
如果
p
p
p是一个奇质数,
a
a
a是一个整数,可以使用
(
a
p
)
(\frac{a}{p})
(pa)来表示
a
a
a是否为模
p
p
p二次剩余,或者是既不是二次剩余,也不是二次非剩余。
2.欧拉判别准则(Euler’s criterion)
(1)内容
如果
p
p
p是一个奇质数,
a
a
a是一个整数此时存在等式:
(
a
p
)
=
a
p
−
1
2
(
m
o
d
(\frac{a}{p})=a^{\frac{p-1}{2}}(mod
(pa)=a2p−1(mod
p
)
p)
p)
(2)证明
1. 若
(
a
p
)
=
0
(\frac{a}{p})=0
(pa)=0
a
=
k
p
⇒
a
p
−
1
2
=
(
k
p
)
p
−
1
2
a=kp\Rightarrow a^{\frac{p-1}{2}}=(kp)^{\frac{p-1}{2}}
a=kp⇒a2p−1=(kp)2p−1
(
k
p
)
p
−
1
2
≡
0
(
m
o
d
(kp)^{\frac{p-1}{2}}≡0(mod
(kp)2p−1≡0(mod
p
)
p)
p)
所以此时
a
p
−
1
2
=
0
=
(
a
p
)
a^{\frac{p-1}{2}}=0=(\frac{a}{p})
a2p−1=0=(pa)
2. 若
(
a
p
)
=
1
(\frac{a}{p})=1
(pa)=1
a
a
a与
x
2
x^2
x2同余,而且
x
∈
{
1
,
2
,
…
,
p
−
1
}
x\in\{1,2,…,p-1\}
x∈{1,2,…,p−1},
由于
x
x
x与
p
p
p互质,根据费马小定理,可知:
x
p
−
1
≡
1
(
m
o
d
x^{p-1}≡1(mod
xp−1≡1(mod
p
)
p)
p)
⇒
(
x
2
)
p
−
1
2
≡
1
(
m
o
d
\Rightarrow (x^2)^{\frac{p-1}{2}}≡1(mod
⇒(x2)2p−1≡1(mod
p
)
=
(
a
p
)
p)=(\frac{a}{p})
p)=(pa)
3. 若
(
a
p
)
=
−
1
(\frac{a}{p})=-1
(pa)=−1
此时
a
a
a与
i
∗
j
i*j
i∗j同余,且
i
≠
j
,
i
、
j
∈
{
1
,
2
,
…
,
p
−
1
}
i\neq j,i、j\in\{1,2,…,p-1\}
i=j,i、j∈{1,2,…,p−1}
i
∗
j
≡
a
(
m
o
d
i*j≡a(mod
i∗j≡a(mod
p
)
p)
p)
⇒
i
≡
a
∗
j
−
1
(
m
o
d
\Rightarrow i≡a*j^{-1}(mod
⇒i≡a∗j−1(mod
p
)
p)
p)
第一步证明不同的 i i i所对应的 j j j是不同的。
反证法:若存在
由
于
I
≡
a
∗
j
−
1
(
m
o
d
由于I≡a*j^{-1}(mod
由于I≡a∗j−1(mod
p
)
p)
p)与
i
≡
a
∗
j
−
1
(
m
o
d
i≡a*j^{-1}(mod
i≡a∗j−1(mod
p
)
p)
p)
则可以写为:
I
−
i
=
k
p
I-i=kp
I−i=kp
由于
i
、
I
∈
{
1
,
2
,
…
,
p
−
1
}
i、I\in\{1,2,…,p-1\}
i、I∈{1,2,…,p−1}
唯有
i
=
=
I
i==I
i==I时,才会成立,产生矛盾。
证毕。
第二步证明 a p − 1 2 = ( p − 1 ) ! a^{\frac{p-1}{2}}=(p-1)! a2p−1=(p−1)!
可以将集合 { 1 , 2 , … , p − 1 } \{1,2,…,p-1\} {1,2,…,p−1}内的 p − 1 p-1 p−1个数分为 p − 1 2 \frac{p-1}{2} 2p−1组,每组里面的两个数的积与 a a a同余,所以 ( p − 1 ) ! (p-1)! (p−1)!即 a p − 1 2 a^{\frac{p-1}{2}} a2p−1.
根据威尔逊定理:p 是质数的充要条件为
(
p
−
1
)
!
≡
−
1
(
m
o
d
(p−1)! ≡ −1 (mod
(p−1)!≡−1(mod
p
)
p)
p)
此时可以得到:
a
p
−
1
2
=
(
p
−
1
)
!
≡
−
1
(
m
o
d
a^{\frac{p-1}{2}}=(p-1)!≡ −1 (mod
a2p−1=(p−1)!≡−1(mod
p
)
p)
p)
(3)注意
以算法实现时,直接计算
a
p
−
1
2
a^{\frac{p-1}{2}}
a2p−1模
p
p
p的结果将得到
p
−
1
p-1
p−1,所以也可以表示为:
a
p
−
1
2
%
p
=
{
1
(
a
p
)
=
1
p
−
1
(
a
p
)
=
−
1
0
(
a
p
)
=
0
a^{\frac{p-1}{2}}\%p=\begin{cases} 1 & (\frac{a}{p})=1\\ p-1 & (\frac{a}{p})=-1 \\ 0 & (\frac{a}{p})=0 \\ \end{cases}
a2p−1%p=⎩⎪⎨⎪⎧1p−10(pa)=1(pa)=−1(pa)=0
三、 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p)——奇波拉算法(Cipolla’s algorithm)
求解方程 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p)
1.操作
(1)先利用欧拉判别准则判断 n n n是否满足对模 p p p二次剩余,若满足进行下一操作,若不满足,则结束。
(2) 通过随机试错的方法从集合 { 0 , 1 , 2 , . . . , p − 1 } \{0,1,2,...,p-1\} {0,1,2,...,p−1}中找到一个 a a a,且 a 2 − n a^2-n a2−n满足模 p p p的二次非剩余,即 ( a 2 − n p ) = = − 1 (\frac{a^2-n}{p})==-1 (pa2−n)==−1
(3) x = ( a + a 2 − n ) p + 1 2 x=(a+\sqrt{a^2-n})^{\frac{p+1}{2}} x=(a+a2−n)2p+1就是一个解,由于 x 2 x^2 x2与 ( p − x ) 2 (p-x)^2 (p−x)2同余,所以还有第二个解 ( p − x ) (p-x) (p−x)
2.证明 x = ( a + a 2 − n ) p + 1 2 x=(a+\sqrt{a^2-n})^{\frac{p+1}{2}} x=(a+a2−n)2p+1为解
大佬的证明
重点在于将上方的定理推导到复数域中。
四、模板题
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL quick_mod(LL a, LL b, LL m)
{
LL ans = 1;
a %= m;
while(b)
{
if(b & 1)
{
ans = ans * a % m;
b--;
}
b >>= 1;
a = a * a % m;
}
return ans;
}
struct T
{
LL p, d;
};
LL w;
//二次域乘法
T multi_er(T a, T b, LL m)
{
T ans;
ans.p = (a.p * b.p % m + a.d * b.d % m * w % m) % m;
ans.d = (a.p * b.d % m + a.d * b.p % m) % m;
return ans;
}
//二次域上快速幂
T power(T a, LL b, LL m)
{
T ans;
ans.p = 1;
ans.d = 0;
while(b)
{
if(b & 1)
{
ans = multi_er(ans, a, m);
b--;
}
b >>= 1;
a = multi_er(a, a, m);
}
return ans;
}
//求勒让德符号
LL Legendre(LL a, LL p)
{
return quick_mod(a, (p-1)>>1, p);
}
LL mod(LL a, LL m){
a %= m;
if(a < 0) a += m;
return a;
}
LL Solve(LL n,LL p){
if(p == 2) return 1;
if (Legendre(n, p) + 1 == p)//为二次非剩余
return -1;
LL a = -1, t;
while(true){
a = rand() % p;
t = a * a - n;
w = mod(t, p);
if(Legendre(w, p) + 1 == p) break;
}
T tmp;
tmp.p = a;
tmp.d = 1;
T ans = power(tmp, (p + 1)>>1, p);
return ans.p;
}
int main(){
int t;
cin>>t;
while(t--){
int n, p;
cin>>n>>p;
n%=p;
int a = Solve(n, p);
if(a == -1){
cout<<"Hola!"<<endl;
continue;
}
int b = p - a;
if(a > b) swap(a, b);
if(a == b)
cout<<a<<endl;
else
cout<<a<<" "<<b<<endl;
}
return 0;
}
五、 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p k ) p^k) pk)(gcd(x,p)=1,p为奇质数)
先解同余式 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p)
设解为
r
r
r,即
r
2
≡
n
(
m
o
d
r^2≡n(mod
r2≡n(mod
p
)
p)
p)
转化可得:
r
2
−
n
=
m
p
r^2-n=mp
r2−n=mp
⇒
(
r
2
−
n
)
k
=
(
m
p
)
k
\Rightarrow (r^2-n)^k=(mp)^k
⇒(r2−n)k=(mp)k
用 w w w表示 n \sqrt{n} n
上式就变为了 ( r + w ) k ( r − w ) k = ( m p ) k (r+w)^k(r-w)^k=(mp)^k (r+w)k(r−w)k=(mp)k
进行二项式展开,
(
r
+
w
)
k
=
C
k
0
r
k
+
C
k
1
r
k
−
1
w
.
.
.
+
C
k
k
−
1
r
w
k
−
1
+
C
k
k
w
k
⇒
t
+
u
∗
w
(r+w)^k=C_k^0r^k+C_k^1r^{k-1}w...+C_k^{k-1}rw^{k-1}+C_k^kw^k\Rightarrow t+u*w
(r+w)k=Ck0rk+Ck1rk−1w...+Ckk−1rwk−1+Ckkwk⇒t+u∗w
(
r
−
w
)
k
=
C
k
0
r
k
+
C
k
1
r
k
−
1
(
−
w
)
.
.
.
+
C
k
k
−
1
r
(
−
w
)
k
−
1
+
C
k
k
(
−
w
)
k
⇒
t
−
u
∗
w
(r-w)^k=C_k^0r^k+C_k^1r^{k-1}(-w)...+C_k^{k-1}r(-w)^{k-1}+C_k^k(-w)^k\Rightarrow t-u*w
(r−w)k=Ck0rk+Ck1rk−1(−w)...+Ckk−1r(−w)k−1+Ckk(−w)k⇒t−u∗w
仅当 ( − w ) (-w) (−w)的次数为偶次时才会作用于 t t t,此时负号相抵消,故两式能够构成一个平方差的形式。
上式就变为了
t
2
−
u
2
∗
n
=
(
m
p
)
k
t^2-u^2*n=(mp)^k
t2−u2∗n=(mp)k
即
t
2
−
u
2
∗
n
≡
0
(
m
o
d
t^2-u^2*n≡0(mod
t2−u2∗n≡0(mod
p
k
)
p^k)
pk)
处理得 t 2 ≡ u 2 n ( m o d t^2≡u^2n(mod t2≡u2n(mod p ) p) p)
通过二项式展开的式子,有 g c d ( p , u ) = = 1 gcd(p,u)==1 gcd(p,u)==1(暂未证明,待补充)
通过消去律,可以得到:
t
2
(
u
−
1
)
2
≡
n
(
m
o
d
t^2(u^{-1})^2≡n(mod
t2(u−1)2≡n(mod
p
)
p)
p)
通过求逆元的方法可以求出
u
−
1
u^{-1}
u−1
此时得出了第一个解
x
=
t
∗
i
n
v
(
u
)
(
m
o
d
x=t*inv(u)(mod
x=t∗inv(u)(mod
p
k
)
p^k)
pk)
再根据之前的同余关系
x
2
≡
(
p
−
x
)
2
(
m
o
d
x^2≡(p-x)^2(mod
x2≡(p−x)2(mod
p
)
p)
p)
所以还有第二个解
(
p
k
−
t
∗
i
n
v
(
u
)
)
(
m
o
d
(p^k-t*inv(u))(mod
(pk−t∗inv(u))(mod
p
k
)
p^k)
pk)
例:求方程 x 2 ≡ 13 ( m o d x^2≡13(mod x2≡13(mod 27 ) 27) 27)的解
可以求出
t
=
40
,
u
=
16
,
i
n
v
(
u
)
=
22
t=40,u=16,inv(u)=22
t=40,u=16,inv(u)=22
所以第一个解为
t
∗
i
n
v
(
u
)
=
(
40
∗
22
)
%
27
=
16
t*inv(u)=(40*22)\%27=16
t∗inv(u)=(40∗22)%27=16
第二个解就是
p
k
−
x
=
27
−
16
=
11
p^k-x=27-16=11
pk−x=27−16=11
为了方便理解,也可以写为 x ≡ ± 11 ( m o d x≡\pm11(mod x≡±11(mod 27 ) 27) 27)