作者的话:
在标题的"(坑)"删除前,谢绝转载。因为还会更新。
这是一篇从初中写到高中的文章,由于水平有限,如有错误请指出,谢谢!
本文将力图理性地证明所有定理(除非太过于显然的定理)
定义
数论 数论是纯粹数学的分支之一,主要研究 整数 的性质。
连加 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的\ i1⩽i⩽n的 i,满足 i 2 ≠ 0 i^2\not=0i2=0
集合
- R RR 实数集合
- Q QQ 有理数集合
- Z ZZ 整数集合
- N NN 自然数集合
- N ∗ N^*N∗ 正整数集合
- p r i m e primeprime 质数集合
- a ∈ B ⇔ a a\in B ⇔aa∈B⇔a 属于集合 B BB
- a ∉ B ⇔ a a\not\in B ⇔aa∈B⇔a 不属于集合 B BB
- { 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 prime1⩽x⩽n,x∈prime 的所有 x 2 x^2x2 组成的集合
⇔ ⇔⇔"1 11 到 n nn 中所有质数"的平方组成的集合 - ∣ S ∣ ⇔ |S|⇔∣S∣⇔ 集合 S SS 的大小
整除 a ∣ b ⇔ a a|b⇔aa∣b⇔a 是 b bb 的约数
a ∤ a\not|\;a∣ b ⇔ a b⇔ab⇔a 不是 b bb 的约数(由于\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}\ ma≡b(modm)⇔a mod m=b mod m
逆元 若 a × a − 1 ≡ 1 ( m o d m ) a\times a^{-1}≡1\pmod ma×a−1≡1(modm),则 a − 1 a^{-1}a−1 即为 a aa 的逆元。
定理 当且仅当 ( 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 ma×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=ta×a′+k×m=t,则 t mod d = 0 t\ \text{mod}\ d=0t mod d=0,因而 t ≠ 1 t\not =1t=1,故不存在 a ′ a'a′ 使得 a × a − 1 ≡ 1 ( m o d m ) a\times a^{-1}≡1\pmod ma×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 maφ(m)≡1(modm),因而a × a φ ( m ) − 1 ≡ 1 ( m o d p ) a\times a^{\varphi(m)-1}≡1\pmod pa×aφ(m)−1≡1(modp),故 a − 1 ≡ a φ ( m ) ( m o d p ) a^{-1}≡a^{\varphi(m)}\pmod pa−1≡aφ(m)(modp),证毕。
欧拉函数 φ ( n ) = \varphi(n)=φ(n)= 小于等于 n nn 且与 n nn 互质的数的个数。即 φ ( 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 primep∈prime 则 φ ( p ) = p − 1 \varphi(p)=p-1φ(p)=p−1。
证明 因为 p ∈ p r i m e p\in primep∈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)=1p,q∈N∗,gcd(p,q)=1 的 p pp 和 q qq
\,\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 ff 是积性函数。
莫比乌斯函数 μ ( 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 ba mod b=a−⌊a/b⌋×b,即 a aa 除 b bb 的余数。
这里引用C++的定义,即 a mod b ⇔ a % b a\ \text{mod}\ b⇔a\%ba mod b⇔a%b
性质
整除的性质
- a ∣ c , b ∣ c , ( a , b ) = 1 ⇒ a b ∣ c a|c,b|c,(a,b)=1⇒ab|ca∣c,b∣c,(a,b)=1⇒ab∣c
- a ∣ b c , ( a , b ) = 1 ⇒ a ∣ c a|bc,(a,b)=1⇒a|ca∣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 ma≡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 ma≡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 pac≡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 mc×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 pac⋅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 pa≡b(modp),ac≡bd(modp) ,则 c ≡ d ( m o d p ) c≡d\pmod pc≡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 kk 和 m mm 使得 k = q × d , m = p × d k=q\times d,m=p\times dk=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 mac≡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 pa−1≡(a%p)−1(modp)
证明:当 a < p a<pa<p 时,同余式显然成立。否则,有:
a ≡ a % p ( m o d p ) a≡a\%p\pmod pa≡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 pa(a%p)−1≡1(modp)
又 ( a , p ) = 1 (a,p)=1(a,p)=1,根据同余的性质4,两边同时除以 a aa 得
∴ ( 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)_2n=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^1an=a13=1a8×1a4×0a2×1a1
可以发现,只需要累乘上二进制为1的位置对应的 a aa 的幂即可。
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 px×p 会爆 l o n g l o n g long\ longlong long 呢?
黑科技预警 Θ ( 1 ) \Theta(1)Θ(1) 快速 l o n g l o n g long\ longlong 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*ba∗b 和 ⌊ a ∗ b p ⌋ \left\lfloor \dfrac{a*b}{p}\right\rfloor⌊pa∗b⌋ 都有溢出的可能,但利用C++的特性,溢出位会自然丢失,因而只要两者相减的答案在 l o n g l o n g long\ longlong long 范围内,就能保证答案正确。其中使用了 1e-6 来控制 l o n g d o u b l e long\ doublelong double 的误差。
欧几里得算法
结论:( a , b ) = ( b , a mod b ) (a,b)=(b,a\ \text{mod}\ b)(a,b)=(b,a mod b)
证明:a aa 可以表示成 a = k b + r a = kb + ra=kb+r,则 r = a mod b r = a\ \text{mod}\ br=a mod b
\qquad\,\;设 d dd 是 a , b a,ba,b 的一个公约数,则有
d ∣ a , d ∣ b \qquad\,\;d|a, d|bd∣a,d∣b,而 r = a − k b r = a - kbr=a−kb,因此 d ∣ r d|rd∣r
∴ d \qquad\,\;\therefore d∴d 是( b , a mod b ) (b,a\ \text{mod}\ b)(b,a mod b)的公约数
\qquad\,\;设 a aa 和 b bb 的公约数集合为 A AA,b bb 和 a mod b a\ \text{mod}\ ba mod b 的公约数集合为 B BB
\qquad\,\;则 A = B A=BA=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 55 倍。
吐槽预警 好好的循环不用非要用递归。
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)=da,b∈N,(a,b)=d 那么一定存在 x , y x,yx,y 使得 d ∣ ( a x + b y ) d|(ax+by)d∣(ax+by)
证明:∵ ( a , b ) = d \;\because\ (a,b)=d∵ (a,b)=d
必然存在 p pp 和 q qq 使得 a = p × d , b = q × d a=p\times d,b=q\times da=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 ba 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=0x=1,y=0,此时 b = 0 b=0b=0。
其实还可以化简,即在递归的时候,计算exgcd(b,a%b,y,x)这样回来的时候 y ′ y'y′ 的值就已经放在 x xx 里了,然后再把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 xx 和 y yy 是所有 x xx 和 y yy 中 ∣ x ∣ + ∣ y ∣ |x|+|y|∣x∣+∣y∣ 最小的,这个结论并没有什么用处,这里就不证了。
可原不定方程不止一组解啊,其实只要有了 x xx 和 y yy ,其他的解就都出来了。
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 txt=x+b×t
y t = y − a × t y_t=y-a\times tyt=y−a×t
因为 t ∈ Z t\in Zt∈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 pp 和 a aa,满足 p , a ∈ N ∗ , ( p , a ) = 1 p,a\in N^*,(p,a)=1p,a∈N∗,(p,a)=1,则 a φ ( p ) ≡ 1 ( m o d p ) a^{\varphi(p)}≡1\pmod paφ(p)≡1(modp)
证明:考虑 p pp 条同余式,其中 ∀ i ⩽ φ ( p ) , m i < p \forall\ i\leqslant \varphi(p), m_i<p∀ i⩽φ(p),mi<p,且其中x i x_ixi 即小于等于 p pp 且与 p pp 互质的数,即 ( 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 ii 和 j jj,满足 i > j , m i = m j i>j,m_i=m_ji>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 pa(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 ii 和 j jj,满足 i > j , m i = m j i>j,m_i=m_ji>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}\ pab 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}\ pab≡amin(b mod φ(p)+φ(p),b) mod p
费马小定理
结论:若存在 a aa 和 p pp,满足 ( a , p ) = 1 (a,p)=1(a,p)=1,且 p ∈ p r i m e p\in primep∈prime,则 a p − 1 ≡ 1 ( m o d p ) a^{p-1}≡1 \pmod pap−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 pa×x≡1(modp) 中,x = a − 1 x=a^{-1}x=a−1
转化为不定方程 a x − p y = 1 ax-py=1ax−py=1
进一步转化为 a x + p ⋅ ( − y ) = 1 ax+p\cdot(-y)=1ax+p⋅(−y)=1
用扩展欧几里得解不定方程即可,若 ( a , p ) = 1 (a,p)=1(a,p)=1,则求得的 x xx 即为 a − 1 a^{-1}a−1。
但要注意,x xx 可能小于 0 00,但满足 x ≡ x + p ( m o d p ) x≡x+p\pmod px≡x+p(modp),因此,把 x xx 加上一个 p pp 即可。
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 primep∈prime 时,a p − 1 ≡ 1 ( m o d p ) , ( a , p ) = 1 a^{p-1}≡1\pmod p,(a,p)=1ap−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 aa 的逆元即 a p − 2 mod p a^{p-2}\ \text{mod}\ pap−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 paφ(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 aa 的逆元即 a φ ( p ) − 1 mod p a^{\varphi(p)-1}\ \text{mod}\ paφ(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 p1−1≡1(modp)
对于 i ( i > 1 ) i(i>1)i(i>1),必然存在 k kk 和 r rr,使得 p = k × i + r p=k\times i+rp=k×i+r,满足r < i , 1 < i < p r<i,1<i<pr<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 ii 之前, ( 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)}bba 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 pbpb 可能爆 l o n g l o n g long\ longlong 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 xx ,得:
[ ( 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)!,\dotsp!,(p+1)!,…对 p pp 取模得 0 00,因此它们的逆元相当于 0 00 的逆元,并不存在。(逆元的性质)
二元一次不定方程
形如 a x + b y = c ax+by=cax+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 xx和y yy求出所有解。
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 pax≡b(modp) 的方程称为线性同余方程,其中,a b abab 均为整数,m mm 为正整数。
可以发现,同余式两边同乘以模 m mm 意义下 a − 1 a^{-1}a−1 就好了……
但新的一个问题来了,我们要怎么求出所有的解呢?
这个问题LZ至今不会,因此还是换一种方法吧。
可以发现,线性同余方程 a x ≡ b ( m o d m ) ax≡b\pmod max≡b(modm) 等价于不定方程 a x + m y = b ax+my=bax+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 tt 只到 ( a , b ) − 1 (a,b)-1(a,b)−1?因为从 ( a , b ) (a,b)(a,b) 开始循环了。可那又是为什么?
设存在 t i t_iti 和 t j t_jtj,满足 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 xx 出现循环。
而最后得到的式子也告诉我们,只有 ( a , b ) (a,b)(a,b) 个不同的解。
中国剩余定理
如果方程有多个,但是未知数仍然只有一个怎么办?先来考虑所有 m i m_imi 互质的情况。
{ 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_iM=i=1∏nmi,w i = M m i w_i=\dfrac M{m_i}wi=miM,由于所有的 m i m_imi 互质,有( w i , m i ) = 1 (w_i,m_i)=1(wi,mi)=1。
用扩展欧几里得求不定方程 p i p_ipi 和 q i q_iqi,满足 w i p i + m i q i = ( w i , m i ) = 1 w_ip_i+m_iq_i=(w_i,m_i)=1wipi+miqi=(wi,mi)=1
令 e i = w i p i e_i=w_ip_iei=wipi 则方程组等价于 x ≡ ∑ i = 1 n e i a i ( m o d M ) x≡\sum\limits_{i=1}^ne_ia_i\pmod Mx≡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 n1⩽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=kt=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_2m1,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_2m1k1=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_2k2。
同余式两边同除 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 kk 个同余式两两合并即可。
等等!如果 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
文章太长,后一部分点这里