二次剩余

引言

我们在研究多项式开根的时候,想到了一个问题,若常数项不为1,那么怎么开根呢?
这就涉及到二次剩余。
那么什么是二次剩余呢?若在模 p p p意义下,存在一个 x x x,使得 x 2 ≡ a ( m o d p ) x^2 \equiv a \pmod{p} x2a(modp),则称 a a a x x x关于 p p p的二次剩余。若不存在这样的 x x x,则称 a a a为非二次剩余。
现在我们知道了 a a a,要求解 x x x,怎么办呢?

p为奇素数

首先引入欧拉准则
a a a为模 p p p意义下的二次剩余时, a p − 1 2 ≡ 1 ( m o d p ) a^{\frac{p-1}{2}} \equiv 1 \pmod{p} a2p11(modp)
a a a为模 p p p意义下的非二次剩余时, a p − 1 2 ≡ p − 1 ( m o d p ) a^{\frac{p-1}{2}} \equiv p-1 \pmod{p} a2p1p1(modp)
我们要求的 x x x满足: ( a − 1 x 2 ) 2 0 ≡ 1 ( m o d p ) (a^{-1}x^2)^{2^0} \equiv 1 \pmod{p} (a1x2)201(modp)
p − 1 = s 2 t p-1=s2^t p1=s2t,设 x t − 1 = a s + 1 2 x _ {t-1}=a^{\frac{s+1}{2}} xt1=a2s+1,那么根据欧拉准则第一条,有: ( a − 1 x t − 1 2 ) 2 t − 1 ≡ 1 ( m o d p ) (a^{-1}x_{t-1}^2)^{2^{t-1}} \equiv 1 \pmod{p} (a1xt12)2t11(modp)
诶…要不我们设 ( a − 1 x t − k 2 ) 2 t − k ≡ 1 ( m o d p ) (a^{-1}x _ {t-k}^2)^{2^{t-k}} \equiv 1 \pmod{p} (a1xtk2)2tk1(modp),这样我们要求的就是 x 0 x_0 x0
思考如何从 x t − k x _ {t-k} xtk推到 x t − k − 1 x _ {t-k-1} xtk1
e t − k = a − 1 x t − k 2 e _ {t-k}=a^{-1}x _ {t-k}^2 etk=a1xtk2
e t − k 2 t − k − 1 ≡ 1 ( m o d p ) e _ {t-k}^{2^{t-k-1}} \equiv 1 \pmod{p} etk2tk11(modp)(即将 e t − k 2 t − k e _ {t-k}^{2^{t-k}} etk2tk开根),显然 x t − k − 1 = x t − k x _ {t-k-1}=x _ {t-k} xtk1=xtk
e t − k 2 t − k − 1 ≡ p − 1 ( m o d p ) e _ {t-k}^{2^{t-k-1}} \equiv p-1 \pmod{p} etk2tk1p1(modp)。我们试图让 x t − k x _ {t-k} xtk乘一个值使得它变成 x t − k − 1 x _ {t-k-1} xtk1。那么想到欧拉准则的第二条,首先随机一个非二次剩余 b b b,然后发现 ( b 2 k − 1 s ) 2 t − k ≡ p − 1 ( m o d p ) (b^{2^{k-1}s})^{2^{t-k}} \equiv p-1 \pmod{p} (b2k1s)2tkp1(modp),所以 b 2 k − 1 s b^{2^{k-1}s} b2k1s是我们满足条件的值,此时让 x t − k − 1 = b 2 k − 1 s x t − k x _ {t-k-1}=b^{2^{k-1}s}x _ {t-k} xtk1=b2k1sxtk即可。
最后 x 0 x_0 x0其实有正负两个解,都满足条件。
例题:URAL 1132
代码:

#include<bits/stdc++.h>
using namespace std;
#define RI register int
int read() {
	int q=0;char ch=' ';
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') q=q*10+ch-'0',ch=getchar();
	return q;
}
int T,a,p,bin[22];
int ksm(int x,int y,int p) {
	int re=1;
	for(;y;y>>=1,x=1LL*x*x%p) if(y&1) re=1LL*re*x%p;
	return re;
}
int jud(int x,int p) {return ksm(x,(p-1)/2,p)==1;}
void work() {
	int s=p-1,b,t=0;
	while(!(s&1)) ++t,s>>=1;
	int inva=ksm(a,p-2,p),e=ksm(a,s,p),x=ksm(a,(s+1)/2,p);
	while("xzy is too strong") {
		b=rand()%p+1,b=((b*b-a)%p+p)%p;
		if(b&&!jud(b,p)) break;
	}
	for(RI k=1;k<t;++k)
		if(ksm(e,bin[t-k-1],p)!=1)
			x=1LL*x*ksm(b,bin[k-1]*s,p)%p,e=1LL*inva*x%p*x%p;
	int x1=x,x2=p-x;
	if(x1>x2) swap(x1,x2);
	printf("%d %d\n",x1,x2);
}
int main()
{
	srand(19260817);
	T=read();
	bin[0]=1;for(RI i=1;i<=20;++i) bin[i]=bin[i-1]<<1;
	while(T--) {
		a=read(),p=read();
		if(p==2) {puts("1");continue;}
		if(!jud(a,p)) {puts("No root");continue;}
		work();
	}
    return 0;
}

