版权声明:转载请声明出处,谢谢配合。 https://blog.csdn.net/zxyoi_dreamer/article/details/85195819
什么是二次剩余问题
就是求解形如
x2≡a (mod p)
的关于
x的方程。
下面从不同的模数开始分类讨论解决二次剩余问题的方法
几个定义
如果关于
x的方程
x2≡a (mod p)有解。
称
a是模
p意义下的二次剩余,否则称为模
p意义下的二次非剩余。
为什么会出现二次非剩余,其实很简单。
考虑在
%p意义下本质不同的数只会有
p个。而其中
(−t)2≡t2(mod p),根据抽屉原理,总会有至少
O(2p)的数无法被
t2%p表示出来
勒让德符号(
Legendre symbol):
(pa)=⎩⎪⎨⎪⎧1−10a是%p下的二次剩余a是%p下的二次非剩余a≡0(mod p)
稍后会告诉怎么求勒让德符号。
1.模数为奇质数
首先来考虑
p是奇质数的情况。
解的存在性问题
欧拉准则:
欧拉准则:
(pa)≡a2p−1(mod p)
当
p∣a的时候欧拉准则显然成立。
扫描二维码关注公众号,回复:
4605320 查看本文章
否则由费马小定理我们有
ap−1≡1(mod p)
所以必然有
a2p−1≡±1(mod p)
先证明
(pa)=1的情况
必要性:
当
a是
%p意义下的二次剩余,即
∃x,x2≡a(mod p)
那么我们有
a2p−1≡(x2)2p−1≡xp−1≡1(mod p)
必要性证明完毕
充分性:
设
p有一个原根
g,那么必然有
gi≡a(mod p)
则:
g2i(p−1)≡1(mod p)
由于
g为原根,所以必然会有
(p−1)∣2i(p−1)
即
i是偶数。
必然存在解
x0≡g2i(mod p)
充分性证毕。
那么
(pa)≡−1(mod p)的情况也就十分显然了。
首先由费马小定理
a2p−1≡±1(mod p)
由于前面的欧拉准则在
(pa)=1的必要性,二次非剩余的情况下
x2≡ap−1≡−1(mod p),显然不可能,违反了费马小定理。
求解:
O(log2p)解法:
首先求出
p−1=2ts,
2∤s。
那么我们要求
x2≡a(mod p)
即
a−1x2≡1(mod p)
由欧拉准则
a2p−1≡a2t−1s≡1(mod p)
令
xi表示方程
(a−1xi2)2i≡1(mod p)的根
显然现在有
xt−1=a2s+1,我们要求的就是
x0。
考虑如何从
xq计算出
xq−1
设:
ϵq=a−1xq2
由定义可以得到
ϵq2q≡1(mod p)
则:
ϵq2q−1≡±1(mod p)
如果为
1,直接令
ϵq−1=ϵq,xq−1=xq即可。
否则设
λxq≡xq−1(mod p)
显然有
ϵq−12q−1≡(a−1xq2λ2)2q−1(mod p)
则:
λ2q≡−1(mod p)
找到
%p意义下的任意一个二次非剩余
w,根据欧拉准则我们有
w2p−1≡w2t−1s≡−1(mod p)
令
λ≡w2t−1−qs(mod p)即可得到下一组解。
在这一部分的最后,会讲解如何寻找
%p意义下的二次非剩余
O(logp)解法
这个解法由剑桥的Roberto Cipolla教授提出(好像就只是为了求解奇质数情况),故得名
Cipolla算法。
还是求解方程
x2≡a(mod p)
以下所有运算均在
%p意义下进行
设
b2−a≡w(mod p),其中
w是
%p意义下的二次非剩余
由于
w在
%p意义下不存在平方根,类似于虚数设
i=w
。类似于复数重新定义
%p意义下一个数为
(a,b),即
a+bw
。
接下来定义一个代数系统
<G,+,×>满足:
(a,b)+(c,d)=(a+c,b+d)
(a,b)×(c,d)=(ac+bdw,ad+bc)
显然
G是一个环,不知道什么是环的自行百度,百度百科
既然有结合律了。就可以快速幂。
那么有结论:上述方程的解为
x=(b+i)2p+1
证明如下:
x2=(b+i)p+1=(b+i)p(b+i)
其中,由二项式定理
(b+i)p=k=0∑pCpkbkip−k
显然当
k̸=0 or p,
Cpk≡0(mod p)
所以有
(b+i)p≡bp+ip≡bp−1b+w2p−1i≡b−i(mod p)
这个式子的推出同时用到了费马小定理和二次非剩余的特殊性质。
所以可以推出:
x2≡(b−i)(b+i)≡b2−w≡a(mod p)
于是我们就得到了一个优秀的
O(logp)的求解奇质数二次剩余的方法了。
寻找二次非剩余:
由于前文已经叙述了,由于有
t2≡(−t)2(mod p),所以二次剩余的数量不会超过
O(2p),我们随机出来一个数就有将近
1/2的概率是二次非剩余,所以这个直接用随机的做法就行了。
参考题目:Timus1132
2.模数为
pk,其中
p是奇质数
首先仍然要判断解是否存在
解的存在性
进行解的存在性判断稍微麻烦了一些
设:
a=pcm,
p∤m。
c≥k,免谈,直接返回0。
当
c<k,有解多了一个前提条件:
c%2=0
必要性证明:
设:
x02≡a(mod pk)
x0=ptn,n%p̸=0
所以
x02=p2tn2
当
2t<k,有如下推论:
(p2ts) % pk=p2t(s % pk−2t)
所以
p2t∣a,同时我们也可以这样将原方程化为
x02≡a/pc(modpk−c)
当新方程有解时,原方程也有解,将上面欧拉定则里面推理用的
p−1换成
ϕ(pk−c)就行了。
最后解为
x=x0×p2c。
所以接下来只讨论
p∤a的情况。
O(log2p)的解法:
与第一种情况一样,只需要将
p−1换成
ϕ(pk)=(p−1)pk−1就行了。
O(logp)的解法:
现在求解方程
x2≡a(mod pk)
其中
p∤a
先解出
r2≡a(mod p)
那么有
(r2−a)=kp⇒(r2−a)k≡0(mod pk)
令
(r2−a)k≡t2−u2a(mod pk)
我们有
(r−a
)k=t−ua(r+a
)k=t+ua
这个运算仍然在扩域后进行。
最终我们有
t2≡u2a(mod pk)
解出来的方程就是
t2u−2≡a(mod pk)
能够证明
gcd(t,p)=gcd(u,p)=1
所以逆元用扩展欧几里得求一下就行了。
3.模数为
2k
解的存在性
处理幂的方法与上面这种情况差不多,我们效仿上面先化成
x2≡a(mod2k),2∤a
那么现在呢,没有欧拉准则了啊。
从特殊情况谈起,先打一个表,把那些有解的
a找出来
k |
有解的a |
1 |
1 |
2 |
1 |
3 |
1 |
4 |
1,9 |
5 |
1,9,17,25 |
6 |
1,9,17,25,33,41,49,57 |
似乎当且仅当
a≡1(mod8)的时候有解啊。。。
实际上,我们有如下的蕴含关系:
a≡1(mod8)⇔∃x,x2≡a(mod2k)
必要性:
由于存在解
x0,x02≡a(mod2k)
由于
gcd(a,2)=1,所以
gcd(x0,2)=1,不妨设
x0=2t+1
所以
a≡x02≡(2t+1)2≡4t(t+1)+1(mod2k)
显然
8∣4t(t+1),所以
a≡1(mod8)
充分性:
由下面叙述的求解方法易证
(只要说明总能算出解,就能说明总是存在解,就好像拿着鸡下的蛋证明鸡会下蛋一样)
O(k)求解
一下内容学习自Miskcoo的博客,不过他的博客总是因为各种奇怪的原因打不开,链接我也找不到了,只有离线版本,所以我这里就照着他的思路来叙述求解方法
1.
k≤2
特判。
2.
k=3
二次剩余方程
x2≡a(mod23)有解,当且仅当
a≡1(mod23),且本质不同的解有四个:
±1,±5
换句话说,我们可以将这个解记为
x=±(x3+t3×22),t3∈Z,x3=1 or 5
3.
k>3
假设我们已经知道方程
x2≡a(mod2q−1)
的解,显然解可以表示成
x0=±(xq−1+tq−1×2q−2),tq−1∈Z
考虑如何推导出
xq和
tq。
为了方便,后面记
ai=a%2i
对于一个
x2≡a(mod2q−1)解
xq−1来说,在
%2q意义下,只可能有:
或是xq−12≡aq−1xq−12≡aq−1+2q−1(mod2q)(mod2q)
所以我们就要求出合适的
tq−1的值,先代入方程
x2≡a(mod2q)
(xq−1+2q−2×tq−1)2xq−12+2q−1tq−1tq−1≡aq≡aq≡2q−1aq−xq−12(mod2q)(mod2q)(mod2)
所以满足要求的
tq−1=2q−1aq−xq−12+2×tq,tq∈Z
回到方程
x2≡a(mod2q)它的解就是
x=±(xq−1+2aq−xq−12+2k−1×tk),tk∈Z
从
q=3的情况开始一路递推即可。
4.模数任意
考虑唯一分解
p=∏i=1tpiki
那么我们只需要求解
t个二次剩余方程:
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x12≡ax22≡a……xt2≡a(mod p1k1)(mod p2k2)(mod ptkt)
然后用CRT合并一下就行了
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡x1x≡x2……x≡xt(mod p1k1)(mod p2k2)(mod ptkt)