Congruence Equation
Congruences
剩余系:对于某一个特定的正整数 m,一个整数集中的数模 m 所得的余数域(单个集合称为同余类)。例如:余数为 a
的集合可以表示为{a+km},简记为a ‾ \overline a a
完全剩余系:模 m 的同余类有 m 个,{0,1,……,m-1},它们构成了 m 的完全剩余系。
简化剩余系:1~m 中与 m 互质的个数有ϕ ( m ) \phi(m) ϕ ( m ) 个,它们构成 m 的简化剩余系。简化剩余系关于模 m 乘法封闭,其中任意数相乘也与 m
互质。
费马小定理:若 p 是质数,gcd ( a , p ) = 1 \gcd(a, p) = 1 g cd( a , p ) = 1 ,有 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod p a p − 1 ≡ 1 ( mod p ) 。还有另一种形式:对于 ∀ a ∈ Z , a p ≡ a ( m o d p ) \forall a \in \mathbb{Z}, a^p \equiv a \pmod p ∀ a ∈ Z , a p ≡ a ( mod p )
欧拉定理:若 gcd ( a , p ) = 1 \gcd(a, p) = 1 g cd( a , p ) = 1 ,则 a ϕ ( p ) ≡ 1 ( m o d p ) a^{\phi(p)}\equiv 1 \pmod p a ϕ ( p ) ≡ 1 ( mod p ) ,ϕ ( p ) \phi(p) ϕ ( p ) 为欧拉函数
因为二者可以相互转化,所以一起证明:
构造一个序列 A={1,2,3……,p-1}(即为 p 的简化剩余系),再取一个不是 p 的倍数的数 a。
∵ g c d ( A i , p ) = 1 , g c d ( a , p ) = 1 , 且 A i 与 a 同属于简化剩余系 \because gcd(A_i, p) = 1, gcd(a, p) = 1, 且A_i与a同属于简化剩余系 ∵ g c d ( A i , p ) = 1 , g c d ( a , p ) = 1 , 且 A i 与 a 同属于简化剩余系
∴ g c d ( A i ∗ a , p ) = 1 \therefore gcd(A_i * a, p) = 1 ∴ g c d ( A i ∗ a , p ) = 1
∴ \therefore ∴ p 的简化剩余系可以记为{a ‾ 1 , a ‾ 2 … … a ‾ ϕ ( p ) \overline a_1,\overline a_2……\overline a_{\phi(p)} a 1 , a 2 …… a ϕ ( p )
}或{a a 1 ‾ , a a 2 ‾ … … a a ϕ ( p ) ‾ \overline {aa_1},\overline {aa_2}……\overline {aa_{\phi(p)}} a a 1 , a a 2 …… a a ϕ ( p ) }
为什么:假设对于不同的剩余系a i , a j ; a a i , a a j a_i,a_j;aa_i,aa_j a i , a j ; a a i , a a j 代表相同的剩余系,也就是a a i ≡ a a j ( m o d p ) aa_i\equiv aa_j \pmod p a a i ≡ a a j ( mod p ) ,则a ( a i − a j ) ≡ 0 a(a_i-a_j) \equiv 0 a ( a i − a j ) ≡ 0
,因为 gcd(a, p)互质,所以a i − a j ≡ 0 a_i-a_j\equiv 0 a i − a j ≡ 0 , 即a i ≡ a j a_i\equiv a_j a i ≡ a j ,假设矛盾,所以可以代表不同的剩余系。
而简化剩余系之间一一对应,那么a 1 a 2 … a ϕ ( p ) ≡ a a 1 a a 2 … a a ϕ ( p ) a_1a_2…a_{\phi(p)}\equiv aa_1aa_2…aa_{\phi(p)} a 1 a 2 … a ϕ ( p ) ≡ a a 1 a a 2 … a a ϕ ( p ) ,化简即得a ϕ ( p ) ≡ 1 ( m o d p ) a^{\phi(p)}\equiv 1 \pmod p a ϕ ( p ) ≡ 1 ( mod p ) 。
当 p 是质数时ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ ( p ) = p − 1 ,此时a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod p a p − 1 ≡ 1 ( mod p )
扩展欧拉定理:
a b ≡ { a b m o d ϕ ( p ) , g c d ( a , p ) = 1 , a b , g c d ( a , p ) ≠ 1 且 b < ϕ ( p ) , ( m o d p ) a b m o d ϕ ( p ) + ϕ ( p ) , g c d ( a , p ) ≠ 1 且 b ≥ ϕ ( p ) , a^b \equiv \begin{cases} a^{b \; mod \;\phi(p)},&gcd(a,p)=1,\\ a^{b},&gcd(a, p)\neq1 且 b<\phi(p), &\pmod p\\ a^{b \; mod\;\phi(p)+\phi(p)},&gcd(a, p)\neq1 且 b\geq\phi(p),\\ \end{cases} a b ≡ ⎩ ⎨ ⎧ a b m o d ϕ ( p ) , a b , a b m o d ϕ ( p ) + ϕ ( p ) , g c d ( a , p ) = 1 , g c d ( a , p ) = 1 且 b < ϕ ( p ) , g c d ( a , p ) = 1 且 b ≥ ϕ ( p ) , ( mod p )
线性(一次)同余方程
a x ≡ c ( m o d b ) ax\equiv c \pmod b a x ≡ c ( mod b ) --> a x − c = b y ( y ∈ Z ) ax-c=by(y\in Z) a x − c = b y ( y ∈ Z ) -> a x − b y = c ax-by=c a x − b y = c ,求x x x 的最小非负整数解。
扩展欧几里得算法
Bezout定理 :∀ a , b ∈ Z , ∃ x , y ∈ Z \forall a, b\in Z,\exists x, y\in Z ∀ a , b ∈ Z , ∃ x , y ∈ Z , 满足a x + b y = g c d ( a , b ) ax+by=gcd(a,b) a x + b y = g c d ( a , b )
推导证明:当e x g c d exgcd e xg c d 递归到边界时,b = 0 b=0 b = 0 ,显然有a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 ) a*1+0*0=gcd(a,0) a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 ) ->令x = 1 , y = 0 x=1,y=0 x = 1 , y = 0 . 考虑递归返回过程,g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) g c d ( a , b ) = g c d ( b , a % b ) .假设存在x,y满足b x + ( a % b ) y = g c d ( b , a % b ) bx+(a\%b)y=gcd(b,a\%b) b x + ( a % b ) y = g c d ( b , a % b ) ,因为a % b = a − b ⌊ a / b ⌋ a\%b=a-b\lfloor a/b\rfloor a % b = a − b ⌊ a / b ⌋ ,所以有a y + b ( x − ⌊ a / b ⌋ y = g c d ( a , b ) ) ay+b(x-\lfloor a/b\rfloor y = gcd(a, b)) a y + b ( x − ⌊ a / b ⌋ y = g c d ( a , b )) ,那么新的一组解为X = y , Y = x − ⌊ a / b ⌋ y X=y, Y=x-\lfloor a/b\rfloor y X = y , Y = x − ⌊ a / b ⌋ y
对于更一般的情况,a x + b y = c ax+by=c a x + b y = c ,当且仅当g c d ( a , b ) ∣ c gcd(a,b)|c g c d ( a , b ) ∣ c ,方程有整数解。这时,只需给x , y x,y x , y 乘上c / g c d c/gcd c / g c d 即可。更进一步,方程的通解表示为
x = c g c d x 0 + k b g c d y = c g c d y 0 − k a g c d ( k ∈ Z ) x=\frac{c}{gcd}x_0+k\frac{b}{gcd}\qquad y=\frac{c}{gcd}y_0-k\frac{a}{gcd} (k\in Z) x = g c d c x 0 + k g c d b y = g c d c y 0 − k g c d a ( k ∈ Z )
证明:
设 x 1 = c g c d x 0 , y 1 = c g c d y 0 有 a x + b y = a x 1 + b y 1 = c , a ( x − x 1 ) = b ( y 1 − y ) a g c d ( x − x 1 ) = b g c d ( y 1 − y ) ∵ g c d ( a g c d , b g c d ) = 1 ∴ x − x 1 = k b g c d , y 1 − y = k a g c d x = x 1 + k b g c d , y = y 1 − k a g c d \begin{aligned}
设\ x_1=\frac{c}{gcd}x_0, &\quad y_1=\frac{c}{gcd}y_0 \\
有\ ax+by&=ax_1+by_1=c, \\
a(x-x_1)&=b(y_1-y) \\
\frac{a}{gcd}(x-x_1)&=\frac{b}{gcd}(y_1-y) \\
\because gcd(\frac{a}{gcd}, \frac{b}{gcd})&=1 \\
\therefore x-x_1=k\frac{b}{gcd},& \quad y_1-y=k\frac{a}{gcd} \\
x=x_1+k\frac{b}{gcd},& \quad y=y_1-k\frac{a}{gcd} \\
\end{aligned} 设 x 1 = g c d c x 0 , 有 a x + b y a ( x − x 1 ) g c d a ( x − x 1 ) ∵ g c d ( g c d a , g c d b ) ∴ x − x 1 = k g c d b , x = x 1 + k g c d b , y 1 = g c d c y 0 = a x 1 + b y 1 = c , = b ( y 1 − y ) = g c d b ( y 1 − y ) = 1 y 1 − y = k g c d a y = y 1 − k g c d a
inline int exgcd ( int a, int b, int & x, int & y) {
if ( b == 0 ) { x = 1 , y = 0 ; return a; }
int x1, y1;
int d = exgcd ( b, a % b, x1, y1) ;
x = y1, y = x1 - a / b * y1;
return d;
}
inline int exgcd ( int a, int b, int & x, int & y) {
if ( b == 0 ) { x = 1 , y = 0 ; return a; }
int d = exgcd ( b, a % b, y, x) ;
y -= a / b * x;
return d;
}
inline bool solve_any ( int a, int b, int c, int & x, int & y) {
int g = exgcd ( abs ( a) , abs ( b) , x, y) ;
if ( c % g) return false ;
c /= g;
x *= c, y *= c;
if ( a < 0 ) x = - x;
if ( b < 0 ) y = - y;
return true ;
}
inline int solve_min ( int a, int b, int c) {
int x, y, g;
g = exgcd ( a, b, x, y) ;
if ( c % g) return - 1 ;
a /= g, b /= g, c /= g;
x = ( x * c % b + b) % b;
return x;
}
高次同余方程
a x ≡ b ( m o d p ) a^x\equiv b \pmod p a x ≡ b ( mod p ) 。( a , p ) (a, p) ( a , p ) 互质,求解x x x 的最小非负整数解。
BSGS(Baby Step, Giant Step)算法
设x = i ∗ t − j x=i*t-j x = i ∗ t − j ,其中t = ⌈ p ⌉ , j ∈ [ 0 , t − 1 ] t=\lceil\sqrt{p}\rceil,j\in[0,t-1] t = ⌈ p ⌉ , j ∈ [ 0 , t − 1 ] ,则方程变为a i ∗ t − j ≡ b ( m o d p ) a^{i*t-j}\equiv b\pmod{p} a i ∗ t − j ≡ b ( mod p ) ,进一步有( a t ) i ≡ b ∗ a j ( m o d p ) (a^t)^i \equiv b*a^j \pmod p ( a t ) i ≡ b ∗ a j ( mod p ) 。
对于所有的j j j ,把b ∗ a j ( m o d p ) b*a^{j}\pmod p b ∗ a j ( mod p ) 全部插入h a s h hash ha s h 表,枚举i i i ,计算出( a t ) i (a^t)^i ( a t ) i ,在h a s h hash ha s h 表中查找,如果有,更新答案。最优时间复杂度为t = p t=\sqrt{p} t = p ,为O(p \sqrt{p} p )。
int BSGS ( int a, int b, int p) {
map < int , int > hash; hash. clear ( ) ;
b %= p;
if ( b == 1 % p) return 0 ;
int t = sqrt ( p) + 1 ;
for ( int j = 0 ; j < t; ++ j) hash[ b * binpow ( a, j, p) % p] = j;
a = binpow ( a, t, p) ;
if ( a == 0 ) return b == 0 ? 1 : - 1 ;
for ( int i = 0 ; i <= t; ++ i) {
int val = binpow ( a, i, p) ;
int j = hash. find ( val) == hash. end ( ) ? - 1 : hash[ val] ;
if ( j >= 0 && i * t - j >= 0 ) return i * t - j;
}
return - 1 ;
}
一元线性同余方程组
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋮ x ≡ a n ( m o d m n ) \begin{cases}
x &\equiv a_1 \pmod{m_1} \\
x &\equiv a_2 \pmod{m_2} \\
&\vdots \\
x &\equiv a_n \pmod{m_n} \\
\end{cases} ⎩ ⎨ ⎧ x x x ≡ a 1 ( mod m 1 ) ≡ a 2 ( mod m 2 ) ⋮ ≡ a n ( mod m n )
中国剩余定理(物不知数)
当 m 1 , m 2 , … , m n m_1,m_2,\dots,m_n m 1 , m 2 , … , m n 两两互质时,设 M = ∏ i = 1 n m i , c i = M m i , t i M=\prod_{i=1}^{n}m_i,\; c_i=\frac{M}{m_i},\; t_i M = ∏ i = 1 n m i , c i = m i M , t i 是线性同余方程 c i t i ≡ 1 ( m o d m i ) c_it_i\equiv1\pmod{m_i} c i t i ≡ 1 ( mod m i ) 的一个解,也就是 c i c_i c i 在 ( m o d m i ) \pmod{m_i} ( mod m i ) 意义下的逆元。那么 x x x 在模 M M M 有唯一解 x = ∑ i = 1 n a i c i t i ( m o d M ) x=\sum\limits_{i=1}^{n}a_ic_it_i \pmod{M} x = i = 1 ∑ n a i c i t i ( mod M ) ,有通解 x = k M + ∑ i = 1 n a i c i t i ( k ∈ Z ) x=kM+\sum\limits_{i=1}^{n}a_ic_it_i(k\in Z) x = k M + i = 1 ∑ n a i c i t i ( k ∈ Z ) .
证明
对于所有j ≠ i j\ne i j = i ,因为c j = M m j c_j=\frac{M}{m_j} c j = m j M ,所以因数中包含m i m_i m i ,所以c j ≡ 0 ( m o d m i ) c_j\equiv 0\pmod{m_i} c j ≡ 0 ( mod m i ) ,也即a j c j t j ≡ 0 ( m o d m i ) a_jc_jt_j\equiv 0\pmod{m_i} a j c j t j ≡ 0 ( mod m i ) 。因为c i t i ≡ 1 ( m o d m i ) c_it_i\equiv1\pmod{m_i} c i t i ≡ 1 ( mod m i ) ,所以a i c i t i ≡ a i ( m o d m i ) a_ic_it_i\equiv a_i\pmod{m_i} a i c i t i ≡ a i ( mod m i ) ,那么∑ i = 1 n a i c i t i ≡ a i ( m o d m i ) \sum\limits_{i=1}^{n}a_ic_it_i\equiv a_i\pmod{m_i} i = 1 ∑ n a i c i t i ≡ a i ( mod m i ) 。同理可知x x x 满足所有n n n 个方程,解成立。
int CRT ( int n, int a[ ] , int m[ ] ) {
int M = 1 , ans = 0 ;
for ( int i = 1 ; i <= n; ++ i) M *= m[ i] ;
for ( int i = 1 ; i <= n; ++ i) {
int c = M / m[ i] , t, y;
exgcd ( c, m[ i] , t, y) ;
( ans += a[ i] * c * t % M) %= M;
}
return ( ans % M + M) % M;
}
扩展中国剩余定理(模数不互质)
先来考虑只有两个方程的情况。设方程分别是 x ≡ a 1 ( m o d m 1 ) , x ≡ a 2 ( m o d m 2 ) x\equiv a_1\pmod{m_1},x\equiv a_2\pmod{m_2} x ≡ a 1 ( mod m 1 ) , x ≡ a 2 ( mod m 2 ) ,则得到不定方程 x = m 1 p + a 1 = m 2 q + a 2 x=m_1p+a_1=m_2q+a_2 x = m 1 p + a 1 = m 2 q + a 2 。移项得 m 1 p − m 2 q = a 2 − a 1 m_1p-m_2q=a_2-a_1 m 1 p − m 2 q = a 2 − a 1 ,首先当 g c d ( m 1 , m 2 ) ∤ ( a 2 − a 1 ) gcd(m_1, m_2) \nmid (a_2-a_1) g c d ( m 1 , m 2 ) ∤ ( a 2 − a 1 ) ,方程无解;否则,可以得到一组可行解p 、 q p、q p 、 q 。令 a ′ = m 1 p + a 1 , M = l c m ( m 1 , m 2 ) a'=m_1p+a_1,M=lcm(m_1,m_2) a ′ = m 1 p + a 1 , M = l c m ( m 1 , m 2 ) ,合并得到同余方程 x ≡ a ′ ( m o d M ) x\equiv a'\pmod{M} x ≡ a ′ ( mod M ) ,多个方程的话两两合并即可。
int calc ( int a, int b, int c) {
int x, y, d = exgcd ( a, b, x, y) ;
if ( c % d) return - 1 ;
a /= d, b /= d, c /= d;
return ( ( __int128) x * c % b + b) % b;
}
int EXCRT ( int n, int a[ ] , int m[ ] ) {
int M = 1 , ans = 0 ;
for ( int i = 1 ; i <= n; ++ i) {
int x = calc ( M, m[ i] , a[ i] - ans) ;
if ( x == - 1 ) return - 1 ;
ans += x * M;
M = lcm ( M, m[ i] ) ;
ans = ( ans % M + M) % M;
}
return ans;
}