二次同余方程(二次剩余)


一、介绍

1.定义

当存在某个 x x x,可以使得式子 x 2 ≡ n ( m o d x^2≡n(mod x2n(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 x2n(mod p ) p) p),如果 p p p是一个奇质数(即 p p p为大于2的质数),那么在集合 { 1 , 2 , … , p − 1 } \{1,2,…,p-1\} {1,2,,p1}中,有 p − 1 2 \frac{p-1}{2} 2p1个数满足模 p p p的二次剩余,剩下的 p − 1 2 \frac{p-1}{2} 2p1个数为模 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,,p1})

X = k ∗ p + x X=k*p+x X=kp+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=(kp+x)2%px2%p

第二步:证明 x 2 x^2 x2 ( p − x ) 2 (p-x)^2 (px)2在模 p p p条件下同余

( p − x ) 2 (p-x)^2 (px)2进行展开得到 ( p 2 − 2 p x + x 2 ) (p^2-2px+x^2) (p22px+x2),再对 p p p取模,得到 x 2 x^2 x2
证毕。

第三步:证明在 { 1 , 2 , … , p − 1 2 } \{1,2,…,\frac{p-1}{2} \} {1,2,,2p1}中,不同的 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 x2y2(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(x2y2)p(xy)(x+y)

由于 ( x + y ) < p (x+y)<p (x+y)<p,这个式子成立的唯一可能就是 x = = y x==y x==y,与条件相矛盾。
证毕。

由上方的三个证明可以得知,前 p − 1 2 \frac{p-1}{2} 2p1个数对应 x 2 x^2 x2对p取模的结果与后 p − 1 2 \frac{p-1}{2} 2p1个数相同,而且,前 p − 1 2 \frac{p-1}{2} 2p1个数对应 x 2 x^2 x2对p取模的结果各自不同,说明集合 { 1 , 2 , … , p − 1 } ) \{1,2,…,p-1 \}) {1,2,,p1})对应的 x 2 x^2 x2对p取模的结果有 p − 1 2 \frac{p-1}{2} 2p1个,再结合证明一,进行推广,所有整数对应的 x 2 x^2 x2对p取模的结果有 p − 1 2 \frac{p-1}{2} 2p1

