class="markdown_views prism-atom-one-light">
在学多项式求逆的时候顺便就推了一下多项式的开根,
结果毫无疑问的要用到二c次剩余,顺路就学了一下,
二次剩余
给出
n,P(P为奇质数),如果存在一个
a 使得
a2≡n(modP) ,那么n在模P的意义下就是二次剩余,
CTY大佬的方法
因为这个问题是由二次开方引起的,自然,模数有已知原根
r,那么:
r2Indr(a)≡rIndr(n)(modP)
Ind是离散对数里面的东西,定义为rIndr(x)≡x(modP)
- 定理1:方程 a2≡n(modP),只有2P−1个n使方程有解(0除外)
- 证明:可以发现,如果Indr(n)为奇数的话,这个方程就无解,因为Indr(n)相当于是在模P-1的意义下的,而P-1必为偶数,也就是不存在2的逆元;Indr(n)的取值范围为0~P-2,共有2p−1为偶数,所以只有这么多个n使方程有解。
回归主题,要求出
Indr(a),也就是要求出
Indr(n),
那么如何快速求出
Indr(n)呢?
设一个阈值
ω,那么
Indr(n)一定可以被表示成
aω+b,
也就是:
raω∗rb≡n(modP)
rb≡n∗(raω)−1(modP)
显然,所有的
rb可以预处理出来,
那么,剩下的只要枚举a了,判断是否有对应的b即可,
如果
ω=n,复杂度即为:
O(nlog(n))(还有求逆元)
.
对于上面的定理1,其实还有一种证明:
- 定理1:方程 a2≡n(modP),只有2P−1个n使方程有解(0除外)
- 证明:考虑对于所有的a,可以平方出多少个不同的n,
如果两个数a,b他们满足a2≡b2(modP),那么a2−b2≡0(modP)也就是(a2−b2)∣P,(a−b)(a+b)∣P,显然(a-b)不可能是P的倍数,所以(a+b)就肯定是P的倍数,也就是a,b也满足:a+b=P,
所以能组合出的不同的n就只有2P−1个
Cipolla
介绍一个东西:
勒让德符号(Legendre symbol)
定义为:
(Pn)=⎩⎪⎨⎪⎧1−10,n在模P意义下是二次剩余n在模P意义下是非二次剩余n≡0(modP)
求值也很简单:(当然你用上边的方法判定没人拦…)
- 定理2:(Pn)≡n2P−1(modP)
- 证明:先证明n2