作者的话:
在标题的"(坑)"删除前,谢绝转载。因为还会更新。
这是一篇从初中写到高中的文章,由于水平有限,如有错误请指出,谢谢!
本文将力图理性地证明所有定理(除非太过于显然的定理)
定义
数论 数论是纯粹数学的分支之一,主要研究 整数 的性质。
连加
a
1
+
a
2
+
.
.
.
+
a
n
=
∑
i
=
1
n
a
i
\begin{aligned}a_1+a_2+...+a_n=\sum\limits_{i=1}^{n}a_i\end{aligned}
a1+a2+...+an=i=1∑nai
连乘
a
1
×
a
2
×
.
.
.
×
a
n
=
∏
i
=
1
n
a
i
\begin{aligned}a_1\times a_2\times...\times a_n=\prod\limits_{i=1}^{n}a_i\end{aligned}
a1×a2×...×an=i=1∏nai
全称量化
∀
1
⩽
i
⩽
n
,
i
2
≠
0
⇔
\forall\ 1\leqslant i\leqslant n,i^2\not=0⇔
∀ 1⩽i⩽n,i2=0⇔ 对于所有满足
1
⩽
i
⩽
n
的
i
1\leqslant i\leqslant n的\ i
1⩽i⩽n的 i,满足
i
2
≠
0
i^2\not=0
i2=0
集合
- R R R 实数集合
- Q Q Q 有理数集合
- Z Z Z 整数集合
- N N N 自然数集合
- N ∗ N^* N∗ 正整数集合
- p r i m e prime prime 质数集合
- a ∈ B ⇔ a a\in B ⇔a a∈B⇔a 属于集合 B B B
- a ∉ B ⇔ a a\not\in B ⇔a a∈B⇔a 不属于集合 B B B
-
{
x
2
∣
1
⩽
x
⩽
n
,
x
∈
p
r
i
m
e
}
\{x^2|1\leqslant x\leqslant n,x\in prime\}
{x2∣1⩽x⩽n,x∈prime}
⇔ ⇔ ⇔ 满足 1 ⩽ x ⩽ n , x ∈ p r i m e 1\leqslant x\leqslant n,x\in prime 1⩽x⩽n,x∈prime 的所有 x 2 x^2 x2 组成的集合
⇔ ⇔ ⇔" 1 1 1 到 n n n 中所有质数"的平方组成的集合 - ∣ S ∣ ⇔ |S|⇔ ∣S∣⇔ 集合 S S S 的大小
整除
a
∣
b
⇔
a
a|b⇔a
a∣b⇔a 是
b
b
b 的约数
a
∤
a\not|\;
a∣
b
⇔
a
b⇔a
b⇔a 不是
b
b
b 的约数(由于\nmid
(
∤
\nmid
∤)不容易区分,这里用a\not|\;
)
最小公倍数
[
a
,
b
]
=
l
c
m
(
a
,
b
)
[a,b]=lcm(a,b)
[a,b]=lcm(a,b)
最大公因数
(
a
,
b
)
=
g
c
d
(
a
,
b
)
(a,b)=gcd(a,b)
(a,b)=gcd(a,b)
取整
⌊
x
⌋
⇔
x
\lfloor x\rfloor⇔x
⌊x⌋⇔x 下取整
⌈
x
⌉
⇔
x
\qquad\ \ \lceil x\rceil⇔x
⌈x⌉⇔x 上取整
同余 a ≡ b ( m o d m ) ⇔ a mod m = b mod m a≡b\pmod m⇔a\ \text{mod}\ m=b\ \text{mod}\ m a≡b(modm)⇔a mod m=b mod m
逆元 若
a
×
a
−
1
≡
1
(
m
o
d
m
)
a\times a^{-1}≡1\pmod m
a×a−1≡1(modm),则
a
−
1
a^{-1}
a−1 即为
a
a
a 的逆元。
定理 当且仅当
(
a
,
m
)
≠
1
(a,m)\not=1
(a,m)=1 时,存在
a
−
1
a^{-1}
a−1 使得
a
×
a
−
1
≡
1
(
m
o
d
m
)
a\times a^{-1}≡1\pmod m
a×a−1≡1(modm)
证明 若
(
a
,
m
)
=
d
≠
1
(a,m)=d\not=1
(a,m)=d=1,
(
a
×
a
′
)
mod
m
=
t
\left(a\times a'\right)\ \text{mod}\ m=t
(a×a′) mod m=t 则
a
×
a
′
+
k
×
m
=
t
a\times a'+k\times m=t
a×a′+k×m=t,则
t
mod
d
=
0
t\ \text{mod}\ d=0
t mod d=0,因而
t
≠
1
t\not =1
t=1,故不存在
a
′
a'
a′ 使得
a
×
a
−
1
≡
1
(
m
o
d
m
)
a\times a^{-1}≡1\pmod m
a×a−1≡1(modm)。而当
(
a
,
m
)
=
1
(a,m)=1
(a,m)=1 时,由欧拉定理(后文有证明),
a
φ
(
m
)
≡
1
(
m
o
d
m
)
a^{\varphi(m)}≡1\pmod m
aφ(m)≡1(modm),因而
a
×
a
φ
(
m
)
−
1
≡
1
(
m
o
d
p
)
a\times a^{\varphi(m)-1}≡1\pmod p
a×aφ(m)−1≡1(modp),故
a
−
1
≡
a
φ
(
m
)
(
m
o
d
p
)
a^{-1}≡a^{\varphi(m)}\pmod p
a−1≡aφ(m)(modp),证毕。
欧拉函数
φ
(
n
)
=
\varphi(n)=
φ(n)= 小于等于
n
n
n 且与
n
n
n 互质的数的个数。即
φ
(
n
)
=
∑
i
=
1
n
[
g
c
d
(
i
,
n
)
=
1
]
\begin{aligned}\varphi(n)=\sum\limits_{i=1}^{n}[gcd(i,n)=1]\end{aligned}
φ(n)=i=1∑n[gcd(i,n)=1]定理 若
p
∈
p
r
i
m
e
p\in prime
p∈prime 则
φ
(
p
)
=
p
−
1
\varphi(p)=p-1
φ(p)=p−1。
证明 因为
p
∈
p
r
i
m
e
p\in prime
p∈prime,故
∀
1
⩽
i
<
p
,
(
i
,
p
)
=
1
\forall 1\leqslant i < p,(i,p)=1
∀1⩽i<p,(i,p)=1,得证。
积性函数 如果对于任意满足
p
,
q
∈
N
∗
,
g
c
d
(
p
,
q
)
=
1
p,q\in N^*,gcd(p,q)=1
p,q∈N∗,gcd(p,q)=1 的
p
p
p 和
q
q
q
\,\qquad\qquad
f
(
q
×
p
)
=
f
(
q
)
×
f
(
p
)
f(q\times p)= f(q)\times f(p)
f(q×p)=f(q)×f(p) 均成立。则
f
f
f 是积性函数。
莫比乌斯函数 μ ( x ) = { 1 , x = 1 ( − 1 ) k , x = p 1 p 2 . . . p k , p i ≠ p j , p i ∈ p r i m e 0 , o t h e r s \mu(x)=\begin{cases}1,& x=1\\(-1)^{k},&x=p_1p_2...p_k,\ p_i\not=p_j,p_i\in prime\\0,& others\end{cases} μ(x)=⎩ ⎨ ⎧1,(−1)k,0,x=1x=p1p2...pk, pi=pj,pi∈primeothers
模运算
a
mod
b
=
a
−
⌊
a
/
b
⌋
×
b
a\ \text{mod}\ b=a-\lfloor a/b\rfloor\times b
a mod b=a−⌊a/b⌋×b,即
a
a
a 除
b
b
b 的余数。
这里引用C++的定义,即
a
mod
b
⇔
a
%
b
a\ \text{mod}\ b⇔a\%b
a mod b⇔a%b
性质
整除的性质
- a ∣ c , b ∣ c , ( a , b ) = 1 ⇒ a b ∣ c a|c,b|c,(a,b)=1⇒ab|c a∣c,b∣c,(a,b)=1⇒ab∣c
- a ∣ b c , ( a , b ) = 1 ⇒ a ∣ c a|bc,(a,b)=1⇒a|c a∣bc,(a,b)=1⇒a∣c
- p ∣ a b ⇒ ( p ∣ a ) ∨ ( p ∣ b ) p|ab⇒(p|a)∨(p|b) p∣ab⇒(p∣a)∨(p∣b),其中 ∨ ∨ ∨表示逻辑或
同余的性质
-
a ≡ b ( m o d m ) ⇔ m ∣ ( a − b ) a≡b\pmod m \Leftrightarrow m|(a-b) a≡b(modm)⇔m∣(a−b)
-
a ≡ b ( m o d m ) ⇔ a − b ≡ 0 ( m o d m ) a≡b\pmod m \Leftrightarrow a-b≡0\pmod m a≡b(modm)⇔a−b≡0(modm)
-
a ≡ b ( m o d m ) ⇔ a c ≡ b c ( m o d m ) a≡b\pmod m \Leftrightarrow ac≡bc\pmod m a≡b(modm)⇔ac≡bc(modm)
-
若 ( c , p ) = 1 (c,p) = 1 (c,p)=1,则 a c ≡ b c ( m o d p ) ⇒ a ≡ b ( m o d p ) ac ≡ bc\pmod p ⇒ a ≡ b\pmod p ac≡bc(modp)⇒a≡b(modp) 。
证明 由于 ( c , p ) = 1 (c,p)=1 (c,p)=1,必然存在 c − 1 c^{-1} c−1 使得 c × c − 1 ≡ 1 ( m o d m ) c\times c^{-1}≡1\pmod m c×c−1≡1(modm)
两边同乘 c − 1 c^{-1} c−1 得 a c ⋅ c − 1 ≡ b c ⋅ c − 1 ( m o d p ) ⇒ a ≡ b ( m o d p ) ac\cdot c^{-1} ≡ bc\cdot c^{-1}\pmod p ⇒ a ≡ b\pmod p ac⋅c−1≡bc⋅c−1(modp)⇒a≡b(modp) -
若 a ≡ b ( m o d p ) , a c ≡ b d ( m o d p ) a≡b\pmod p,ac≡bd\pmod p a≡b(modp),ac≡bd(modp) ,则 c ≡ d ( m o d p ) c≡d\pmod p c≡d(modp) 。
-
a ≡ b ( m o d m ) , a ≡ b ( m o d n ) ⇒ a ≡ b ( m o d [ m , n ] ) a≡b\pmod m,a≡b\pmod n⇒a≡b\pmod{[m,n]} a≡b(modm),a≡b(modn)⇒a≡b(mod[m,n])
证明 ( a − b ) = x m = y n = k × [ m , n ] (a-b)=xm=yn=k\times [m,n] (a−b)=xm=yn=k×[m,n] -
( k , m ) = d , k × a ≡ k × a ′ ( m o d m ) ⇒ a ≡ a ′ ( m o d m d ) (k,m)=d,k\times a≡k\times a'\pmod m⇒a≡a'\pmod{\dfrac{m}{d}} (k,m)=d,k×a≡k×a′(modm)⇒a≡a′(moddm)
证明 ∵ ( k , m ) = d \because (k,m)=d ∵(k,m)=d
∴ \therefore ∴ 必然存在 k k k 和 m m m 使得 k = q × d , m = p × d k=q\times d,m=p\times d k=q×d,m=p×d
∴ k × a − k × a ′ = c × m \therefore k\times a-k\times a'=c\times m ∴k×a−k×a′=c×m
∴ a − a ′ = c × m k = c × m q × d = c q × m d \therefore a-a'=c\times \dfrac{m}{k}=\dfrac{c\times m}{q\times d}=\dfrac{c}{q}\times \dfrac{m}{d} ∴a−a′=c×km=q×dc×m=qc×dm -
若 a c ≡ b c ( m o d m ) ac≡bc\pmod m ac≡bc(modm),且 ( c , m ) = d (c,m)=d (c,m)=d,则 a ≡ b ( m o d m d ) a≡b\pmod{\dfrac{m}{d}} a≡b(moddm)
证明: ∵ a c ≡ b c ( m o d m ) \because ac≡bc\pmod m ∵ac≡bc(modm)
∴ m ∣ a c − b c \therefore m|ac-bc ∴m∣ac−bc
∴ m ∣ c ( a − b ) \therefore m|c(a-b) ∴m∣c(a−b)
又 ( c , m ) = d (c,m)=d (c,m)=d
∴ m d ∣ c d ( a − b ) \therefore {\large\frac md|\frac cd} (a-b) ∴dm∣dc(a−b)
又 ( c d , m d ) = 1 \left(\dfrac cd,\dfrac md\right)=1 (dc,dm)=1
∴ m d ∣ a − b \therefore {\large\frac md|}a-b ∴dm∣a−b 即 a ≡ b ( m o d m d ) a≡b\pmod{\dfrac{m}{d}} a≡b(moddm)
∑ \sum ∑ 的性质
∑ i ( ( ∑ j a j ) b i ) = ∑ i ( ∑ j ( a j b i ) ) = ∑ j ( a j ∑ i b i ) = ( ∑ i b i ) ( ∑ i a i ) \begin{aligned}&\sum_i\left(\left(\sum_j a_j\right)b_i\right)=\sum_i\left(\sum_j \left(a_jb_i\right)\right)\\=&\sum_j \left(a_j \sum_i b_i\right)=\left(\sum_ib_i\right)\left(\sum_ia_i\right)\end{aligned} =i∑((j∑aj)bi)=i∑(j∑(ajbi))j∑(aji∑bi)=(i∑bi)(i∑ai)
证明 乘法分配律。示范:若
a
=
[
1
,
2
,
3
]
,
b
=
[
4
,
5
,
6
]
a=[1,2,3],b=[4,5,6]
a=[1,2,3],b=[4,5,6] 则
∑
i
(
(
∑
j
a
j
)
b
i
)
=
(
1
+
2
+
3
)
∗
4
+
(
1
+
2
+
3
)
∗
5
+
(
1
+
2
+
3
)
∗
6
=
1
∗
4
+
2
∗
4
+
3
∗
4
+
1
∗
5
+
2
∗
5
+
3
∗
5
+
1
∗
6
+
2
∗
6
+
3
∗
6
=
∑
i
(
∑
j
(
a
j
b
i
)
)
=
(
4
+
5
+
6
)
∗
1
+
(
4
+
5
+
6
)
∗
2
+
(
4
+
5
+
6
)
∗
3
=
∑
j
(
a
j
∑
i
b
i
)
\begin{aligned}\sum_i\left(\left(\sum_j a_j\right)b_i\right)&=(1+2+3)*4+(1+2+3)*5+ (1+2+3)*6\\ &=1*4+2*4+3*4+1*5+2*5+3*5+1*6+2*6+3*6\\ &=\sum_i\left(\sum_j \left(a_jb_i\right)\right)\\ &=(4+5+6)*1+(4+5+6)*2+(4+5+6)*3\\ &=\sum_j \left(a_j \sum_i b_i\right)\end{aligned}
i∑((j∑aj)bi)=(1+2+3)∗4+(1+2+3)∗5+(1+2+3)∗6=1∗4+2∗4+3∗4+1∗5+2∗5+3∗5+1∗6+2∗6+3∗6=i∑(j∑(ajbi))=(4+5+6)∗1+(4+5+6)∗2+(4+5+6)∗3=j∑(aji∑bi)
逆元的性质
若
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1,则有:
a
−
1
≡
(
a
%
p
)
−
1
(
m
o
d
p
)
a^{-1}≡(a\%p)^{-1} \pmod p
a−1≡(a%p)−1(modp)
证明:当
a
<
p
a<p
a<p 时,同余式显然成立。否则,有:
a
≡
a
%
p
(
m
o
d
p
)
a≡a\%p\pmod p
a≡a%p(modp)
∵
(
a
,
p
)
=
1
\because\ (a,p)=1
∵ (a,p)=1
(
a
%
p
,
p
)
=
(
a
,
p
)
=
1
(a\%p,p)=(a,p)=1
(a%p,p)=(a,p)=1
必然存在
(
a
%
p
)
−
1
(a\%p)^{-1}
(a%p)−1,使得
(
a
%
p
)
⋅
(
a
%
p
)
−
1
≡
1
(
m
o
d
p
)
(a\%p)\cdot(a\%p)^{-1}≡1\pmod p
(a%p)⋅(a%p)−1≡1(modp)
根据同余的性质3,两边同时乘以
(
a
%
p
)
−
1
(a\%p)^{-1}
(a%p)−1 得
a
(
a
%
p
)
−
1
≡
1
(
m
o
d
p
)
a(a\%p)^{-1}≡1\pmod p
a(a%p)−1≡1(modp)
又
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1,根据同余的性质4,两边同时除以
a
a
a 得
∴
(
a
%
p
)
−
1
≡
a
−
1
(
m
o
d
p
)
\therefore\ (a\%p)^{-1}≡a^{-1}\pmod p
∴ (a%p)−1≡a−1(modp)
快速幂
由于
x
p
=
{
(
x
p
2
)
2
,
p
≡
0
(
m
o
d
2
)
(
x
⌊
p
2
⌋
)
2
×
x
,
p
≡
1
(
m
o
d
2
)
x^p=\begin{cases}(x^{\large\frac p2})^2&,p≡0\pmod 2 \\(x^{\large\lfloor\frac p2\rfloor})^2\times x&,p≡1\pmod 2\end{cases}
xp=⎩
⎨
⎧(x2p)2(x⌊2p⌋)2×x,p≡0(mod2),p≡1(mod2)
因此可以二分
long long pow_mod(long long x, long long n, long long mod){
if(n==1) return x%mod;
long long t=pow_mod(x,n>>1,mod);
if(n&1) return t*t%mod*n%mod;
return t*t%mod;
}
能否转为递归?令
n
=
13
=
(
1101
)
2
n=13=(1101)_2
n=13=(1101)2,则
a
n
=
a
13
=
1
a
8
×
1
a
4
×
0
a
2
×
1
a
1
a^n=a^{13}=1a^8\times 1a^4\times 0a^2\times 1a^1
an=a13=1a8×1a4×0a2×1a1
可以发现,只需要累乘上二进制为1的位置对应的 a a a 的幂即可。
long long pow_mod(long long a,long long k) {
long long base=1;
for(a%=P;k;k>>=1,a=(a*a)%P)
if(k&1) base=(base*a)%P;
return base%P;
}
时间复杂度: Θ ( log 2 p ) Θ(\log_2p) Θ(log2p)
二分乘法
∵
x
×
p
=
{
2
(
x
×
p
2
)
,
p
≡
0
(
m
o
d
2
)
2
(
x
×
⌊
p
2
⌋
)
+
x
,
p
≡
1
(
m
o
d
2
)
\because x\times p= \begin{cases} 2(x\times {\large\frac p2}) & ,p≡0\pmod 2 \\ 2(x\times{\large\lfloor\frac p2\rfloor})+x&,p≡1\pmod 2 \\ \end{cases}
∵x×p={2(x×2p)2(x×⌊2p⌋)+x,p≡0(mod2),p≡1(mod2)
因此可以二分
unsigned long long mul_mod(long long a,long long b,long long m) {
unsigned long long ans=0;
a%=m;
while(b) {
if(b&1) {
ans=(ans+a)%m;
b--;
} b>>=1;
a=(a+a)%m;
} return ans;
}
时间复杂度:
Θ
(
log
2
p
)
Θ(\log_2p)
Θ(log2p)
有什么用吗?如果
x
×
p
x\times p
x×p 会爆
l
o
n
g
l
o
n
g
long\ long
long long 呢?
黑科技预警 Θ ( 1 ) \Theta(1) Θ(1) 快速 l o n g l o n g long\ long long long 无误差乘法
long long mul(long long a,long long b,long long P){
a=(a%P+P)%P,b=(b%P+P)%P;
return ((a*b-(long long)((long double)a/P*b+1e-6)*P)%P+P)%P;
}
主要原理是
(
a
∗
b
)
%
p
=
(
a
∗
b
)
−
⌊
a
∗
b
p
⌋
∗
p
(a*b)\%p=(a*b)-\left\lfloor \dfrac{a*b}{p}\right\rfloor*p
(a∗b)%p=(a∗b)−⌊pa∗b⌋∗p,其中
a
∗
b
a*b
a∗b 和
⌊
a
∗
b
p
⌋
\left\lfloor \dfrac{a*b}{p}\right\rfloor
⌊pa∗b⌋ 都有溢出的可能,但利用C++的特性,溢出位会自然丢失,因而只要两者相减的答案在
l
o
n
g
l
o
n
g
long\ long
long long 范围内,就能保证答案正确。其中使用了 1e-6
来控制
l
o
n
g
d
o
u
b
l
e
long\ double
long double 的误差。
欧几里得算法
结论:
(
a
,
b
)
=
(
b
,
a
mod
b
)
(a,b)=(b,a\ \text{mod}\ b)
(a,b)=(b,a mod b)
证明:
a
a
a 可以表示成
a
=
k
b
+
r
a = kb + r
a=kb+r,则
r
=
a
mod
b
r = a\ \text{mod}\ b
r=a mod b
\qquad\,\;
设
d
d
d 是
a
,
b
a,b
a,b 的一个公约数,则有
d
∣
a
,
d
∣
b
\qquad\,\;d|a, d|b
d∣a,d∣b,而
r
=
a
−
k
b
r = a - kb
r=a−kb,因此
d
∣
r
d|r
d∣r
∴
d
\qquad\,\;\therefore d
∴d 是
(
b
,
a
mod
b
)
(b,a\ \text{mod}\ b)
(b,a mod b)的公约数
\qquad\,\;
设
a
a
a 和
b
b
b 的公约数集合为
A
A
A,
b
b
b 和
a
mod
b
a\ \text{mod}\ b
a mod b 的公约数集合为
B
B
B
\qquad\,\;
则
A
=
B
A=B
A=B,故
(
a
,
b
)
=
(
b
,
a
mod
b
)
(a,b)=(b,a\ \text{mod}\ b)
(a,b)=(b,a mod b)
代码:
int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
时间复杂度(蓝书):
O
(
12
×
ln
2
×
ln
m
i
n
(
a
,
b
)
)
π
2
+
1.47
)
≈
O
(
ln
m
i
n
(
a
,
b
)
)
≈
O
(
l
o
g
2
n
)
O\left(\dfrac{12 \times \ln2 \times \ln min(a,b))}{π ^ 2} + 1.47\right)≈O(\ln min(a,b))≈O(log_2n)
O(π212×ln2×lnmin(a,b))+1.47)≈O(lnmin(a,b))≈O(log2n)
其实根据梅拉定理,所运算的次数一定不会超过较小数的位数的
5
5
5 倍。
吐槽预警 好好的循环不用非要用递归。
long long gcd(long long a,long long b) {
while(b^=a^=b^=a%=b);
return a;
}
黑科技预警 上面的代码都是吃多了的表现。
using std::__gcd;
裴蜀定理
定理:如果
a
,
b
∈
N
,
(
a
,
b
)
=
d
a,b\in N,(a,b)=d
a,b∈N,(a,b)=d 那么一定存在
x
,
y
x,y
x,y 使得
d
∣
(
a
x
+
b
y
)
d|(ax+by)
d∣(ax+by)
证明:
∵
(
a
,
b
)
=
d
\;\because\ (a,b)=d
∵ (a,b)=d
必然存在
p
p
p 和
q
q
q 使得
a
=
p
×
d
,
b
=
q
×
d
a=p\times d,b=q\times d
a=p×d,b=q×d
a
x
+
b
y
=
(
p
×
d
)
x
+
(
q
×
d
)
y
=
d
(
p
×
x
+
q
×
y
)
ax+by=(p\times d)x+(q\times d)y=d(p\times x+q\times y)
ax+by=(p×d)x+(q×d)y=d(p×x+q×y)
d
∣
(
a
x
+
b
y
)
d|(ax+by)
d∣(ax+by)
扩展欧几里得算法
直接作用:在执行欧几里得算法的时候可以顺便求出型如
a
x
+
b
y
=
(
a
,
b
)
ax+by=(a,b)
ax+by=(a,b) 的不定方程的通解。
推导 & 证明:
由原欧几里得算法可得:
(
a
,
b
)
=
(
b
,
a
mod
b
)
(a,b)=(b,a\ \text{mod}\ b)
(a,b)=(b,a mod b)
对于型如
a
x
+
b
y
=
(
a
,
b
)
ax+by=(a,b)
ax+by=(a,b) 的不定方程,根据裴蜀定理,原不定方程一定有解,因而有
a
x
+
b
y
=
(
a
,
b
)
=
(
b
,
a
mod
b
)
=
b
x
′
+
(
a
mod
b
)
y
′
ax+by=(a,b)=(b,a\ \text{mod}\ b)=bx'+(a\ \text{mod}\ b)y'
ax+by=(a,b)=(b,a mod b)=bx′+(a mod b)y′
又因为 a m o d b = a − ⌊ a / b ⌋ × b a\ mod\ b=a-\lfloor a/b\rfloor\times b a mod b=a−⌊a/b⌋×b
因而
a
x
+
b
y
=
b
x
′
+
(
a
−
⌊
a
/
b
⌋
×
b
)
y
′
=
b
x
′
+
a
y
′
−
⌊
a
/
b
⌋
×
b
y
′
=
a
y
′
+
b
x
′
−
⌊
a
/
b
⌋
×
b
y
′
=
a
y
′
+
b
(
x
′
−
⌊
a
/
b
⌋
×
y
′
)
\begin{aligned}\ ax+by&=bx'+(a-\lfloor a/b\rfloor\times b)\,y'\\ \qquad&=bx'+ay'-\lfloor a/b\rfloor\times by' \\ \qquad&=ay'+bx'-\lfloor a/b\rfloor\times by' \\ \qquad&=ay'+b(x'-\lfloor a/b\rfloor\times y')\end{aligned}
ax+by=bx′+(a−⌊a/b⌋×b)y′=bx′+ay′−⌊a/b⌋×by′=ay′+bx′−⌊a/b⌋×by′=ay′+b(x′−⌊a/b⌋×y′)
进而
{
x
=
y
′
y
=
x
′
−
⌊
a
/
b
⌋
×
y
′
\begin{cases}x=y' \\ y=x'-\lfloor a/b\rfloor\times y'\end{cases}
{x=y′y=x′−⌊a/b⌋×y′
然后就可以愉快地递归啦。
边界条件为
x
=
1
,
y
=
0
x=1,y=0
x=1,y=0,此时
b
=
0
b=0
b=0。
其实还可以化简,即在递归的时候,计算exgcd(b,a%b,y,x)
这样回来的时候
y
′
y'
y′ 的值就已经放在
x
x
x 里了,然后再把y-=a/b*x
就行了,当然也可以直接算。
int exgcd(int a,int b,long long &x,long long &y) {
if(!b)
return x=1,y=0,a;
int d=exgcd(b,a%b,y,x);
y-=a/b*x;//化简后的式子
return d;
}
求出的
x
x
x 和
y
y
y 是所有
x
x
x 和
y
y
y 中
∣
x
∣
+
∣
y
∣
|x|+|y|
∣x∣+∣y∣ 最小的,这个结论并没有什么用处,这里就不证了。
可原不定方程不止一组解啊,其实只要有了
x
x
x 和
y
y
y ,其他的解就都出来了。
x
t
=
x
+
b
(
a
,
b
)
×
t
y
t
=
y
−
a
(
a
,
b
)
×
t
\begin{aligned}x_t&=x+\dfrac b{(a,b)}\times t\\ y_t&=y-\dfrac a{(a,b)}\times t\end{aligned}
xtyt=x+(a,b)b×t=y−(a,b)a×t
为什么?代入到原式看看。
(
a
,
b
)
=
a
(
x
+
b
(
a
,
b
)
×
t
)
+
b
(
y
−
a
(
a
,
b
)
×
t
)
=
a
x
+
a
b
(
a
,
b
)
×
t
+
b
y
−
a
b
(
a
,
b
)
×
t
=
a
x
+
b
y
\begin{aligned}(a,b)&=a\left(x+\dfrac b{(a,b)}\times t\right)+b\left(y-\dfrac a{(a,b)}\times t\right)\\ &=ax+\dfrac {ab}{(a,b)}\times t+by-\dfrac {ab}{(a,b)}\times t\\ &=ax+by\end{aligned}
(a,b)=a(x+(a,b)b×t)+b(y−(a,b)a×t)=ax+(a,b)ab×t+by−(a,b)ab×t=ax+by
∴
a
x
+
b
y
=
(
a
,
b
)
\therefore ax+by=(a,b)
∴ax+by=(a,b)
这显然成立
∴
a
x
t
+
b
y
t
=
(
a
,
b
)
\therefore ax_t+by_t=(a,b)
∴axt+byt=(a,b)
可为什么不是
x
t
=
x
+
b
×
t
x_t=x+b\times t
xt=x+b×t
y
t
=
y
−
a
×
t
y_t=y-a\times t
yt=y−a×t
因为
t
∈
Z
t\in Z
t∈Z ,
(
b
(
a
,
b
)
,
a
(
a
,
b
)
)
=
1
\left(\dfrac b{(a,b)},\dfrac a{(a,b)}\right)=1
((a,b)b,(a,b)a)=1
因此
b
(
a
,
b
)
,
a
(
a
,
b
)
\dfrac b{(a,b)},\dfrac a{(a,b)}
(a,b)b,(a,b)a 取到最多的解。
欧拉定理
结论:若存在
p
p
p 和
a
a
a,满足
p
,
a
∈
N
∗
,
(
p
,
a
)
=
1
p,a\in N^*,(p,a)=1
p,a∈N∗,(p,a)=1,则
a
φ
(
p
)
≡
1
(
m
o
d
p
)
a^{\varphi(p)}≡1\pmod p
aφ(p)≡1(modp)
证明:考虑
p
p
p 条同余式,其中
∀
i
⩽
φ
(
p
)
,
m
i
<
p
\forall\ i\leqslant \varphi(p), m_i<p
∀ i⩽φ(p),mi<p,且其中
x
i
x_i
xi 即小于等于
p
p
p 且与
p
p
p 互质的数,即
(
x
i
,
p
)
=
1
(x_i,p)=1
(xi,p)=1 。
{ a × x 1 ≡ m 1 ( m o d p ) ( 1 ) a × x 2 ≡ m 2 ( m o d p ) ( 2 ) ⋯ a × x φ ( p ) ≡ m φ ( p ) ( m o d p ) ( φ ( p ) ) \begin{cases}a\times x_1&≡m_1&\pmod p&&(1)\\ a\times x_2&≡m_2&\pmod p&&(2)\\ &\cdots\\ a\times x_{\varphi(p)}&≡m_{\varphi(p)}&\pmod p&&(\varphi(p))\end{cases} ⎩ ⎨ ⎧a×x1a×x2a×xφ(p)≡m1≡m2⋯≡mφ(p)(modp)(modp)(modp)(1)(2)(φ(p))
定义 X = { x i ∣ 1 ⩽ i ⩽ φ ( p ) } , M = { m i ∣ 1 ⩽ i ⩽ φ ( p ) } X=\{x_i|1\leqslant i\leqslant \varphi(p)\},M=\{m_i|1\leqslant i\leqslant \varphi(p)\} X={xi∣1⩽i⩽φ(p)},M={mi∣1⩽i⩽φ(p)}
引理 1:
∣
M
∣
=
φ
(
p
)
|M|=\varphi(p)
∣M∣=φ(p)
证明:假设存在
i
i
i 和
j
j
j,满足
i
>
j
,
m
i
=
m
j
i>j,m_i=m_j
i>j,mi=mj
则
(
i
)
−
(
j
)
(i)-(j)
(i)−(j) 得
a
(
x
i
−
x
j
)
≡
0
(
m
o
d
p
)
a(x_i-x_j)≡0\pmod p
a(xi−xj)≡0(modp)
又
∵
(
a
,
p
)
=
1
\because (a,p)=1
∵(a,p)=1
∴
x
i
−
x
j
≡
0
(
m
o
d
p
)
\therefore x_i-x_j≡0\pmod p
∴xi−xj≡0(modp)
又
∵
x
i
−
x
j
<
p
\because x_i-x_j<p
∵xi−xj<p
∴
p
∤
(
x
i
−
x
j
)
\therefore p\not|\;\; (x_i-x_j)
∴p∣(xi−xj)
∴
x
i
−
x
j
≢
0
(
m
o
d
p
)
\therefore x_i-x_j\not≡0\pmod p
∴xi−xj≡0(modp),矛盾
∴
\therefore\,
∴不存在
i
i
i 和
j
j
j,满足
i
>
j
,
m
i
=
m
j
i>j,m_i=m_j
i>j,mi=mj
∴
∣
M
∣
=
φ
(
p
)
\therefore |M|=\varphi(p)
∴∣M∣=φ(p)
引理 2:
∀
m
i
,
m
i
∈
X
\forall m_i,m_i\in X
∀mi,mi∈X
证明:
∵
(
a
,
p
)
=
1
,
(
x
i
,
p
)
=
1
\because (a,p)=1,(x_i,p)=1
∵(a,p)=1,(xi,p)=1
∴
(
a
×
x
i
,
p
)
=
1
\therefore (a\times x_i,p)=1
∴(a×xi,p)=1
由欧几里得算法得:
(
p
,
(
a
×
x
i
)
mod
p
)
=
1
(p,(a\times x_i)\ \text{mod}\ p)=1
(p,(a×xi) mod p)=1
∴
(
m
i
,
p
)
=
1
\therefore (m_i,p)=1
∴(mi,p)=1
∴
m
i
∈
X
\therefore m_i\in X
∴mi∈X
又
∵
∣
M
∣
=
∣
X
∣
=
φ
(
p
)
又\because |M|=|X|=\varphi(p)
又∵∣M∣=∣X∣=φ(p)
∴
M
=
X
\therefore M=X
∴M=X
把
φ
(
p
)
\varphi(p)
φ(p) 条式子乘起来,得
∏
i
=
1
φ
(
p
)
(
a
×
x
i
)
≡
∏
i
=
1
φ
(
p
)
m
i
(
m
o
d
p
)
⇒
a
φ
(
p
)
×
∏
i
=
1
φ
(
p
)
x
i
≡
∏
i
=
1
φ
(
p
)
m
i
(
m
o
d
p
)
\begin{aligned}\prod\limits_{i=1}^{\varphi(p)}(a\times x_i)≡\prod\limits^{\varphi(p)}_{i=1}m_i\pmod p ⇒a^{\varphi(p)}\times \prod\limits^{\varphi(p)}_{i=1}x_i≡\prod\limits^{\varphi(p)}_{i=1}m_i\pmod p\end{aligned}
i=1∏φ(p)(a×xi)≡i=1∏φ(p)mi(modp)⇒aφ(p)×i=1∏φ(p)xi≡i=1∏φ(p)mi(modp)
又
∵
∏
i
=
1
φ
(
p
)
x
i
≡
∏
i
=
1
φ
(
p
)
m
i
(
m
o
d
p
)
\begin{aligned}\because\prod\limits^{\varphi(p)}_{i=1}x_i≡\prod\limits^{\varphi(p)}_{i=1}m_i\pmod p\end{aligned}
∵i=1∏φ(p)xi≡i=1∏φ(p)mi(modp)
∴
a
φ
(
p
)
≡
1
(
m
o
d
p
)
\therefore a^{\varphi(p)}≡1\pmod p
∴aφ(p)≡1(modp)
一些应用
若
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1,则
a
b
mod
p
=
a
b
mod
φ
(
p
)
mod
p
a^b\ \text{mod}\ p=a^{b\ \text{mod}\ \varphi(p)}\ \text{mod}\ p
ab mod p=ab mod φ(p) mod p
否则有
a
b
≡
a
m
i
n
(
b
mod
φ
(
p
)
+
φ
(
p
)
,
b
)
mod
p
a^b ≡ a^{min(b\ \text{mod}\ φ(p)+φ(p),b)}\ \text{mod}\ p
ab≡amin(b mod φ(p)+φ(p),b) mod p
费马小定理
结论:若存在
a
a
a 和
p
p
p,满足
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1,且
p
∈
p
r
i
m
e
p\in prime
p∈prime,则
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}≡1 \pmod p
ap−1≡1(modp)
证明:
∵
∀
p
∈
p
r
i
m
e
,
φ
(
p
)
=
p
−
1
\because \forall p\in prime,\varphi(p)=p-1
∵∀p∈prime,φ(p)=p−1
∴
a
p
−
1
≡
a
φ
(
p
)
≡
1
(
m
o
d
p
)
\therefore a^{p-1}≡a^{\varphi(p)}≡1\pmod p
∴ap−1≡aφ(p)≡1(modp) (欧拉定理)
逆元
扩展欧几里得
a
×
x
≡
1
(
m
o
d
p
)
a\times x≡1\pmod p
a×x≡1(modp) 中,
x
=
a
−
1
x=a^{-1}
x=a−1
转化为不定方程
a
x
−
p
y
=
1
ax-py=1
ax−py=1
进一步转化为
a
x
+
p
⋅
(
−
y
)
=
1
ax+p\cdot(-y)=1
ax+p⋅(−y)=1
用扩展欧几里得解不定方程即可,若
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1,则求得的
x
x
x 即为
a
−
1
a^{-1}
a−1。
但要注意,
x
x
x 可能小于
0
0
0,但满足
x
≡
x
+
p
(
m
o
d
p
)
x≡x+p\pmod p
x≡x+p(modp),因此,把
x
x
x 加上一个
p
p
p 即可。
long long inv(long long a,long long n) {
long long x,y;
long long d=exgcd(a,n,x,y);
return d==1?(x+n)%n:-1;
}
时间复杂度: Θ ( ln p ) Θ(\ln p) Θ(lnp)
费马小定理
∵
\because
∵ 当
p
∈
p
r
i
m
e
p\in prime
p∈prime 时,
a
p
−
1
≡
1
(
m
o
d
p
)
,
(
a
,
p
)
=
1
a^{p-1}≡1\pmod p,(a,p)=1
ap−1≡1(modp),(a,p)=1
∴
a
p
−
1
×
a
−
1
≡
1
×
a
−
1
(
m
o
d
p
)
\therefore a^{p-1}\times a^{-1}≡1\times a^{-1}\pmod p
∴ap−1×a−1≡1×a−1(modp)
∴
a
p
−
2
≡
a
−
1
(
m
o
d
p
)
\therefore a^{p-2}≡a^{-1}\pmod p
∴ap−2≡a−1(modp)
∴
a
−
1
≡
a
p
−
2
(
m
o
d
p
)
\therefore a^{-1}≡a^{p-2}\pmod p
∴a−1≡ap−2(modp)
因此 a a a 的逆元即 a p − 2 mod p a^{p-2}\ \text{mod}\ p ap−2 mod p。
#define inv(x,mod) (pow_mod(x,mod-2,mod))
时间复杂度: Θ ( log 2 ( m o d − 2 ) ) Θ(\log_2(mod-2)) Θ(log2(mod−2))
欧拉定理
∵
\because
∵当
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1 时,
a
φ
(
p
)
≡
1
(
m
o
d
p
)
a^{\varphi(p)}≡1\pmod p
aφ(p)≡1(modp)。
∴
a
φ
(
p
)
×
a
−
1
≡
1
×
a
−
1
(
m
o
d
p
)
\therefore a^{\varphi(p)}\times a^{-1}≡1\times a^{-1}\pmod p
∴aφ(p)×a−1≡1×a−1(modp)
∴
a
φ
(
p
)
−
1
≡
a
−
1
(
m
o
d
p
)
\therefore a^{\varphi(p)-1}≡a^{-1}\pmod p
∴aφ(p)−1≡a−1(modp)
∴
a
−
1
≡
a
φ
(
p
)
−
1
(
m
o
d
p
)
\therefore a^{-1}≡a^{\varphi(p)-1}\pmod p
∴a−1≡aφ(p)−1(modp)
因此
a
a
a 的逆元即
a
φ
(
p
)
−
1
mod
p
a^{\varphi(p)-1}\ \text{mod}\ p
aφ(p)−1 mod p。
时间复杂度:
Θ
(
求
φ
(
n
)
的时间
+
log
2
(
φ
(
p
)
−
1
)
)
Θ(求\varphi(n)的时间+\log_2(\varphi(p)-1))
Θ(求φ(n)的时间+log2(φ(p)−1))
线性求逆元
显然地,
1
−
1
≡
1
(
m
o
d
p
)
1^{-1}≡1\pmod p
1−1≡1(modp)
对于
i
(
i
>
1
)
i(i>1)
i(i>1),必然存在
k
k
k 和
r
r
r,使得
p
=
k
×
i
+
r
p=k\times i+r
p=k×i+r,满足
r
<
i
,
1
<
i
<
p
r<i,1<i<p
r<i,1<i<p。
∵
p
≡
0
(
m
o
d
p
)
\because p≡0\pmod p
∵p≡0(modp)
∴
k
×
i
+
r
≡
0
(
m
o
d
p
)
\therefore k\times i+r≡0\pmod p
∴k×i+r≡0(modp)
∴
(
k
×
i
+
r
)
×
(
i
−
1
×
r
−
1
)
≡
0
×
(
i
−
1
×
r
−
1
)
(
m
o
d
p
)
\therefore (k\times i+r)\times (i^{-1}\times r^{-1})≡0\times (i^{-1}\times r^{-1})\pmod p
∴(k×i+r)×(i−1×r−1)≡0×(i−1×r−1)(modp)
∴
k
×
i
×
i
−
1
×
r
−
1
+
r
×
i
−
1
×
r
−
1
≡
0
(
m
o
d
p
)
\therefore k\times i\times i^{-1}\times r^{-1}+r\times i^{-1}\times r^{-1}≡0\pmod p
∴k×i×i−1×r−1+r×i−1×r−1≡0(modp)
∴
k
×
r
−
1
+
i
−
1
≡
0
(
m
o
d
p
)
\therefore k\times r^{-1}+i^{-1}≡0\pmod p
∴k×r−1+i−1≡0(modp)
∴
i
−
1
≡
−
k
×
r
−
1
(
m
o
d
p
)
\therefore i^{-1}≡-k\times r^{-1}\pmod p
∴i−1≡−k×r−1(modp)
又
∵
k
=
⌊
p
i
⌋
,
r
=
p
mod
i
又\because k=\lfloor \frac pi\rfloor,r=p\ \text{mod}\ i
又∵k=⌊ip⌋,r=p mod i
∴
i
−
1
≡
−
⌊
p
i
⌋
×
(
p
mod
i
)
−
1
(
m
o
d
p
)
\therefore i^{-1}≡-\lfloor \frac pi\rfloor\times (p\ \text{mod}\ i)^{-1}\pmod p
∴i−1≡−⌊ip⌋×(p mod i)−1(modp)
∴
i
−
1
≡
p
−
⌊
p
i
⌋
×
(
p
mod
i
)
−
1
(
m
o
d
p
)
\therefore i^{-1}≡p-\lfloor \frac pi\rfloor\times (p\ \text{mod}\ i)^{-1}\pmod p
∴i−1≡p−⌊ip⌋×(p mod i)−1(modp)
因为在计算
i
i
i 之前,
(
p
mod
i
)
−
1
(p\ \text{mod}\ i)^{-1}
(p mod i)−1 一定已经被算出来了,因此可以愉快地递推了。
代码
(
i
n
v
[
i
]
表示
i
−
1
)
(inv[i]表示i^{-1})
(inv[i]表示i−1):
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=((long long)(mod-mod/i)*inv[mod%i])%mod;
时间复杂度: Θ ( n ) Θ(n) Θ(n)
神奇“逆元”
逆元都必须在当
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1 时才存在,那如果题目没有保证
(
a
,
p
)
=
1
(a,p)=1
(a,p)=1 呢?可以用下面的式子。
结论:
a
b
mod
p
=
a
mod
(
b
p
)
b
\dfrac ab\ \text{mod}\ p=\dfrac{a\ \text{mod}\ (bp)}b
ba mod p=ba mod (bp)证明:
a
b
mod
p
=
a
b
−
⌊
a
b
p
⌋
×
p
=
a
b
−
⌊
a
p
b
⌋
×
p
=
a
b
−
⌊
a
p
b
⌋
×
b
×
p
b
=
a
b
−
⌊
a
p
b
⌋
×
p
b
b
=
a
−
⌊
a
p
b
⌋
×
p
b
b
=
a
mod
(
p
b
)
b
\begin{aligned}\dfrac ab\ \text{mod}\ p&=\dfrac ab-\lfloor \dfrac{\frac ab}{p} \rfloor\times p\\ &=\dfrac ab-⌊\dfrac{a}{pb}⌋\times p\\ &=\dfrac ab-⌊\dfrac{a}{pb}⌋\times b\times \dfrac pb\\ &=\dfrac ab-\dfrac {⌊\dfrac{a}{pb}⌋\times pb}{b}\\ &=\dfrac {a-⌊\dfrac{a}{pb}⌋\times pb}{b}\\ &=\dfrac{a\ \text{mod}\ (pb)}b\end{aligned}
ba mod p=ba−⌊pba⌋×p=ba−⌊pba⌋×p=ba−⌊pba⌋×b×bp=ba−b⌊pba⌋×pb=ba−⌊pba⌋×pb=ba mod (pb)
但
p
b
pb
pb 可能爆
l
o
n
g
l
o
n
g
long\ long
long long,因此在计算时需要用到二分乘法。
阶乘的逆元
如果让你求出
(
i
!
)
−
1
%
p
(
1
⩽
i
<
p
)
(i!)^{-1}\%p\quad(1\leqslant i< p)
(i!)−1%p(1⩽i<p),你会需要多少时间?
很显然,按照之前的方法需要
O
(
n
log
2
n
)
O(n\log_2n)
O(nlog2n)
这里有一种方法可以把时间复杂度降低到
O
(
n
+
log
2
n
)
O(n+\log_2n)
O(n+log2n)
显然地,有
(
x
!
)
−
1
≡
1
x
!
(
m
o
d
p
)
(x!)^{-1}≡\dfrac{1}{x!}\pmod p
(x!)−1≡x!1(modp)
根据同余的性质3两边同时乘以
x
x
x ,得:
[
(
x
−
1
)
!
]
−
1
≡
1
(
x
−
1
)
!
(
m
o
d
p
)
[(x-1)!]^{-1}≡\dfrac{1}{(x-1)!}\pmod p
[(x−1)!]−1≡(x−1)!1(modp)
那就可以先预处理出
(
n
!
)
−
1
(n!)^{-1}
(n!)−1,然后反着推回去。
其中求
(
n
!
)
−
1
(n!)^{-1}
(n!)−1 的时候用到逆元的性质。
fac[0]=1;
for(int i=1;i<p;i++)//阶乘预处理
fac[i]=fac[i-1]*i%p;
fac_inv[p-1]=inv(fac[p-1],p);//计算阶乘逆元
for(int i=p-2;i>=0;i--)//倒推
fac_inv[i]=fac_inv[i+1]*(i+1)%p;
时间复杂度:求
p
!
p!
p! 需要
O
(
p
)
O(p)
O(p),求
(
p
!
)
−
1
(p!)^{-1}
(p!)−1 需要
O
(
log
2
n
)
O(\log_2n)
O(log2n),逆推需要
O
(
n
)
O(n)
O(n)
因此,渐进时间复杂度为
O
(
n
+
log
2
n
)
O(n+\log_2n)
O(n+log2n)
可是为什么这里只到
(
p
−
1
)
−
1
(p-1)^{-1}
(p−1)−1 呢?
因为
p
!
,
(
p
+
1
)
!
,
…
p!,(p+1)!,\dots
p!,(p+1)!,…对
p
p
p 取模得
0
0
0,因此它们的逆元相当于
0
0
0 的逆元,并不存在。(逆元的性质)
二元一次不定方程
形如
a
x
+
b
y
=
c
ax+by=c
ax+by=c 的方程称为二元一次不定方程。
解法
先利用扩展欧几里得算法求解出不定方程
a
x
′
+
b
y
′
=
(
a
,
b
)
ax'+by'=(a,b)
ax′+by′=(a,b)
设
k
=
c
(
a
,
b
)
k=\dfrac{c}{(a,b)}
k=(a,b)c
∴
(
a
x
′
+
b
y
′
)
×
k
=
(
a
,
b
)
×
k
\therefore (ax'+by')\times k=(a,b)\times k
∴(ax′+by′)×k=(a,b)×k
∴
(
a
x
′
+
b
y
′
)
×
k
=
(
a
,
b
)
×
c
(
a
,
b
)
\therefore (ax'+by')\times k=(a,b)\times \dfrac{c}{(a,b)}
∴(ax′+by′)×k=(a,b)×(a,b)c
∴
a
x
′
k
+
b
y
′
k
=
c
\therefore ax'k+by'k=c
∴ax′k+by′k=c
∴
x
=
x
′
k
,
y
=
y
′
k
\therefore x=x'k,y=y'k
∴x=x′k,y=y′k
代码:
int Dioequ(int a,int b,int c,long long &x,long long &y){
int d=exgcd(a,b,x,y);
int k=c/d;
x*=k;y*=k;
}
类似地,也满足
∣
x
∣
+
∣
y
∣
|x|+|y|
∣x∣+∣y∣ 最小。
类似地,也可以利用
x
x
x和
y
y
y求出所有解。
x
t
=
x
−
b
(
a
,
b
)
×
t
y
t
=
y
+
a
(
a
,
b
)
×
t
\begin{aligned}x_t&=x-\frac{b}{(a,b)}\times t\\ y_t&=y+\frac{a}{(a,b)}\times t\end{aligned}
xtyt=x−(a,b)b×t=y+(a,b)a×t证明见扩展欧几里得算法。
同余方程
类似地,含有未知数的同余式称为同余方程。分为如下几类。
一元线性同余方程
定义:形如
a
x
≡
b
(
m
o
d
p
)
ax≡b\pmod p
ax≡b(modp) 的方程称为线性同余方程,其中,
a
b
ab
ab 均为整数,
m
m
m 为正整数。
可以发现,同余式两边同乘以模
m
m
m 意义下
a
−
1
a^{-1}
a−1 就好了……
但新的一个问题来了,我们要怎么求出所有的解呢?
这个问题LZ至今不会,因此还是换一种方法吧。
可以发现,线性同余方程
a
x
≡
b
(
m
o
d
m
)
ax≡b\pmod m
ax≡b(modm) 等价于不定方程
a
x
+
m
y
=
b
ax+my=b
ax+my=b
然后就可以愉快地用扩展欧几里得算法解啦!因此所有的解集为:
{
x
+
t
×
b
(
a
,
b
)
∣
0
⩽
t
<
(
a
,
b
)
}
\quad\{x+t\times \frac b{(a,b)}|0\leqslant t<(a,b) \}
{x+t×(a,b)b∣0⩽t<(a,b)}
为什么
t
t
t 只到
(
a
,
b
)
−
1
(a,b)-1
(a,b)−1?因为从
(
a
,
b
)
(a,b)
(a,b) 开始循环了。可那又是为什么?
设存在
t
i
t_i
ti 和
t
j
t_j
tj,满足
0
⩽
t
i
<
m
,
t
j
≡
t
i
+
(
a
,
b
)
(
m
o
d
m
)
{0\leqslant t_i<m,t_j≡t_i+(a,b)\pmod m}
0⩽ti<m,tj≡ti+(a,b)(modm),且
x
+
t
i
×
m
(
a
,
b
)
≢
x
+
t
j
×
m
(
a
,
b
)
(
m
o
d
m
)
{x+t_i\times \frac m{(a,b)}\not≡x+t_j\times \dfrac m{(a,b)}\pmod m}
x+ti×(a,b)m≡x+tj×(a,b)m(modm)
∴
t
i
×
m
(
a
,
b
)
≢
t
j
×
m
(
a
,
b
)
(
m
o
d
m
)
\therefore t_i\times \dfrac m{(a,b)}\not≡t_j\times \frac m{(a,b)}\pmod m
∴ti×(a,b)m≡tj×(a,b)m(modm)
又
∵
m
(
a
,
b
)
∣
m
\because \frac m{(a,b)}|m
∵(a,b)m∣m
∴
(
m
(
a
,
b
)
,
m
)
=
m
(
a
,
b
)
\therefore(\frac m{(a,b)},m)=\frac m{(a,b)}
∴((a,b)m,m)=(a,b)m
根据(不)同余的性质8,可得:
t
i
≢
t
j
(
m
o
d
(
a
,
b
)
)
\quad t_i\not≡t_j\pmod {(a,b)}
ti≡tj(mod(a,b))
t
i
≢
t
i
+
(
a
,
b
)
(
m
o
d
(
a
,
b
)
)
\quad t_i\not≡t_i+(a,b)\pmod {(a,b)}
ti≡ti+(a,b)(mod(a,b))
t
i
≢
t
i
(
m
o
d
(
a
,
b
)
)
\quad t_i\not≡t_i\pmod {(a,b)}
ti≡ti(mod(a,b))
矛盾。故从
(
a
,
b
)
(a,b)
(a,b) 开始,
x
x
x 出现循环。
而最后得到的式子也告诉我们,只有
(
a
,
b
)
(a,b)
(a,b) 个不同的解。
中国剩余定理
如果方程有多个,但是未知数仍然只有一个怎么办?先来考虑所有
m
i
m_i
mi 互质的情况。
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
⋮
x
≡
a
n
(
m
o
d
m
n
)
∀
i
≠
j
,
(
m
i
,
m
j
)
=
1
/
/
互质
\begin{cases}x≡a_1\pmod{m_1}\\x≡a_2\pmod{m_2}\\\qquad\vdots\\x≡a_n\pmod{m_n}\\ \forall i\not=j,(m_i,m_j)=1&//互质\end{cases}
⎩
⎨
⎧x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)∀i=j,(mi,mj)=1//互质
令
M
=
∏
i
=
1
n
m
i
M=\prod\limits_{i=1}^n m_i
M=i=1∏nmi,
w
i
=
M
m
i
w_i=\dfrac M{m_i}
wi=miM,由于所有的
m
i
m_i
mi 互质,有
(
w
i
,
m
i
)
=
1
(w_i,m_i)=1
(wi,mi)=1。
用扩展欧几里得求不定方程
p
i
p_i
pi 和
q
i
q_i
qi,满足
w
i
p
i
+
m
i
q
i
=
(
w
i
,
m
i
)
=
1
w_ip_i+m_iq_i=(w_i,m_i)=1
wipi+miqi=(wi,mi)=1
令
e
i
=
w
i
p
i
e_i=w_ip_i
ei=wipi 则方程组等价于
x
≡
∑
i
=
1
n
e
i
a
i
(
m
o
d
M
)
x≡\sum\limits_{i=1}^ne_ia_i\pmod M
x≡i=1∑neiai(modM)
证明:方程组等价于
x
≡
∑
i
=
1
n
e
i
a
i
(
m
o
d
M
)
{\begin{aligned}x≡\sum\limits_{i=1}^ne_ia_i\pmod M\end{aligned}}
x≡i=1∑neiai(modM)
当且仅当对于所有的
1
⩽
k
⩽
n
1\leqslant k\leqslant n
1⩽k⩽n,有
∑
i
=
1
n
e
i
a
i
≡
a
k
(
m
o
d
m
k
)
{\begin{aligned}\sum\limits_{i=1}^ne_ia_i≡a_k\pmod {m_k}\end{aligned}}
i=1∑neiai≡ak(modmk)
Part 1:
∵
w
t
p
t
+
m
t
q
t
=
1
∴
e
t
≡
w
t
p
t
≡
1
(
m
o
d
m
t
)
∴
e
t
a
t
≡
a
t
(
m
o
d
m
t
)
\begin{aligned} \because&\ w_tp_t+m_tq_t=1\\ \therefore&\ e_t≡w_tp_t≡1\pmod {m_t}\\ \therefore&\ e_ta_t≡a_t\pmod {m_t}\\ \end{aligned}
∵∴∴ wtpt+mtqt=1 et≡wtpt≡1(modmt) etat≡at(modmt)
Part 2:令
t
≠
k
t\not=k
t=k,则
∵
M
=
∏
i
=
1
n
m
i
,
w
i
=
M
m
i
∴
m
k
∣
w
t
∴
w
t
≡
0
(
m
o
d
m
k
)
∴
e
t
a
t
≡
w
t
p
t
a
t
≡
0
×
p
t
a
t
≡
0
(
m
o
d
m
k
)
\begin{aligned} \because&\ M=\prod\limits_{i=1}^n m_i,w_i=\dfrac M{m_i}\\ \therefore&\ m_k|w_t\\ \therefore&\ w_t≡0\pmod {m_k}\\ \therefore&\ e_ta_t≡w_tp_ta_t≡0\times p_ta_t≡0\pmod {m_k}\\ \end{aligned}
∵∴∴∴ M=i=1∏nmi,wi=miM mk∣wt wt≡0(modmk) etat≡wtptat≡0×ptat≡0(modmk)
综上,有:
∑
i
=
1
n
e
i
a
i
≡
∑
i
=
1
,
i
≠
k
n
e
i
a
i
+
∑
i
=
k
e
i
a
i
≡
∑
i
=
1
,
i
≠
k
n
0
+
e
k
a
k
≡
a
k
(
m
o
d
m
k
)
{\begin{aligned} \sum_{i=1}^ne_ia_i&≡\sum_{i=1,i\not=k}^ne_ia_i+\sum_{i=k}e_ia_i\\ &≡\sum_{i=1,i\not=k}^n0+e_ka_k\\ &≡a_k\pmod {m_k}\end{aligned}}
i=1∑neiai≡i=1,i=k∑neiai+i=k∑eiai≡i=1,i=k∑n0+ekak≡ak(modmk)
long long china(int n,int *a,int *m){
long long M=1,p,q,x=0;
for(int i=1;i<=n;i++)
M*=m[i];//计算M
for(int i=1;i<=n;i++){
long long w=M/m[i]; //计算w[i]
exgcd(w,m[i],p,q); //解不定方程(q是废的)
x=(x+p*w*a[i])%M; //累加答案
}
return (x+M)%M;
}
扩展中国剩余定理
中国剩余定理的作用域仅仅包括
∀
i
≠
j
,
(
m
i
,
m
j
)
=
1
\forall i\not=j,(m_i,m_j)=1
∀i=j,(mi,mj)=1 的同余方程组,那不满足这一条件的方程组又要如何?用扩展中国剩余定理。
首先要知道,中国剩余定理和扩展中国剩余定理半毛钱关系也没有。 那么先来考虑两个同余式的情况(
m
1
,
m
2
,
c
1
,
c
2
m_1,m_2,c_1,c_2
m1,m2,c1,c2 已知):
{
x
≡
c
1
(
m
o
d
m
1
)
x
≡
c
2
(
m
o
d
m
2
)
\begin{cases}x≡c_1\pmod {m_1}\\ x≡c_2\pmod {m_2} \end{cases}
{x≡c1(modm1)x≡c2(modm2)
稍作变形:
{
x
=
c
1
+
m
1
k
1
(
1
)
x
=
c
2
+
m
2
k
2
\begin{cases} x=c_{1}+m_{1}k_{1}&(1)\\ x=c_{2}+m_{2}k_{2} \end{cases}
{x=c1+m1k1x=c2+m2k2(1)
联立,有:
c
1
+
m
1
k
1
=
c
2
+
m
2
k
2
\ \,c_1+m_1k_1=c_2+m_2k_2
c1+m1k1=c2+m2k2
移项,得:
m
1
k
1
=
c
2
−
c
1
+
m
2
k
2
m_1k_1=c_2-c_1+m_2k_2
m1k1=c2−c1+m2k2
两边同时除以
(
m
1
,
m
2
)
(m_1,m_2)
(m1,m2),得:
m
1
k
1
(
m
1
,
m
2
)
=
c
2
−
c
1
(
m
1
,
m
2
)
+
m
2
k
2
(
m
1
,
m
2
)
m
1
(
m
1
,
m
2
)
k
1
=
c
2
−
c
1
(
m
1
,
m
2
)
+
m
2
(
m
1
,
m
2
)
k
2
\begin{aligned} \dfrac {m_{1}k_{1}}{\left( m_{1},m_{2}\right) }&=\dfrac {c_{2}-c_{1}}{\left( m_{1},m_{2}\right) }+\dfrac {m_{2}k_{2}}{\left( m_{1},m_{2}\right) }\\ \dfrac {m_{1}}{\left( m_{1},m_{2}\right) }k_{1}&=\dfrac {c_{2}-c_{1}}{\left( m_{1},m_{2}\right) }+\dfrac {m_{2}}{\left( m_{1},m_{2}\right) }k_{2}\\ \end{aligned}
(m1,m2)m1k1(m1,m2)m1k1=(m1,m2)c2−c1+(m1,m2)m2k2=(m1,m2)c2−c1+(m1,m2)m2k2
同时模
m
2
(
m
1
,
m
2
)
\dfrac {m_{2}}{( m_{1},m_{2})}
(m1,m2)m2,得:
m
1
(
m
1
,
m
2
)
k
1
≡
c
2
−
c
1
(
m
1
,
m
2
)
(
m
o
d
m
2
(
m
1
,
m
2
)
)
\dfrac {m_{1}}{\left( m_{1},m_{2}\right) }k_{1} \equiv \dfrac {c_{2}-c_{1}}{\left( m_{1},m_{2}\right) } \pmod{\dfrac {m_{2}}{( m_{1},m_{2})}}
(m1,m2)m1k1≡(m1,m2)c2−c1(mod(m1,m2)m2)
至此,我们成功地消去了
k
2
k_2
k2。
同余式两边同除
m
1
(
m
1
,
m
2
)
\dfrac {m_{1}}{\left( m_{1},m_{2}\right) }
(m1,m2)m1,得:
k
1
≡
c
2
−
c
1
(
m
1
,
m
2
)
×
(
m
1
(
m
1
,
m
2
)
)
−
1
(
m
o
d
m
2
(
m
1
,
m
2
)
)
\begin{aligned} k_1\equiv {c_2-c_1\over (m_1,m_2)}\times \left({m_1\over(m_1,m_2)}\right)^{-1}\pmod {{m_2\over(m_1,m_2)}} \end{aligned}
k1≡(m1,m2)c2−c1×((m1,m2)m1)−1(mod(m1,m2)m2)
因此,有:
k
1
=
(
m
1
(
m
1
,
m
2
)
)
−
1
∗
c
2
−
c
1
(
m
1
,
m
2
)
+
m
2
(
m
1
,
m
2
)
∗
y
\begin{aligned} k_1=\bigg({m_1\over(m_1,m_2)}\bigg)^{-1}*{c_2-c_1\over (m_1,m_2)}+{{m_2\over (m_1,m_2)}}*y \end{aligned}
k1=((m1,m2)m1)−1∗(m1,m2)c2−c1+(m1,m2)m2∗y
注意此处的逆元仍然是模
m
2
(
m
1
,
m
2
)
{\dfrac{m_2}{(m_1,m_2)}}
(m1,m2)m2 意义下的。
代回到
(
1
)
(1)
(1) 式中,得:
x
=
c
1
+
m
1
(
(
m
1
(
m
1
,
m
2
)
)
−
1
∗
c
2
−
c
1
(
m
1
,
m
2
)
+
m
2
(
m
1
,
m
2
)
∗
y
)
=
m
1
∗
(
m
1
(
m
1
,
m
2
)
)
−
1
∗
c
2
−
c
1
(
m
1
,
m
2
)
+
m
1
m
2
(
m
1
,
m
2
)
∗
y
+
c
1
\begin{aligned} x&=c_{1}+m_{1}\left(\left({m_1\over(m_1,m_2)}\right)^{-1}*{c_2-c_1\over (m_1,m_2)}+{{m_2\over (m_1,m_2)}}*y\right)\\ &=m_1*\left({m_1\over(m_1,m_2)}\right)^{-1}*{c_2-c_1\over (m_1,m_2)}+{{\frac{m_1m_2}{(m_1,m_2)}}}*y+c_{1}\\ \end{aligned}
x=c1+m1(((m1,m2)m1)−1∗(m1,m2)c2−c1+(m1,m2)m2∗y)=m1∗((m1,m2)m1)−1∗(m1,m2)c2−c1+(m1,m2)m1m2∗y+c1因而有
x
≡
m
1
∗
(
m
1
(
m
1
,
m
2
)
)
−
1
∗
c
2
−
c
1
(
m
1
,
m
2
)
+
c
1
(
m
o
d
m
2
(
m
1
,
m
2
)
)
\begin{aligned} x≡m_1*\left({m_1\over(m_1,m_2)}\right)^{-1}*{c_2-c_1\over (m_1,m_2)}+c_{1}\pmod {\dfrac{m_2}{(m_1,m_2)}} \end{aligned}
x≡m1∗((m1,m2)m1)−1∗(m1,m2)c2−c1+c1(mod(m1,m2)m2)
至此,同余式右侧的所有元素都已经知道了,因此可以直接求解。如此对 k k k 个同余式两两合并即可。
等等!如果
c
2
−
c
1
(
m
1
,
m
2
)
{\dfrac{c_2-c_1}{(m_1,m_2)}}
(m1,m2)c2−c1 不是整数呢?换句话说,如果
(
m
1
,
m
2
)
∤
(
c
2
−
c
1
)
(m_1,m_2)\not|\;(c_2-c_1)
(m1,m2)∣(c2−c1) 那该如何是好?不需要求逆元吗?
事实上,并不需要求逆元,因为如果
(
m
1
,
m
2
)
∤
(
c
2
−
c
1
)
(m_1,m_2)\not|\;(c_2-c_1)
(m1,m2)∣(c2−c1),则该同余方程组无解
shank’s 大步小步算法
(坑)
Part 2
文章太长,后一部分点这里