也就是在集合 { 1 , 2 , … , p − 1 } \{1,2,…,p-1\} {1,2,,p1}中,有 p − 1 2 \frac{p-1}{2} 2p1个数满足模 p p p的二次剩余,剩下的 p − 1 2 \frac{p-1}{2} 2p1个数为模 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)=a2p1(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=kpa2p1=(kp)2p1
( k p ) p − 1 2 ≡ 0 ( m o d (kp)^{\frac{p-1}{2}}≡0(mod (kp)2p10(mod p ) p) p)
所以此时 a p − 1 2 = 0 = ( a p ) a^{\frac{p-1}{2}}=0=(\frac{a}{p}) a2p1=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,,p1},
由于 x x x p p p互质,根据费马小定理,可知:
x p − 1 ≡ 1 ( m o d x^{p-1}≡1(mod xp11(mod p ) p) p)
⇒ ( x 2 ) p − 1 2 ≡ 1 ( m o d \Rightarrow (x^2)^{\frac{p-1}{2}}≡1(mod (x2)2p11(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 ij同余,且 i ≠ j , i 、 j ∈ { 1 , 2 , … , p − 1 } i\neq j,i、j\in\{1,2,…,p-1\} i=jij{1,2,,p1}
i ∗ j ≡ a ( m o d i*j≡a(mod ija(mod p ) p) p)
⇒ i ≡ a ∗ j − 1 ( m o d \Rightarrow i≡a*j^{-1}(mod iaj1(mod p ) p) p)

第一步证明不同的 i i i所对应的 j j j是不同的。

反证法:若存在 由 于 I ≡ a ∗ j − 1 ( m o d 由于I≡a*j^{-1}(mod Iaj1(mod p ) p) p) i ≡ a ∗ j − 1 ( m o d i≡a*j^{-1}(mod iaj1(mod p ) p) p)
则可以写为: I − i = k p I-i=kp Ii=kp
由于 i 、 I ∈ { 1 , 2 , … , p − 1 } i、I\in\{1,2,…,p-1\} iI{1,2,,p1}
唯有 i = = I i==I i==I时,才会成立,产生矛盾。
证毕。

第二步证明 a p − 1 2 = ( p − 1 ) ! a^{\frac{p-1}{2}}=(p-1)! a2p1=(p1)!

可以将集合 { 1 , 2 , … , p − 1 } \{1,2,…,p-1\} {1,2,,p1}内的 p − 1 p-1 p1个数分为 p − 1 2 \frac{p-1}{2} 2p1组,每组里面的两个数的积与 a a a同余,所以 ( p − 1 ) ! (p-1)! (p1)! a p − 1 2 a^{\frac{p-1}{2}} a2p1.

根据威尔逊定理:p 是质数的充要条件为 ( p − 1 ) ! ≡ − 1 ( m o d (p−1)! ≡ −1 (mod (p1)!1(mod p ) p) p)
此时可以得到: a p − 1 2 = ( p − 1 ) ! ≡ − 1 ( m o d a^{\frac{p-1}{2}}=(p-1)!≡ −1 (mod a2p1=(p1)!1(mod p ) p) p)

(3)注意

以算法实现时,直接计算 a p − 1 2 a^{\frac{p-1}{2}} a2p1 p p p的结果将得到 p − 1 p-1 p1,所以也可以表示为:
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} a2p1%p=1p10(pa)=1(pa)=1(pa)=0

三、 x 2 ≡ n ( m o d x^2≡n(mod x2n(mod p ) p) p)——奇波拉算法(Cipolla’s algorithm)

求解方程 x 2 ≡ n ( m o d x^2≡n(mod x2n(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,...,p1}中找到一个 a a a,且 a 2 − n a^2-n a2n满足模 p p p的二次非剩余,即 ( a 2 − n p ) = = − 1 (\frac{a^2-n}{p})==-1 (pa2n)==1

(3) x = ( a + a 2 − n ) p + 1 2 x=(a+\sqrt{a^2-n})^{\frac{p+1}{2}} x=(a+a2n )2p+1就是一个解,由于 x 2 x^2 x2 ( p − x ) 2 (p-x)^2 (px)2同余,所以还有第二个解 ( p − x ) (p-x) (px)

2.证明 x = ( a + a 2 − n ) p + 1 2 x=(a+\sqrt{a^2-n})^{\frac{p+1}{2}} x=(a+a2n )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 x2n(mod p k ) p^k) pk)(gcd(x,p)=1,p为奇质数)

先解同余式 x 2 ≡ n ( m o d x^2≡n(mod x2n(mod p ) p) p)

设解为 r r r,即 r 2 ≡ n ( m o d r^2≡n(mod r2n(mod p ) p) p)
转化可得: r 2 − n = m p r^2-n=mp r2n=mp ⇒ ( r 2 − n ) k = ( m p ) k \Rightarrow (r^2-n)^k=(mp)^k (r2n)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(rw)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+Ck1rk1w...+Ckk1rwk1+Ckkwkt+uw
( 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 (rw)k=Ck0rk+Ck1rk1(w)...+Ckk1r(w)k1+Ckk(w)ktuw

仅当 ( − w ) (-w) (w)的次数为偶次时才会作用于 t t t,此时负号相抵消,故两式能够构成一个平方差的形式。

上式就变为了 t 2 − u 2 ∗ n = ( m p ) k t^2-u^2*n=(mp)^k t2u2n=(mp)k
t 2 − u 2 ∗ n ≡ 0 ( m o d t^2-u^2*n≡0(mod t2u2n0(mod p k ) p^k) pk)

处理得 t 2 ≡ u 2 n ( m o d t^2≡u^2n(mod t2u2n(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(u1)2n(mod p ) p) p)
通过求逆元的方法可以求出 u − 1 u^{-1} u1

此时得出了第一个解 x = t ∗ i n v ( u ) ( m o d x=t*inv(u)(mod x=tinv(u)(mod p k ) p^k) pk)
再根据之前的同余关系 x 2 ≡ ( p − x ) 2 ( m o d x^2≡(p-x)^2(mod x2(px)2(mod p ) p) p)
所以还有第二个解 ( p k − t ∗ i n v ( u ) ) ( m o d (p^k-t*inv(u))(mod (pktinv(u))(mod p k ) p^k) pk)

例:求方程 x 2 ≡ 13 ( m o d x^2≡13(mod x213(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 tinv(u)=(4022)%27=16
第二个解就是 p k − x = 27 − 16 = 11 p^k-x=27-16=11 pkx=2716=11

为了方便理解,也可以写为 x ≡ ± 11 ( m o d x≡\pm11(mod x±11(mod 27 ) 27) 27)


  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值