p为奇素数的幂

求满足 x 2 ≡ a ( m o d p q ) x^2 \equiv a \pmod{p^q} x2a(modpq) x x x
a = p k d a=p^kd a=pkd
显然答案是 x = p k 2 x 0 x=p^{\frac{k}{2}}x_0 x=p2kx0的形式。
p k x 0 2 ≡ p k d ( m o d p q ) p^k x _ 0^2 \equiv p^k d \pmod{p^q} pkx02pkd(modpq),也就是说 ( d − x 0 2 ) p k ≡ 0 ( m o d p q ) (d-x _ 0^2)p^k \equiv 0 \pmod{p^q} (dx02)pk0(modpq),那么有 ( d − x 0 2 ) ≡ 0 ( m o d p q − k ) (d-x _ 0^2) \equiv 0 \pmod{p^{q-k}} (dx02)0(modpqk)
问题转化为求 x 0 2 ≡ d ( m o d p q − k ) x _ 0^2 \equiv d \pmod{p^{q-k}} x02d(modpqk),而 d d d p p p是互质的。
为了方便起见,假设我们现在要求解的问题是 x 2 ≡ a ( m o d p q ) x^2 \equiv a \pmod{p^q} x2a(modpq) a a a p p p互质。

找到一个模 p q p^q pq的简化剩余系下的原根 g g g,我们就可以用 g r ( 1 ≤ r ≤ ϕ ( p q ) ) g^r(1 \leq r \leq \phi(p^q)) gr(1rϕ(pq))来表示所有在模 p q p^q pq意义下与 p q p^q pq互质的数。
r r r为奇数时,设存在 g r ≡ g 2 m ( m o d p q ) g^r \equiv g^{2m} \pmod{p^q} grg2m(modpq)。也就是 r ≡ 2 m ( m o d ϕ ( p q ) ) r \equiv 2m \pmod{\phi(p^q)} r2m(modϕ(pq)),也就是 r = 2 m + k ϕ ( p q ) r=2m+k\phi(p^q) r=2m+kϕ(pq)
我们知道 ϕ ( p q ) = ( p − 1 ) p q − 1 \phi(p^q)=(p-1)p^{q-1} ϕ(pq)=(p1)pq1,又因为 p p p是奇素数,所以 ϕ ( p q ) \phi(p^q) ϕ(pq)是偶数,所以 2 m + k ϕ ( p q ) 2m+k\phi(p^q) 2m+kϕ(pq)也是偶数。而 r r r是奇数,所以显然找不到这样的 m m m
当然因为 g g g肯定是与 p p p互质的,所以 g r ≡ g 2 m p t ( m o d p q ) g^r \equiv g^{2m}p^t \pmod{p^q} grg2mpt(modpq)也是不可能成立的啦。所以此时 g r g^r gr是个二次非剩余啦。
而当 r r r为偶数的时候,显然 g r g^r gr是个二次剩余啦。

对于任意二次剩余 g 2 k g^{2k} g2k,有
( g 2 k ) ϕ ( p q ) 2 = ( g k ) ϕ ( p q ) ≡ 1 ( m o d p q ) (g^{2k})^{\frac{\phi(p^q)}{2}} = (g^k)^{\phi(p^q)} \equiv 1 \pmod{p^q} (g2k)2ϕ(pq)=(gk)ϕ(pq)1(modpq)
对于任意二次非剩余 g 2 k + 1 g^{2k+1} g2k+1有:
( g 2 k + 1 ) ϕ ( p q ) 2 ≡ g ϕ ( p q ) 2 ( m o d ( ) p q ) (g^{2k+1})^{\frac{\phi(p^q)}{2}} \equiv g^{\frac{\phi(p^q)}{2}} \pmod(p^q) (g2k+1)2ϕ(pq)g2ϕ(pq)(mod()pq)
我们知道 g ϕ ( p q ) 2 g^{\frac{\phi(p^q)}{2}} g2ϕ(pq) g ϕ ( p q ) g^{\phi(p^q)} gϕ(pq)肯定不相等,而后者等于1,前者是后者的开根,所以等于-1。
我们得到了一个new欧拉准则。
求解时,先将问题转化为 a a a p p p互质,然后令 ϕ ( p q ) = s 2 t \phi(p^q)=s2^t ϕ(pq)=s2t,套用p为奇素数时的求解方法即可。

p为2的幂

