BSGS
我们要求
ax≡b(mod p)
a
x
≡
b
(
m
o
d
p
)
中x的值,其中p为质数,或者a和p互质。
x可以写成:
x=i∗k+j
x
=
i
∗
k
+
j
,其中k为常数。
那么
ai∗k+j≡b
a
i
∗
k
+
j
≡
b
ai∗k≡a−j∗b(mod p)
a
i
∗
k
≡
a
−
j
∗
b
(
m
o
d
p
)
那么我们可以预处理每一个j的
a−j∗b
a
−
j
∗
b
,存进set或者map里,然后枚举i,看看map里存不存在
ai∗k
a
i
∗
k
。当
k=φ(p)−−−−√
k
=
φ
(
p
)
的时候复杂度最优。
当p和a不互质的时候,可以先把他们的gcd除干净(两边同时除gcd(a,p)之后可能gcd(a,p/d)!=0)
二次剩余
我们要求
x2≡a(mod p)
x
2
≡
a
(
m
o
d
p
)
中x的值,其中
a<p
a
<
p
且a!=0,p为质数,p=2我们不讨论,0我们直接出解嘛。
如果a存在解,那么我们把a叫做模p意义下的二次剩余,否则为二次非剩余。
先来研究一些性质。
定理1:对于一个p,有(p-1)/2个二次剩余。
证明:
考虑所有的x2,对于两个数0<x1,x2<p,如果他们的平方同余,那么p|(x12−x22)
考
虑
所
有
的
x
2
,
对
于
两
个
数
0
<
x
1
,
x
2
<
p
,
如
果
他
们
的
平
方
同
余
,
那
么
p
|
(
x
1
2
−
x
2
2
)
,那么
p|(x1−x2)(x1+x2)
p
|
(
x
1
−
x
2
)
(
x
1
+
x
2
)
,
x1−x2
x
1
−
x
2
显然不能是p的倍数,那么x1+x2=p,这样,我们发现每个x的平方会和另一个x的平方同余,而且他们的和为p,由于只有p-1个x,那么
x2
x
2
的值就只有(p-1)/2个。
定理2:若
a(p−1)/2≡−1
a
(
p
−
1
)
/
2
≡
−
1
,那么x不存在,若=1,那么x必定存在且有两个,记为x1,x2,其中x1+x2=p。
证明:若=-1,那么由原方程可以推出
xp−1≡−1
x
p
−
1
≡
−
1
,又有费马小定理
xp−1≡1
x
p
−
1
≡
1
,矛盾,所以x不存在。后者就是定理一的内容。
定义一个数的勒让德符号
(ap)
(
a
p
)
他的取值有三个,1,-1,0,1代表a是p下的二次剩余,-1代表不是,0仅当a%p=0。那么易得
(ap)=a(p−1)/2
(
a
p
)
=
a
(
p
−
1
)
/
2
。
好了,现在我们来求x:
如果a不是二次剩余,返回无解。
如果是,那么有一个可行的做法如下:
首先找到一个c,使得
c2−a
c
2
−
a
的勒让德符号为-1,也即无法开根。
定义同余复数域,一个复数
v=(a+bi)
v
=
(
a
+
b
i
)
,其中
i=c2−a−−−−−√
i
=
c
2
−
a
,乘法等运算和通常意义上的复数一样。
有一个很强的结论:
x=(a+i)(p+1)/2
x
=
(
a
+
i
)
(
p
+
1
)
/
2
很简单粗暴,可以证明右边做完幂运算之后虚部为0。
我们来感受一下他
x2=(a+i)p+1
x
2
=
(
a
+
i
)
p
+
1
=(a+i)(a+i)p
=
(
a
+
i
)
(
a
+
i
)
p
=(a+i)∑j=0..pCjpaj ip−j
=
(
a
+
i
)
∑
j
=
0..
p
C
p
j
a
j
i
p
−
j
当j=1..p-1的时候,组合数里都有一个p,所以
≡(a+i)(ap+ip)
≡
(
a
+
i
)
(
a
p
+
i
p
)
≡(a+i)(ap+(c2−a)(p−1)/2i)
≡
(
a
+
i
)
(
a
p
+
(
c
2
−
a
)
(
p
−
1
)
/
2
i
)
≡(a+i)(ap−i)
≡
(
a
+
i
)
(
a
p
−
i
)
≡(a+i)(a−i)
≡
(
a
+
i
)
(
a
−
i
)
≡a
≡
a
做完了。