引言
我们在研究多项式开根的时候,想到了一个问题,若常数项不为1,那么怎么开根呢?
这就涉及到二次剩余。
那么什么是二次剩余呢?若在模
p
p
p意义下,存在一个
x
x
x,使得
x
2
≡
a
(
m
o
d
p
)
x^2 \equiv a \pmod{p}
x2≡a(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}
a2p−1≡1(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}
a2p−1≡p−1(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}
(a−1x2)20≡1(modp)
设
p
−
1
=
s
2
t
p-1=s2^t
p−1=s2t,设
x
t
−
1
=
a
s
+
1
2
x _ {t-1}=a^{\frac{s+1}{2}}
xt−1=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}
(a−1xt−12)2t−1≡1(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}
(a−1xt−k2)2t−k≡1(modp),这样我们要求的就是
x
0
x_0
x0
思考如何从
x
t
−
k
x _ {t-k}
xt−k推到
x
t
−
k
−
1
x _ {t-k-1}
xt−k−1。
设
e
t
−
k
=
a
−
1
x
t
−
k
2
e _ {t-k}=a^{-1}x _ {t-k}^2
et−k=a−1xt−k2
若
e
t
−
k
2
t
−
k
−
1
≡
1
(
m
o
d
p
)
e _ {t-k}^{2^{t-k-1}} \equiv 1 \pmod{p}
et−k2t−k−1≡1(modp)(即将
e
t
−
k
2
t
−
k
e _ {t-k}^{2^{t-k}}
et−k2t−k开根),显然
x
t
−
k
−
1
=
x
t
−
k
x _ {t-k-1}=x _ {t-k}
xt−k−1=xt−k
若
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}
et−k2t−k−1≡p−1(modp)。我们试图让
x
t
−
k
x _ {t-k}
xt−k乘一个值使得它变成
x
t
−
k
−
1
x _ {t-k-1}
xt−k−1。那么想到欧拉准则的第二条,首先随机一个非二次剩余
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}
(b2k−1s)2t−k≡p−1(modp),所以
b
2
k
−
1
s
b^{2^{k-1}s}
b2k−1s是我们满足条件的值,此时让
x
t
−
k
−
1
=
b
2
k
−
1
s
x
t
−
k
x _ {t-k-1}=b^{2^{k-1}s}x _ {t-k}
xt−k−1=b2k−1sxt−k即可。
最后
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}
x2≡a(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}
pkx02≡pkd(modpq),也就是说
(
d
−
x
0
2
)
p
k
≡
0
(
m
o
d
p
q
)
(d-x _ 0^2)p^k \equiv 0 \pmod{p^q}
(d−x02)pk≡0(modpq),那么有
(
d
−
x
0
2
)
≡
0
(
m
o
d
p
q
−
k
)
(d-x _ 0^2) \equiv 0 \pmod{p^{q-k}}
(d−x02)≡0(modpq−k)
问题转化为求
x
0
2
≡
d
(
m
o
d
p
q
−
k
)
x _ 0^2 \equiv d \pmod{p^{q-k}}
x02≡d(modpq−k),而
d
d
d与
p
p
p是互质的。
为了方便起见,假设我们现在要求解的问题是
x
2
≡
a
(
m
o
d
p
q
)
x^2 \equiv a \pmod{p^q}
x2≡a(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(1≤r≤ϕ(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}
gr≡g2m(modpq)。也就是
r
≡
2
m
(
m
o
d
ϕ
(
p
q
)
)
r \equiv 2m \pmod{\phi(p^q)}
r≡2m(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)=(p−1)pq−1,又因为
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}
gr≡g2mpt(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}}
x02≡d(mod2q−k),然后解就是
x
=
2
k
2
(
x
0
+
2
q
−
k
t
)
x=2^{\frac{k}{2}}(x _ 0+2^{q-k}t)
x=22k(x0+2q−kt)的形式。
然后我们知道,当
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+tk2k−1)。记
a
k
=
a
 
m
o
d
 
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}}
xk−1≡±(yk−1+tk−12k−2)(mod2k−1)
那么
x
k
−
1
2
x _ {k-1}^2
xk−12在模
2
k
2^k
2k意义下可能是
a
k
−
1
a _ {k-1}
ak−1或
a
k
−
1
+
2
k
−
1
a _ {k-1}+2^{k-1}
ak−1+2k−1。我们在现在符合条件的若干
t
k
−
1
t _ {k-1}
tk−1值中选择出能使
x
k
−
1
2
≡
a
k
(
m
o
d
2
k
)
x _ {k-1}^2 \equiv a _ k \pmod{2^k}
xk−12≡ak(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}
(yk−1+tk−12k−2)2≡ak(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}
yk−12+tk−12k−1yk−1+tk−1222k−4,由于我们之前已经保证过了
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}
tk−12k−1×2≡0(mod2k)所以第二项一定等于
t
k
−
1
2
k
−
1
t_{k-1}2^{k-1}
tk−12k−1。第三项则一定等于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}
yk−12+tk−12k−1≡ak(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}
tk−12k−1≡ak−yk−12(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}
tk−1≡2k−1ak−yk−12(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
tk−1=2k−1ak−yk−12+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=±(yk−1+2ak−yk−12+2k−1tk)
也就是说,
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=yk−1+2ak−yk−12
所以我们就从
q
=
3
q=3
q=3开始不断往上推,就可以出解了。
p为合数
嗯,将p质因数分解,然后分别求解,中国剩余定理合并即可。