当存在某个 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,即不是二次剩余也不是二次非剩余。
对于方程 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)
(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的二次非剩余。
如果 p p p是一个奇质数, a a a是一个整数,可以使用 ( a p ) (\frac{a}{p}) (pa)来表示 a a a是否为模 p p p二次剩余,或者是既不是二次剩余,也不是二次非剩余。
如果 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)
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)
以算法实现时,直接计算 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)
(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)
#include
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 ) 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)