这个嘛…同样,化一下,令 a = 2 k d a=2^kd a=2kd,那么求解 x 0 2 ≡ d ( m o d 2 q − k ) x _ 0^2 \equiv d \pmod{2^{q-k}} x02d(mod2qk),然后解就是 x = 2 k 2 ( x 0 + 2 q − k t ) x=2^{\frac{k}{2}}(x _ 0+2^{q-k}t) x=22k(x0+2qkt)的形式。
然后我们知道,当 q = 1 q=1 q=1的时候,当 a = 1 a=1 a=1时有解 x = 1 x=1 x=1
q = 2 q=2 q=2时,当 a = 1 a=1 a=1时有解 x = 1 , x = 3 x=1,x=3 x=1,x=3
q = 3 q=3 q=3时,当 a = 1 a=1 a=1时有解 x = 1 , x = 3 , x = 5 , x = 7 x=1,x=3,x=5,x=7 x=1,x=3,x=5,x=7
我们将 q = k q=k q=k意义下解的形式写成 x k = ± ( y k + t k 2 k − 1 ) x _ k= \pm (y _ k+t _ k 2^{k-1}) xk=±(yk+tk2k1)。记 a k = a &VeryThinSpace; m o d &VeryThinSpace; 2 k a_k = a \bmod{2^k} ak=amod2k
继续推,现在我们已知了 x k − 1 ≡ ± ( y k − 1 + t k − 1 2 k − 2 ) ( m o d 2 k − 1 ) x _ {k-1}\equiv\pm(y _ {k-1}+t _ {k-1}2^{k-2}) \pmod{2^{k-1}} xk1±(yk1+tk12k2)(mod2k1)
那么 x k − 1 2 x _ {k-1}^2 xk12在模 2 k 2^k 2k意义下可能是 a k − 1 a _ {k-1} ak1 a k − 1 + 2 k − 1 a _ {k-1}+2^{k-1} ak1+2k1。我们在现在符合条件的若干 t k − 1 t _ {k-1} tk1值中选择出能使 x k − 1 2 ≡ a k ( m o d 2 k ) x _ {k-1}^2 \equiv a _ k \pmod{2^k} xk12ak(mod2k)的,然后:
( y k − 1 + t k − 1 2 k − 2 ) 2 ≡ a k ( m o d 2 k ) (y _ {k-1}+t _ {k-1}2^{k-2})^2 \equiv a _ k \pmod{2^k} (yk1+tk12k2)2ak(mod2k)
将左边的式子拆开,得到 y k − 1 2 + t k − 1 2 k − 1 y k − 1 + t k − 1 2 2 2 k − 4 y _ {k-1}^2 + t _ {k-1}2^{k-1}y _ {k-1}+t _ {k-1}^2 2^{2k-4} yk12+tk12k1yk1+tk1222k4,由于我们之前已经保证过了 a a a是奇数,所以 y y y一定是奇数,而我们知道 t k − 1 2 k − 1 × 2 ≡ 0 ( m o d 2 k ) t_{k-1}2^{k-1} \times 2 \equiv 0 \pmod{2^k} tk12k1×20(mod2k)所以第二项一定等于 t k − 1 2 k − 1 t_{k-1}2^{k-1} tk12k1。第三项则一定等于0。
所以
y k − 1 2 + t k − 1 2 k − 1 ≡ a k ( m o d 2 k ) y _ {k-1}^2 + t _ {k-1}2^{k-1} \equiv a _ k \pmod{2^k} yk12+tk12k1ak(mod2k)
t k − 1 2 k − 1 ≡ a k − y k − 1 2 ( m o d 2 k ) t _ {k-1}2^{k-1} \equiv a _ k -y _ {k-1}^2 \pmod{2^k} tk12k1akyk12(mod2k)
t k − 1 ≡ a k − y k − 1 2 2 k − 1 ( m o d 2 ) t _ {k-1} \equiv \frac{a _ {k} - y _ {k-1}^2}{2^{k-1}} \pmod{2} tk12k1akyk12(mod2)
所以设 t k − 1 = a k − y k − 1 2 2 k − 1 + 2 t k t _ {k-1}= \frac{a _ {k} - y _ {k-1}^2}{2^{k-1}} + 2 t _ k tk1=2k1akyk12+2tk,那么
x k = ± ( y k − 1 + a k − y k − 1 2 2 + 2 k − 1 t k ) x _ k = \pm (y _ {k-1}+\frac{a _ k- y _ {k-1}^2}{2} + 2^{k-1}t _ k) xk=±(yk1+2akyk12+2k1tk)
也就是说, y k = y k − 1 + a k − y k − 1 2 2 y _ k=y _ {k-1}+\frac{a _ k- y _ {k-1}^2}{2} yk=yk1+2akyk12
所以我们就从 q = 3 q=3 q=3开始不断往上推,就可以出解了。

p为合数

嗯,将p质因数分解,然后分别求解,中国剩余定理合并即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值