整除的性质:
1.传递性:若 a ∣ b , b ∣ c a|b,b|c a∣b,b∣c,则 a ∣ c a|c a∣c
2. a ∣ b , a ∣ c a|b,a|c a∣b,a∣c等价于对于任意的整数 x , y x,y x,y,有 a ∣ ( b x + c y ) a|(bx+cy) a∣(bx+cy)
3.设 m ≠ 0 m≠0 m=0,则 a ∣ b a|b a∣b等价于 m a ∣ m b ma|mb ma∣mb
4.设整数 x , y x,y x,y满足 a x + b y = 1 , a ∣ n , b ∣ , n ax+by=1,a|n,b|,n ax+by=1,a∣n,b∣,n,则 ( a b ) ∣ n (ab)|n (ab)∣n
5.若 b = q ∗ d + c b=q*d+c b=q∗d+c,则 d ∣ b d|b d∣b的充要条件是 d ∣ c d|c d∣c
同余的性质:
1.同加性:若 a ≡ b ( m o d p ) a\equiv b(mod\ p) a≡b(mod p),则 a + c ≡ b + c ( m o d p ) a+c\equiv b+c(mod\ p) a+c≡b+c(mod p)
2.同减性:若 a ≡ b ( m o d p ) a\equiv b(mod\ p) a≡b(mod p),则 a − c ≡ b − c ( m o d p ) a-c\equiv b-c(mod\ p) a−c≡b−c(mod p)
3.同乘性:若 a ≡ b ( m o d p ) a\equiv b(mod\ p) a≡b(mod p),则 a × c ≡ b × c ( m o d p ) a\times c\equiv b\times c(mod\ p) a×c≡b×c(mod p)
4.同除性:若 a ≡ b ( m o d p ) , c ∣ a , c ∣ b , ( c , p ) = 1 a\equiv b(mod\ p),c|a,c|b,(c,p)=1 a≡b(mod p),c∣a,c∣b,(c,p)=1,则 a / c ≡ b / c ( m o d p ) a/c\equiv b/c(mod\ p) a/c≡b/c(mod p)
5.同幂性:若 a ≡ b ( m o d p ) , c > 0 a\equiv b(mod\ p),c>0 a≡b(mod p),c>0,则 a c ≡ b c ( m o d p ) a^c\equiv b^c(mod\ p) ac≡bc(mod p)
6.若 a % p = x , a % q = x , ( p , q ) = 1 a\% p=x,a\% q=x,(p,q)=1 a%p=x,a%q=x,(p,q)=1,则 a % ( p ∗ q ) = x a\% (p*q)=x a%(p∗q)=x
数论常识:
1.若2能整除a的最末位,则 2 ∣ a 2|a 2∣a
2.若4能整除a的末两位,则 4 ∣ a 4|a 4∣a
3.若8能整除a的末三位,则 8 ∣ a 8|a 8∣a
4.若3能整除a的各位数字之和,则 3 ∣ a 3|a 3∣a
5.若9能整除a的各位数字之和,则 9 ∣ a 9|a 9∣a
6.若11能整除a的偶数位数字之和与奇数位数字之和的差,则 11 ∣ a 11|a 11∣a
7.能被 7 , 11 , 13 7,11,13 7,11,13整除的数的特征是:这个数的末三位与末三位以前的数字所组成数之差能被 7 , 11 , 13 7,11,13 7,11,13整除
1.分配率
( a + b ) % c = ( a % c + b % c ) % c (a+b)\% c=(a\% c+b\% c)\% c (a+b)%c=(a%c+b%c)%c$
( a − b ) % c = ( a % c − b % c ) % c (a-b)\% c=(a\% c-b\% c)\% c (a−b)%c=(a%c−b%c)%c$
( a × b ) % c = ( a % c × b % c ) % c (a\times b)\% c=(a\% c\times b\% c)\% c (a×b)%c=(a%c×b%c)%c$
( a b ) % c = ( a % c ) b % c (a^b)\% c=(a\% c)^b\% c (ab)%c=(a%c)b%c$
2.放缩性
如果 a % b = c , d ≠ 0 a\% b=c,d≠0 a%b=c,d=0,则有 ( a × d ) % ( b × d ) = c × d (a\times d)\%(b\times d)=c\times d (a×d)%(b×d)=c×d
如果 a % b = c , d ∣ a , d ∣ b a\%b=c,d|a,d|b a%b=c,d∣a,d∣b,则 ( a / d ) % ( b / d ) = ( c / d ) (a/d)\%(b/d)=(c/d) (a/d)%(b/d)=(c/d)
根据放缩性,则除法取余有式子↓
a / b % c = a % ( b × c ) / b a/b\%c=a\%(b\times c)/b a/b%c=a%(b×c)/b
先把 n n n以内的 2 2 2的倍数(不包含 2 2 2)全部删除,再把 n n n以内的 3 3 3的倍数(不包含 3 3 3)全部删除,…,
这样做下去,最后剩下的以内的数全为质数
这里的删除其实不是真的删除,只是打上一个删除标记而已
每个数都会被它的质因子打一次标记,而一个数的不同的质因子个数不超过 l o g N logN logN
所以时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)
void getprime( int n ) {
for( int i = 2;i <= n;i ++ ) {
if( flag[i] ) continue;
prime[++ cnt] = i;
for( int j = i;j <= n / i;j ++ )
flag[j * i] = 1;
}
}
在上述的埃氏筛法中,一个数可能被它的各个质因子都筛了一遍
而一个数的质因子种类数是不会超过 l o g N logN logN的,所以时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)
而欧式筛法保证每个数只被它的最小质因子筛一遍,这样,时间复杂度便降成了 O ( N ) O(N) O(N)
有一个质数集合 S S S,一开始,质数集合为空
同时有一个 b o o l bool bool数组 f l a g flag flag,表示删除标记
有两层循环:
外层循环从 2 2 2开始枚举倍数,设当前枚举的量为 a a a
如果 a a a是质数,则将 a a a加入质数集合
内层循环枚举质数集合中的元素,将数组中它们的 a a a倍全部打上删除标记
显然,未打删除标记的数都是质数了( f l a g flag flag数组中下标小于 2 2 2的元素是无效的,不用考虑)
但现在的时间复杂度仍然是 O ( N l o g N ) O(NlogN) O(NlogN)的,接下来,要用一个优化来完成 O ( N ) O(N) O(N)的蜕变
设当前倍数为 a a a,在内层循环中,设当前枚举到集合 S S S中的第 i i i个质数 p i p_i pi
先将 i ∗ p i i*p_i i∗pi打上标记
如发现 i i i是 p i p_i pi的倍数时
此时后续的质数就无需再枚举了,可以提前退出内层循环
外层循环处理下一轮,即 a + + a++ a++
为什么满足这种条件就可以提前 b r e a k break break呢?
设后续的质数为 p i ′ p_i' pi′,而 p i ′ > p i p_i'>p_i pi′>pi
因为 a a a是 p i p_i pi的倍数,那么 a × p i ′ a\times p_i' a×pi′也是 p i p_i pi的倍数
设 a × p i ′ = b × p i a\times p_i'=b\times p_i a×pi′=b×pi
∵ p i ′ > p i ∵p_i'>p_i ∵pi′>pi
∴ b > a ∴b>a ∴b>a
我们希望每个数被它的最小质因子给删掉
所以 a × p i ′ a\times p_i' a×pi′应该被 p i p_i pi删掉(就要求 a × p i ′ / p i a\times p_i'/p_i a×pi′/pi尽量大)
所以后续所有的质数就都留给倍数 a a a增长到 b b b再去处理了
void sieve( int n ) {
for( int i = 2;i <= n;i ++ ) {
if( ! flag[i] ) prime[++ cnt] = i;
for( int j = 1;j <= cnt && i * prime[j] <= n;j ++ ) {
flag[i * prime[j]] = 1;
if( i % prime[j] == 0 ) break;
}
}
}
g c d ( a , b ) × l c m ( a , b ) = a ∗ b gcd(a,b)\times lcm(a,b)=a*b gcd(a,b)×lcm(a,b)=a∗b
证明:
将 a , b a,b a,b进行质因子分解,设 a , b a,b a,b的质因子集合并集为 p 1 , p 2 , p 3 . . . p k p_1,p_2,p_3...p_k p1,p2,p3...pk
设 a = p 1 i 1 p 2 i 2 . . . p k i k , ( 0 ≤ i 1 , 0 ≤ i 2 . . . 0 ≤ i k ) 设a=p_1^{i_1}p_2^{i_2}...p_k^{i_k},(0≤i_1,0\le i_2...0\le i_k) 设a=p1i1p2i2...pkik,(0≤i1,0≤i2...0≤ik)
设 b = p 1 j 1 p 2 j 2 . . . p k j k , ( 0 ≤ j 1 , 0 ≤ j 2 . . . 0 ≤ j k ) 设b=p_1^{j_1}p_2^{j_2}...p_k^{j_k},(0\le j_1,0\le j_2...0\le j_k) 设b=p1j1p2j2...pkjk,(0≤j1,0≤j2...0≤jk)
g c d ( a , b ) = p 1 m i n ( i 1 , j 1 ) p 2 m i n ( i 2 , j 2 ) . . . p k m i n ( i k , j k ) gcd(a,b)=p_1^{min(i_1,j_1)}p_2^{min(i_2,j_2)}...p_k^{min(i_k,j_k)} gcd(a,b)=p1min(i1,j1)p2min(i2,j2)...pkmin(ik,jk)
l c m ( a , b ) = p 1 m a x ( i 1 , j 1 ) p 2 m a x ( i 2 , j 2 ) . . . p k m a x ( i k , j k ) lcm(a,b)=p_1^{max(i_1,j_1)}p_2^{max(i_2,j_2)}...p_k^{max(i_k,j_k)} lcm(a,b)=p1max(i1,j1)p2max(i2,j2)...pkmax(ik,jk)
∵ m i n ( i t , j t ) + m a x ( i t , j t ) = i t + j t ∵min(i_t,j_t)+max(i_t,j_t)=i_t+j_t ∵min(it,jt)+max(it,jt)=it+jt
∴ g c d ( a , b ) + l c m ( a , b ) = p 1 i 1 + j 1 p 2 i 2 + j 2 . . . p k i k + j k ∴gcd(a,b)+lcm(a,b)=p_1^{i_1+j_1}p_2^{i_2+j_2}...p_k^{i_k+j_k} ∴gcd(a,b)+lcm(a,b)=p1i1+j1p2i2+j2...pkik+jk
g c d ( a , b ) ≡ g c d ( b , a % b ) gcd(a,b)\equiv gcd(b,a\%b) gcd(a,b)≡gcd(b,a%b)
证明:
设 d = g c d ( a , b ) , a = x ∗ d , b = y ∗ d d=gcd(a,b),a=x*d,b=y*d d=gcd(a,b),a=x∗d,b=y∗d
根据模运算的放缩性有: a % b = ( x ∗ d ) % ( y ∗ d ) = ( x % y ) ∗ d a\%b=(x*d)\%(y*d)=(x\%y)*d a%b=(x∗d)%(y∗d)=(x%y)∗d
∵ ( x , y ) = 1 ∵(x,y)=1 ∵(x,y)=1
∴ ( y , x % y ) = 1 ∴(y,x\%y)=1 ∴(y,x%y)=1
int gcd( int x, int y ) {
if( ! y ) return x;
else return gcd( y, x % y );
}
若约分 a b \frac{a}{b} ba
如 a , b a,b a,b均为偶,可先将 a , b a,b a,b折半,即 / 2 /2 /2
否则,将 a , b a,b a,b交替的减去对方
直到最后两数相等,此时的数乘上先前除掉的 2 2 2即为原来 a , b a,b a,b的最大公约数
如果 a , b a,b a,b的最大公约数为 d d d,且 d ∣ c d|c d∣c,则存在整数 x , y x,y x,y,使得 a x + b y = c ax+by=c ax+by=c
证明:
转化证明存在 x , y x,y x,y使得 a x + b y = d ax+by=d ax+by=d
假设存在这样一对 x , y x,y x,y,那么只需将其进行倍数放缩即可
∵ ( a , b ) = d ∵(a,b)=d ∵(a,b)=d
∴ ∴ ∴设 a ′ = a / d , b ′ = b / d a'=a/d,b'=b/d a′=a/d,b′=b/d
则有 a ′ x + b ′ y = 1 , ( a ′ , b ′ ) = 1 a'x+b'y=1,(a',b')=1 a′x+b′y=1,(a′,b′)=1
证明转化为 求一对 x , y x,y x,y,使得 a ′ x + b ′ y = 1 a'x+b'y=1 a′x+b′y=1,且满足 ( a ′ , b ′ ) = 1 (a',b')=1 (a′,b′)=1
即求证 a ′ x % b ′ = 1 a'x\%b'=1 a′x%b′=1(感性理解:若干倍的 a ′ a' a′减去若干倍的 b ′ b' b′等于 1 1 1)
引理一
如果 a , b a,b a,b为正整数,且 a , b a,b a,b互质,则不存在小于 b b b的正整数 k k k,使得 0 ≡ k ∗ a ( m o d b ) 0\equiv k*a(mod\ b) 0≡k∗a(mod b)
证明:
用反证法即可,假设存在这样的一个 k k k使得该式成立
则需满足 k k k或者 a a a能整除 b b b
∵ ( a , b ) = 1 ∵(a,b)=1 ∵(a,b)=1
∴ a ∴a ∴a不可能整除 b b b
∵ 0 < k < b ∵0
∴ k ∴k ∴k亦不可能整除 b b b
推论
如果 a , b a,b a,b为正整数,且 a , b a,b a,b互质,则 0 , a , a ∗ 2 , a ∗ 3... ( b − 1 ) ∗ a 0,a,a*2,a*3...(b-1)*a 0,a,a∗2,a∗3...(b−1)∗a这些数取模 b b b,余数互不相等
证明:
反证法
设存在 0 < i < j < b 00<i<j<b,使得 a ∗ i ≡ a ∗ j ( m o d b ) a*i\equiv a*j(mod\ b) a∗i≡a∗j(mod b)
则有 ( i − j ) ∗ a ≡ 0 ( m o d b ) (i-j)*a\equiv 0(mod\ b) (i−j)∗a≡0(mod b)
同理引理一, i − j , a i-j,a i−j,a都不可能整除 b b b,故与假设矛盾,不成立
引理二
如果 ( a , b ) = 1 (a,b)=1 (a,b)=1,则必存在一个整数 k k k,满足 k ∗ a % b = 1 k*a\% b=1 k∗a%b=1
证明:
根据上面推论易知,这些数取模 b b b的值只会在区间 [ 0 , b − 1 ] [0,b-1] [0,b−1]( k = 0 k=0 k=0时取模余数为 0 0 0)
而且各不相同,其中一定存在取模后的余数为 1 1 1的值
根据引理二可知, 如果 ( a , b ) = 1 (a,b)=1 (a,b)=1,则必存在一个整数 k k k,满足 k ∗ a % b = 1 k*a\% b=1 k∗a%b=1
即 k ∗ a − p ∗ b = 1 k*a-p*b=1 k∗a−p∗b=1,裴蜀定理得证
( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)!\equiv -1(mod\ p) (p−1)!≡−1(mod p),当且仅当 p p p为质数
证明:
先证充分性——> p p p为质数,有 ( p − 1 ) ! ≡ p − 1 ( m o d p ) (p-1)!\equiv p-1(mod\ p) (p−1)!≡p−1(mod p)
假设 0 < i < p 00<i<p,根据上面的裴蜀定理,可得 ( i , p ) = 1 (i,p)=1 (i,p)=1,且必存在一个整数 j ( 0 < j < p ) j(0
使得 i × j % p = 1 i\times j\%p=1 i×j%p=1,即 j j j是 i i i的逆元,由此可见逆元具有唯一性,相互性
所以在 [ 1 , p − 1 ] [1,p-1] [1,p−1]中逆元是一对一对的
然而……
也有可能存在 i i i的逆元是本身的,那么此时的 i i i就要满足以下条件
i 2 % p = 1 — — > ( i + 1 ) ( i − 1 ) % p = 0 i^2\%p=1 \ \ \ ——>(i+1)(i-1)\%p=0 i2%p=1 ——>(i+1)(i−1)%p=0
∴ i + 1 = 0 ∴i+1=0 ∴i+1=0或 p p p, i − 1 = 0 i-1=0 i−1=0或 p p p
∵ 0 < i < p ∵0∵0<i<p
∴ i + 1 = p , i − 1 = 0 ∴i+1=p,i-1=0 ∴i+1=p,i−1=0
即 i = p − 1 , 1 i=p-1,1 i=p−1,1
每一对逆元取模 p p p都为 1 1 1,需要证明的原式变成 1 ∗ p − 1 ≡ p − 1 ( m o d p ) 1*p-1\equiv p-1(mod\ p) 1∗p−1≡p−1(mod p)
显然成立,证毕
再证必要性——> ( p − 1 ) ! ≡ p − 1 ( m o d p ) (p-1)!\equiv p-1(mod\ p) (p−1)!≡p−1(mod p),当该式成立时, p p p一定为质数
反证法,即证明 p p p不为质数时,该式不成立
如 p p p不为质数,则 [ 2 , p − 1 ] [2,p-1] [2,p−1]中一定有 p p p的因子,设为 i i i,则 i , p / i i,p/i i,p/i均为 p p p的因子
1.若 i ≠ p / i i≠p/i i=p/i,则 1 × 2 × 3 × . . . × ( p − 1 ) 1\times 2\times 3\times ...\times (p-1) 1×2×3×...×(p−1)一定是 p p p的倍数,取模 p p p为 0 0 0
2.若 i = p / i i=p/i i=p/i,则 1 × 2 × 3 × . . . × ( p − 1 ) 1\times 2\times 3\times ...\times (p-1) 1×2×3×...×(p−1)一定是 i i i的倍数,模 p p p必为 i i i的倍数
又因为 p p p是 i i i的倍数,且 i > 1 i>1 i>1,所以 p − 1 p-1 p−1不可能是 i i i的倍数,所以 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)!\equiv-1(mod\ p) (p−1)!≡−1(mod p)
如果 p p p为质数,且 a % p ≠ 0 a\%p≠0 a%p=0,则有 a p − 1 % p = 1 a^{p-1}\%p=1 ap−1%p=1
证明:
( a ∗ 1 ) ∗ ( a ∗ 2 ) ∗ . . . ∗ ( a ∗ ( p − 1 ) ) = a p − 1 ∗ ( p − 1 ) ! ( m o d p ) (a*1)* (a* 2)* ...*(a* (p-1))=a^{p-1}*(p-1)!\ \ (mod\ p) (a∗1)∗(a∗2)∗...∗(a∗(p−1))=ap−1∗(p−1)! (mod p)
∵ ( a , p ) = 1 ∵(a,p)=1 ∵(a,p)=1
∴ { ( a ∗ 1 ) % p , ( a ∗ 2 ) % p , . . . , ( a ∗ ( p − 1 ) ) % p } = { 1 , p − 1 } ∴\{(a* 1)\% p,(a*2)\% p,...,(a*(p-1))\%p\}=\{1,p-1\} ∴{ (a∗1)%p,(a∗2)%p,...,(a∗(p−1))%p}={ 1,p−1}
即取模后的值互不相等,且 ∈ [ 1 , p − 1 ] ∈[1,p-1] ∈[1,p−1]
∴ ( a ∗ 1 ) % p , ( a ∗ 2 ) % p , . . . , ( a ∗ ( p − 1 ) ) % p = ( p − 1 ) ! ( m o d p ) ∴(a*1)\% p,(a*2)\% p,...,(a*(p-1))\%p=(p-1)!\ \ (mod\ p) ∴(a∗1)%p,(a∗2)%p,...,(a∗(p−1))%p=(p−1)! (mod p)
( p − 1 ) ! = a p − 1 ( p − 1 ) ! ( m o d p ) (p-1)!=a^{p-1}(p-1)!\ \ (mod\ p) (p−1)!=ap−1(p−1)! (mod p)
∴ a p − 1 = 1 ( m o d p ) ∴a^{p-1}=1\ \ (mod\ p) ∴ap−1=1 (mod p)
对于一个正整数 p p p,所有非负整数模 p p p的结果,只有 p p p种可能,即 { 0 , 1 , 2 , . . . , p − 1 } \{0,1,2,...,p-1\} { 0,1,2,...,p−1}
模 p p p的剩余系指的是 { 0 , 1 , 2 , . . . , p − 1 } \{0,1,2,...,p-1\} { 0,1,2,...,p−1},即小于 p p p的所有非负整数,这个集合中包含了所有模 p p p的余数
模 p p p的剩余系记为 Z p Z_p Zp
剩余系中,每一个元素代表的是一类数
比如在剩余系 Z p Z_p Zp中, 0 0 0表示的是所有模 p p p为 0 0 0的数,即 { 0 , p , 2 p , 3 p . . . } \{0,p,2p,3p...\} { 0,p,2p,3p...}
1 1 1表示的是所有模 p p p为 1 1 1的数,即 { 1 , p + 1 , 2 p + 1 , 3 p + 1... } \{1,p+1,2p+1,3p+1...\} { 1,p+1,2p+1,3p+1...}
这些模 p p p余数相同的数,称为同余等价类
可以发现,在模意义下,所有的非负整数可以被分为若干同余等价类
如果我们只考虑剩余系中与模数p互质的数,便得到一个子集,称为模p的缩系,记为 Z p ∗ Z_p^* Zp∗
如p为6,则 Z p ∗ = { 1 , 5 } Z_p^*=\{1,5\} Zp∗={ 1,5}
缩系又称为简化剩余系
欧拉函数即为缩系的大小
ϕ ( 1 ) = 1 \phi(1)=1 ϕ(1)=1
1.如果 n n n为质数,则 ϕ ( n ) = n − 1 \phi(n)=n-1 ϕ(n)=n−1
2.如果 n = a p n=a^p n=ap,且 a a a为质数,则 ϕ ( n ) = a p − a p − 1 = a p ( 1 − 1 a ) \phi(n)=a^p-a^{p-1}=a^p(1-\frac{1}{a}) ϕ(n)=ap−ap−1=ap(1−a1)
3.令 n = a 1 p 1 a 2 p 2 . . . a k p k n=a_1^{p_1}a_2^{p_2}...a_k^{p_k} n=a1p1a2p2...akpk,根据积性函数性质
ϕ ( n ) = ϕ ( a 1 p 1 ) ϕ ( a 2 p 2 ) . . . ϕ ( a k p k ) \phi(n)=\phi(a_1^{p_1})\phi(a_2^{p_2})...\phi(a_k^{p_k}) ϕ(n)=ϕ(a1p1)ϕ(a2p2)...ϕ(akpk)
= a 1 p 1 ( 1 − 1 a 1 ) ∗ a 2 p 2 ( 1 − 1 a 2 ) . . . a k p k ( 1 − 1 a k ) =a_1^{p_1}(1-\frac{1}{a_1})*a_2^{p_2}(1-\frac{1}{a_2})...a_k^{p_k}(1-\frac{1}{a_k}) =a1p1(1−a11)∗a2p2(1−a21)...akpk(1−ak1)
= n ∗ ( 1 − 1 a 1 ) ∗ ( 1 − 1 a 2 ) ∗ . . . ∗ ( 1 − 1 a k ) =n*(1-\frac{1}{a_1})*(1-\frac{1}{a_2})*...*(1-\frac{1}{a_k}) =n∗(1−a11)∗(1−a21)∗...∗(1−ak1)
//求单个phi(n)
int getphi( int x ) {
int ans = x;
for( int i = 2;i * i <= x;i ++ ) {
if( x % i == 0 ) {
ans = ans / i * ( i - 1 );
while( x % i == 0 ) x /= i;
}
}
if( x > 1 ) ans = ans / x * ( x - 1 );
return ans;
}
//求多个phi(n)
void getphi( int n ) {
for( int i = 2;i <= n;i ++ ) {
if( ! phi[i] ) {
phi[i] = i - 1;
for( int j = i << 1;j <= n;j += i ) {
if( ! phi[j] ) phi[j] = j;
phi[j] = phi[j] / i * ( i - 1 );
}
}
}
}
如果 ( a , p ) = 1 (a,p)=1 (a,p)=1,则 a ϕ ( p ) ≡ 1 ( m o d p ) a^{\phi(p)}\equiv1(mod\ p) aϕ(p)≡1(mod p)
证明:
设 p p p的简化剩余系为 { p 1 , p 2 , p 3 , . . . , p k } \{p_1,p_2,p_3,...,p_k\} { p1,p2,p3,...,pk}
∵ ( a , p ) = 1 ∵(a,p)=1 ∵(a,p)=1
∴ { a ∗ p 1 , a ∗ p 2 , . . . , a ∗ p k } ∴\{a*p_1,a*p_2,...,a*p_k\} ∴{ a∗p1,a∗p2,...,a∗pk}也构成了 p p p的简化剩余系
(证明可参考裴蜀定理中的推论反证法)
∴ ( a ∗ p 1 ) ∗ ( a ∗ p 2 ) ∗ . . . ∗ ( a ∗ p k ) ≡ p 1 ∗ p 2 ∗ . . . ∗ p k ( m o d p ) ∴(a*p_1)*(a*p_2)*...*(a*p_k)\equiv p_1*p_2*...*p_k(mod\ p) ∴(a∗p1)∗(a∗p2)∗...∗(a∗pk)≡p1∗p2∗...∗pk(mod p)
∴ a ϕ ( p ) ≡ 1 ( m o d p ) ∴a^{\phi(p)}\equiv 1(mod\ p) ∴aϕ(p)≡1(mod p)
若 a , m a,m a,m为正整数,当 r > ϕ ( m ) r>\phi(m) r>ϕ(m)时,有 a r ≡ a r % ϕ ( m ) + ϕ ( m ) a^r\equiv a^{r\%\phi(m)+\phi(m)} ar≡ar%ϕ(m)+ϕ(m)
证明:
分类讨论
1.如果 ( a , m ) = 1 (a,m)=1 (a,m)=1,则显然成立
因为由欧拉定理得 a ϕ ( m ) ≡ 1 ( m o d m ) a^{\phi(m)}\equiv1(mod\ m) aϕ(m)≡1(mod m)
2.若 ( a , m ) > 1 (a,m)>1 (a,m)>1
引理一:
如果满足
{ x ≡ y ( m o d m ) x ≡ y ( m o d n ) \begin{cases}x\equiv y\ (mod\ m)\\x\equiv y\ (mod\ n)\end{cases} { x≡y (mod m)x≡y (mod n)
则有
x ≡ y ( m o d l c m ( n , m ) ) x\equiv y\ (mod\ \ lcm(n,m)) x≡y (mod lcm(n,m))
证明:
显然 ( x − y ) (x-y) (x−y)既是 m m m的倍数,又是 n n n的倍数,则其必然为 l c m ( n , m ) lcm(n,m) lcm(n,m)的倍数
引理二:
如果 p p p为质数, ϕ ( p q ) > = q \phi(p^q)>=q ϕ(pq)>=q
证明:
给两种证明方法
法一:
以每 p p p个为一个周期划分
显然 ( p , p − 1 ) = 1 , ( p 2 , p 2 − 1 ) = 1 , . . . , ( p q , p q − 1 ) = 1 (p,p-1)=1,(p^2,p^2-1)=1,...,(p^q,p^q-1)=1 (p,p−1)=1,(p2,p2−1)=1,...,(pq,pq−1)=1
此时光考虑一部分就已经满足 ϕ ( p q ) = q \phi(p^q)=q ϕ(pq)=q,故引理显然成立
法二:
ϕ ( p q ) = p q − 1 ∗ ( p − 1 ) \phi(p^q)=p^{q-1}*(p-1) ϕ(pq)=pq−1∗(p−1)
根据数学归纳法
考虑 q = 1 , ϕ ( p ) > = 1 q=1,\phi(p)>=1 q=1,ϕ(p)>=1显然成立
设 q = k q=k q=k时成立,即 p k − 1 ∗ ( p − 1 ) > = k p^{k-1}*(p-1)>=k pk−1∗(p−1)>=k
∵ k > 1 ∵k>1 ∵k>1
∴ ∴ ∴显然 p k ∗ ( p − 1 ) > = k + 1 p^k*(p-1)>=k+1 pk∗(p−1)>=k+1
即当 q = k + 1 q=k+1 q=k+1时,也成立
接下来继续证明扩展欧拉定理
①若 m = p k m=p^k m=pk,即 m m m为质数的幂时
∵ ( a , m ) > 1 ∵(a,m)>1 ∵(a,m)>1
∴ p ∣ a ∴p|a ∴p∣a
由引理二可得 ϕ ( p k ) ≥ k \phi(p^k)\ge k ϕ(pk)≥k,即 ϕ ( m ) ≥ k \phi(m)\ge k ϕ(m)≥k
∴ r > ϕ ( m ) ≥ k ∴r> \phi(m)\ge k ∴r>ϕ(m)≥k
∴ a r = x ∗ p r = y ∗ p ϕ ( m ) = z ∗ p k ∴a^r=x*p^r=y*p^{\phi(m)}=z*p^k ∴ar=x∗pr=y∗pϕ(m)=z∗pk
即 m ∣ a r , m ∣ p ϕ ( m ) m|a^r,m|p^{\phi(m)} m∣ar,m∣pϕ(m)
∴ a r ≡ a r % ϕ ( m ) + ϕ ( m ) ≡ 0 ( m o d m ) ∴a^r\equiv a^{r\%\phi(m)+\phi(m)}\equiv 0(mod\ \ m) ∴ar≡ar%ϕ(m)+ϕ(m)≡0(mod m)
②若 m = p 1 k 1 p 2 k 2 . . . p n k n m=p_1^{k_1}p_2^{k_2}...p_{n}^{k_n} m=p1k1p2k2...pnkn
设 m 1 = p 1 k 1 m_1=p_1^{k_1} m1=p1k1,则 a r ≡ a r % ϕ ( m 1 ) + ϕ ( m 1 ) ( m o d m 1 ) a^r\equiv a^{r\%\phi(m_1)+\phi(m_1)}\ \ (mod\ \ m_1) ar≡ar%ϕ(m1)+ϕ(m1) (mod m1)
设 m 2 = p 2 k 2 m_2=p_2^{k_2} m2=p2k2,则 a r ≡ a r % ϕ ( m 2 ) + ϕ ( m 2 ) ( m o d m 2 ) a^r\equiv a^{r\%\phi(m_2)+\phi(m_2)}\ \ (mod\ \ m_2) ar≡ar%ϕ(m2)+ϕ(m2) (mod m2)
. . . . . . ...... ......
设 m n = p n k n m_n=p_n^{k_n} mn=pnkn,则 a r ≡ a r % ϕ ( m n ) + ϕ ( m n ) ( m o d m n ) a^r\equiv a^{r\%\phi(m_n)+\phi(m_n)}\ \ (mod\ \ m_n) ar≡ar%ϕ(mn)+ϕ(mn) (mod mn)
咕咕咕咕。。。。(目前蒟蒻还证不出来,先把老师写的放着,待填)
因为 ϕ ( m ) = ϕ ( m 1 ) ∗ ϕ ( m 2 ) ∗ . . . ∗ ϕ ( m n ) \phi(m)=\phi(m_1)*\phi(m_2)*...*\phi(m_n) ϕ(m)=ϕ(m1)∗ϕ(m2)∗...∗ϕ(mn),又根据引理一,则得到:
a r ≡ a r % ϕ ( m ) + ϕ ( m ) ( m o d m ) a^r\equiv a^{r\%\phi(m)+\phi(m)}(\mod m) ar≡ar%ϕ(m)+ϕ(m)(modm)
如果整数 a , b a,b a,b满足 a ∗ b % p = 1 a*b\%p=1 a∗b%p=1,则称 a , b a,b a,b在模 p p p的意义下互为逆元
只有 ( a , p ) = 1 (a,p)=1 (a,p)=1,在模 p p p的意义下 a a a才有逆元, a a a的逆元记作 a − 1 a^{-1} a−1
证明:
若 ( a , p ) > 1 (a,p)>1 (a,p)>1,则令 d = g c d ( a , p ) , d ∣ a , d ∣ p d=gcd(a,p),d|a,d|p d=gcd(a,p),d∣a,d∣p
∴ d ∣ a % p ∴d|a\%p ∴d∣a%p(感性理解为:x倍 d d d减去y倍 p p p直到 x < y x
∴ a ≡ ( x % y ) d ( m o d p ) ∴a\equiv (x\%y)d\ (mod\ \ p) ∴a≡(x%y)d (mod p)
∵ d > 1 ∵d>1 ∵d>1
∴ ( x % y ) d ≠ 1 ∴(x\%y)d≠1 ∴(x%y)d=1
逆元的性质:若 ( b , p ) = 1 (b,p)=1 (b,p)=1,则 a / b % p = a ∗ b − 1 % p a/b\%p=a*b^{-1}\%p a/b%p=a∗b−1%p
有一种求区间逆元的方式,时间复杂度为 O ( n ) O(n) O(n)
设模数为 m , f [ n ] m,f[n] m,f[n]表示 n n n的逆元,其中 [ 1 , n ) [1,n) [1,n)的逆元已经求出,则
f [ n ] = ( − f [ m % n ] ∗ ( m / n ) % m + m ) % m f[n]=(-f[m\%n]*(m/n)\%m+m)\%m f[n]=(−f[m%n]∗(m/n)%m+m)%m
证明:
公式一:
f [ i ] = − f [ m − i ] f[i]=-f[m-i] f[i]=−f[m−i]
证明:
f [ i ] ∗ i ≡ 1 ( m o d m ) f[i]*i\equiv1\ \ \ (mod\ m) f[i]∗i≡1 (mod m)
f [ i ] ∗ ( m − i ) ≡ − 1 ( m o d m ) f[i]*(m-i)\equiv-1\ \ \ (mod\ m) f[i]∗(m−i)≡−1 (mod m)
f [ m − i ] ∗ ( m − i ) ≡ 1 ( m o d m ) f[m-i]*(m-i)\equiv1\ \ \ (mod\ m) f[m−i]∗(m−i)≡1 (mod m)
f [ i ] = − f [ m − i ] f[i]=-f[m-i] f[i]=−f[m−i]
公式二:
f [ i ] = k ∗ f [ k ∗ i ] f[i]=k*f[k*i] f[i]=k∗f[k∗i]
证明:
f [ i ∗ k ] ∗ ( i ∗ k ) ≡ 1 ( m o d m ) f[i*k]*(i*k)\equiv 1\ \ \ (mod\ m) f[i∗k]∗(i∗k)≡1 (mod m)
( f [ i ∗ k ] ∗ k ) ∗ i ≡ 1 ( m o d m ) (f[i*k]*k)*i\equiv 1\ \ \ (mod\ m) (f[i∗k]∗k)∗i≡1 (mod m)
f [ i ] ∗ i ≡ 1 ( m o d m ) f[i]*i\equiv 1\ \ \ (mod\ m) f[i]∗i≡1 (mod m)
f [ i ∗ k ] ∗ k = f [ i ] f[i*k]*k=f[i] f[i∗k]∗k=f[i]
f [ n ] = k ∗ f [ k ∗ n ] = m / n × f [ m − m % n ] f[n]=k*f[k*n]=m/n\times f[m-m\%n] f[n]=k∗f[k∗n]=m/n×f[m−m%n]
f [ m − m % n ] = − f [ m % n ] f[m-m\%n]=-f[m\%n] f[m−m%n]=−f[m%n]
f [ n ] = m / n × ( − f [ m % n ] ) f[n]=m/n\times (-f[m\% n]) f[n]=m/n×(−f[m%n])
扩展欧几里得是用来求不定方程: a x + b y = c ax+by=c ax+by=c,且已知整数 a , b , c a,b,c a,b,c
要求 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c,才能保证有解
算法思想:递归求解
先求方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),求出该方程的解,乘上系数 c / g c d ( a , b ) c/gcd(a,b) c/gcd(a,b)即为原方程的解
a x + b y = g c d ( a , b ) = g c d ( b , a % b ) = b x ′ + ( a % b ) y ′ = b x ′ + ( a − a / b ∗ b ) y ′ ax+by=gcd(a,b)=gcd(b,a\%b)=bx'+(a\%b)y'=bx'+(a-a/b*b)y' ax+by=gcd(a,b)=gcd(b,a%b)=bx′+(a%b)y′=bx′+(a−a/b∗b)y′
将 a , b a,b a,b看做变量,移项合并同类项
a x + b y = b x ′ + ( a − a / b ∗ b ) y ′ ax+by=bx'+(a-a/b*b)y' ax+by=bx′+(a−a/b∗b)y′
a x + b y − b x ′ − a y ′ + a / b ∗ b y ′ = 0 ax+by-bx'-ay'+a/b*by'=0 ax+by−bx′−ay′+a/b∗by′=0
x a − y ′ a + y b − x ′ b + a / b ∗ y ′ b = 0 xa-y'a+yb-x'b+a/b*y'b=0 xa−y′a+yb−x′b+a/b∗y′b=0
( x − y ′ ) a + ( y − x ′ + a / b ∗ y ′ ) b = 0 (x-y')a+(y-x'+a/b*y')b=0 (x−y′)a+(y−x′+a/b∗y′)b=0
∵ a ∗ b ≠ 0 ∵a*b≠0 ∵a∗b=0
∴ x − y ′ = 0 , y − x ′ + a / b ∗ y ′ = 0 ∴x-y'=0,y-x'+a/b*y'=0 ∴x−y′=0,y−x′+a/b∗y′=0
∴ { x = y ′ y = x ′ − y ′ ∗ ( a / b ) ∴\begin{cases}x=y'\\y=x'-y'*(a/b)\end{cases} ∴{ x=y′y=x′−y′∗(a/b)
只需要求出 x ′ , y ′ x',y' x′,y′就可以求出 x , y x,y x,y
而求 x ′ , y ′ x',y' x′,y′可以继续递归下去
g c d ( a , b ) gcd(a,b) gcd(a,b)中的参数 b b b最终会变为 0 0 0,此时 g c d ( a , 0 ) = a gcd(a,0)=a gcd(a,0)=a
于是有 a x + b y = g c d ( a , 0 ) = a ax+by=gcd(a,0)=a ax+by=gcd(a,0)=a,可以求出 x = 1 , y = 0 x=1,y=0 x=1,y=0
这是最底层的 x , y x,y x,y,然后一层层返回,就可以求出最原始的 x , y x,y x,y了
注意, e x g c d exgcd exgcd求出来的 x , y x,y x,y满足的方程组是 a x + b x = g c d ( a , b ) ax+bx=gcd(a,b) ax+bx=gcd(a,b)
将这一对 x , y x,y x,y乘上 c g c d ( a , b ) \frac{c}{gcd(a,b)} gcd(a,b)c,才是原方程的一组解
而且,这一组解只是一组特解,并不一定是最小的,可以通过通解公式去找到最小解 x x x
a x + b y = c ax+by=c ax+by=c
a ( x − k ) + b ( y + a k b ) = c a(x-k)+b(y+\frac{ak}{b})=c a(x−k)+b(y+bak)=c
因为 a a a缩小若干倍,为了保证方程的正确性, b b b就应该放大若干倍,所以需满足 b ∣ a k b|ak b∣ak
∴ b g c d ( a , b ) ∣ a g c d ( a , b ) k ∴\frac{b}{gcd(a,b)}|\frac{a}{gcd(a,b)}k ∴gcd(a,b)b∣gcd(a,b)ak
∵ ( b g c d ( a , b ) , a g c d ( a , b ) ) = 1 ∵(\frac{b}{gcd(a,b)},\frac{a}{gcd(a,b)})=1 ∵(gcd(a,b)b,gcd(a,b)a)=1
∴ b g c d ( a , b ) ∣ k ∴\frac{b}{gcd(a,b)}|k ∴gcd(a,b)b∣k
所以原方程的 a a a可以无限缩小 b g c d ( a , b ) \frac{b}{gcd(a,b)} gcd(a,b)b倍,直到 a < b g c d ( a , b ) a<\frac{b}{gcd(a,b)} a<gcd(a,b)b
void exgcd( int a, int b, int &d, int &x, int &y ) {
if( ! b ) d = a, x = 1, y = 0;
else {
exgcd( b, a % b, d, y, x );
y -= x * ( a / b );
}
}
//求x的最小解
x = ( x * ( c / d ) % ( b / d ) + ( b / d ) ) % ( b / d )
求一个模线性方程组 x x x
{ x ≡ a 1 ( m o d r 1 ) x ≡ a 2 ( m o d r 2 ) . . . x ≡ a k ( m o d r k ) \begin{cases}x\equiv a_1\ \ (mod\ \ r_1)\\x\equiv a_2\ \ (mod\ \ r_2)\\...\\x\equiv a_k\ \ (mod\ \ r_k)\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1 (mod r1)x≡a2 (mod r2)...x≡ak (mod rk)
其中 r 1 , r 2 , . . . , r k r_1,r_2,...,r_k r1,r2,...,rk互质
对于 r i r_i ri,设 A i = ∏ j ≠ i r j A_i=\prod_{j≠i}r_j Ai=∏j=irj
∵ ( r 1 , r 2 , . . . , r k ) = 1 ∵(r_1,r_2,...,r_k)=1 ∵(r1,r2,...,rk)=1
∴ ( A i , r i ) = 1 ∴(A_i,r_i)=1 ∴(Ai,ri)=1
则一定存在一个整数 c i c_i ci满足 c i ∗ A i % r i = 1 c_i*A_i\% r_i=1 ci∗Ai%ri=1
设 x i = a i ∗ c i ∗ A i x_i=a_i*c_i*A_i xi=ai∗ci∗Ai,则 x i % r i = a i x_i\%r_i=a_i xi%ri=ai
因为 A i A_i Ai是除了 r i r_i ri以外的其他 r r r值的最小公倍数
所以, x i % r j = 0 ( j ≠ i ) x_i\%r_j=0(j≠i) xi%rj=0(j=i),即 x i x_i xi模其他的 r r r余数都为 0 0 0,只有模 r i r_i ri的时候,余数为 a i a_i ai
换言之,把 x i x_i xi加到满足其他方程 j ( j ≠ i ) j(j≠i) j(j=i)的解 x j x_j xj上, ( x i + x j ) (x_i+x_j) (xi+xj)也一样满足方程 j j j
同理,如果 x j x_j xj也是这么求出来的,则 ( x i + x j ) (x_i+x_j) (xi+xj)也满足方程 i i i
那么,我们对于每一个方程,都按照这个方法求出来该方程的解
把这些解累加起来,发现,这个和仍然满足每一个方程
即 x = ∑ i = 1 k a i ∗ c i ∗ A i % r i x=\sum_{i=1}^ka_i*c_i*A_i\%r_i x=∑i=1kai∗ci∗Ai%ri
对于 x x x,加上所有的 r r r值的最小公倍数,它仍然满足所有方程
所以,只要存在 x x x,则意味着有无穷多组解
通解为: x = ∑ i = 1 k ( r i ∗ c i ∗ A i % a i ) + p ∗ ∏ i = 1 k r i , p ∈ Z x=\sum_{i=1}^k(r_i*c_i*A_i\%a_i)+p*\prod_{i=1}^kr_i,p∈Z x=i=1∑k(ri∗ci∗Ai%ai)+p∗i=1∏kri,p∈Z
求一个模线性方程组 x x x
{ x ≡ a 1 ( m o d r 1 ) x ≡ a 2 ( m o d r 2 ) . . . x ≡ a k ( m o d r k ) \begin{cases}x\equiv a_1\ \ (mod\ \ r_1)\\x\equiv a_2\ \ (mod\ \ r_2)\\...\\x\equiv a_k\ \ (mod\ \ r_k)\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1 (mod r1)x≡a2 (mod r2)...x≡ak (mod rk)
其中 r 1 , r 2 , . . . , r k r_1,r_2,...,r_k r1,r2,...,rk不一定互质
首先,取前两个方程 x = k ∗ r 1 + a 1 = p ∗ r 2 + a 2 x=k*r_1+a_1=p*r_2+a_2 x=k∗r1+a1=p∗r2+a2 k ∗ r 1 − p ∗ r 2 = a 2 − a 1 k*r_1-p*r_2=a_2-a_1 k∗r1−p∗r2=a2−a1
这种形如 a x + b y = c ax+by=c ax+by=c的不定方程,可以用扩展欧几里得计算
当 g c d ( r 1 , r 2 ) gcd(r_1,r_2) gcd(r1,r2)不能整除 a 2 − a 1 a_2-a_1 a2−a1时,方程组无解
否则,根据 e x g c d exgcd exgcd,求出 k 0 k_0 k0,满足 k 0 ∗ r 1 − p ∗ r 2 = a 2 − a 1 k_0*r_1-p*r_2=a_2-a_1 k0∗r1−p∗r2=a2−a1
k k k的通解为:
k = k 0 + b ∗ ( r 2 / g c d ( r 1 , r 2 ) ) k=k_0+b*(r_2/gcd(r_1,r_2)) k=k0+b∗(r2/gcd(r1,r2))
带入到方程组 x = k ∗ r 1 + a 1 x=k*r_1+a_1 x=k∗r1+a1中,则有 x = ( k 0 + b ∗ ( r 2 / g c d ( r 1 , r 2 ) ) ) ∗ r 1 + a 1 = k 0 ∗ r 1 + b ∗ l c m ( r 1 , r 2 ) + a 1 , b ∈ Z x=(k_0+b*(r_2/gcd(r_1,r_2)))*r_1+a_1=k_0*r_1+b*lcm(r_1,r_2)+a_1,b∈Z x=(k0+b∗(r2/gcd(r1,r2)))∗r1+a1=k0∗r1+b∗lcm(r1,r2)+a1,b∈Z
即 x ≡ a 1 ( m o d l c m ( r 1 , r 2 ) ) x\equiv a_1\ \ (mod\ \ lcm(r_1,r_2)) x≡a1 (mod lcm(r1,r2))
这个方程相当于合并了原来的两个方程,而形式上又和原来的方程一致
继续采用这个方法,不断地合并方程组中的两个方程
直到最后合并为一个方程,则可以得到 x x x的通解
注意在这个过程中,要注意求出的 k 0 k_0 k0是 k ∗ r 1 − p ∗ r 2 = ( a 2 − a 1 ) k*r_1-p*r_2=(a_2-a_1) k∗r1−p∗r2=(a2−a1)的解
而不是 k ∗ r 1 − p ∗ r 2 = g c d ( r 1 , r 2 ) k*r_1-p*r_2=gcd(r_1,r_2) k∗r1−p∗r2=gcd(r1,r2)的解,前者是后者的倍数
//扩展中国剩余定理,求最小整数解x的模板代码
#include
#define MAXK 10000005
#define int long long
int mod[MAXK], r[MAXK];
void exgcd( int a, int b, int &d, int &x, int &y ) {
if( ! b ) d = a, x = 1, y = 0;
else {
exgcd( b, a % b, d, y, x );
y -= x * ( a / b );
}
}
int Fabs( int x ) {
return ( x < 0 ) ? -x : x;
}
signed main() {
int m;
while( ~ scanf( "%lld", &m ) ) {
for( int i = 1;i <= m;i ++ )
scanf( "%lld %lld", &mod[i], &r[i] );
int noans = 0, d, x, y;
for( int i = 1;i < m;i ++ ) {
exgcd( mod[i], mod[i + 1], d, x, y );
if( Fabs( r[i + 1] - r[i] ) % d ) {
noans = 1;
break;
}
x = ( x * ( ( r[i + 1] - r[i] ) / d ) % ( mod[i + 1] / d ) + ( mod[i + 1] / d ) ) % ( mod[i + 1] / d );
int lcm = mod[i] / d * mod[i + 1];
mod[i + 1] = lcm, r[i + 1] = ( x * mod[i] + r[i] ) % lcm;
}
if( noans ) printf( "-1\n" );
else printf( "%lld\n", r[m] );
//r[m]可能等于0,所以根据题目要求,若要最小正整数,则为mod[m]
}
return 0;
}