这个其实很早之前就想写了,只不过一直没有时间。
之前稍微学了一下,但由于没有留下深刻的印象,所以学了等于白学。
SCOI2018有一道题就是裸的二次剩余题,比赛时做不出来真是气炸了。
概念
如果
p
p
p为奇素数。
n
n
n在模
p
p
p意义下能被开方,就称
n
n
n是模
p
p
p意义下的二次剩余。
即存在
x
2
≡
n
(
m
o
d
p
)
x^2\equiv n (mod \ p)
x2≡n(mod p)
勒让德符号
(
n
p
)
=
{
1
,
n
在模
p
意义下是二次剩余
−
1
,
n
在模
p
意义下是非二次剩余
0
,
n
≡
0
(
m
o
d
p
)
\left(\frac{n}{p}\right)= \begin{cases} 1,&n\text{在模$p$意义下是二次剩余}\\ -1,&n\text{在模$p$意义下是非二次剩余}\\ 0,&n\equiv0\pmod p \end{cases}
(pn)=⎩⎪⎨⎪⎧1,−1,0,n在模p意义下是二次剩余n在模p意义下是非二次剩余n≡0(modp)
这个东西可以用个很方便的东西求出来:
(
n
p
)
≡
n
p
−
1
2
(
m
o
d
p
)
\left(\frac{n}{p}\right)\equiv n^{\frac{p-1}{2}} \pmod p
(pn)≡n2p−1(modp)
证明:如果
n
n
n是模
p
p
p意义下的二次剩余,即存在
x
2
≡
n
(
m
o
d
p
)
x^2 \equiv n \pmod p
x2≡n(modp)
那么就有
n
p
−
1
2
≡
x
p
−
1
≡
1
(
m
o
d
p
)
n^{\frac{p-1}{2}}\equiv x^{p-1}\equiv 1 \pmod p
n2p−1≡xp−1≡1(modp)
Cipolla算法
接下来的问题是如何解这个方程。
可以用BSGS算法艹过去。
但是这里有个更加高级的叫Cipolla算法。
前置技能
定理一
n
2
≡
(
p
−
n
)
2
(
m
o
d
p
)
n^2\equiv (p-n)^2 \pmod p
n2≡(p−n)2(modp)
证明略。
定理二
p
p
p的二次剩余个数只有
p
−
1
2
\frac{p-1}{2}
2p−1个
考虑假如有两个不同的数
x
x
x和
y
y
y满足
x
2
≡
y
2
(
m
o
d
p
)
x^2\equiv y^2 \pmod p
x2≡y2(modp)
则
p
∣
(
x
+
y
)
(
x
−
y
)
p|(x+y)(x-y)
p∣(x+y)(x−y)
所以
x
+
y
≡
p
x+y\equiv p
x+y≡p
所以说,每个满足
x
≡
y
(
m
o
d
p
)
x\equiv y \pmod p
x≡y(modp)的
x
x
x和
y
y
y,它们的平方是相同的。
得证。
具体算法
假如要对
n
n
n开方(保证其为模
p
p
p意义下的二次剩余)
随机一个
a
a
a使得
a
2
−
n
a^2-n
a2−n是非二次剩余(期望次数两次)
令
ω
2
≡
a
2
−
n
(
m
o
d
p
)
\omega^2\equiv a^2-n \pmod p
ω2≡a2−n(modp)
计算
(
a
+
ω
)
p
+
1
2
(a+\omega)^{\frac{p+1}{2}}
(a+ω)2p+1作为其中达到一个解,另一个解通过定理一求出。
ω
\omega
ω看起来是无解的,但可以像对待虚数的
i
i
i一样对待它。
计算的时候把它当负复数计算,算完之后就会惊奇地发现虚数部分消失了。
证明
定理三
ω p ≡ − ω ( m o d p ) \omega^p\equiv -\omega \pmod p ωp≡−ω(modp)
证明: ω p ≡ ω p − 1 ω ≡ ( a 2 − n ) p − 1 2 ω ≡ − ω ( m o d p ) \omega^p\equiv \omega^{p-1}\omega \equiv(a^2-n)^{\frac{p-1}{2}}\omega\equiv -\omega \pmod p ωp≡ωp−1ω≡(a2−n)2p−1ω≡−ω(modp)
定理四
(
a
+
b
)
p
≡
a
p
+
b
p
(
m
o
d
p
)
(a+b)^p\equiv a^p+b^p \pmod p
(a+b)p≡ap+bp(modp)
二项式展开完事。
(
(
a
+
ω
)
p
+
1
2
)
2
≡
(
a
p
+
ω
p
)
(
a
+
ω
)
≡
(
a
−
ω
)
(
a
+
ω
)
≡
a
2
−
(
a
2
−
n
)
≡
n
\left((a+\omega)^{\frac{p+1}{2}}\right)^2 \\ \equiv (a^p+\omega^p)(a+\omega) \\ \equiv (a-\omega)(a+\omega) \\ \equiv a^2-(a^2-n) \\ \equiv n
((a+ω)2p+1)2≡(ap+ωp)(a+ω)≡(a−ω)(a+ω)≡a2−(a2−n)≡n
证毕……
既然它可以推出来,那就可以简单地认为它虚部在计算的过程中会消去……