数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

在这里插入图片描述

同余,整除

整除的性质:

  • 传递性:若 a ∣ b , b ∣ c a|b,b|c ab,bc,则 a ∣ c a|c ac
  • a ∣ b , a ∣ c a|b,a|c ab,ac等价于对于任意的整数 x , y x,y x,y,有 a ∣ ( b x + c y ) a|(bx+cy) a(bx+cy)
  • m ≠ 0 m≠0 m=0,则 a ∣ b a|b ab等价于 m a ∣ m b ma|mb mamb
  • 设整数 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,an,b,n,则 ( a b ) ∣ n (ab)|n (ab)n
  • b = q ∗ d + c b=q*d+c b=qd+c,则 d ∣ b d|b db的充要条件是 d ∣ c d|c dc

同余的性质:

  • 同加性:若 a ≡ b ( m o d   p ) a\equiv b(mod\ p) ab(mod p),则 a + c ≡ b + c ( m o d   p ) a+c\equiv b+c(mod\ p) a+cb+c(mod p)
  • 同减性:若 a ≡ b ( m o d   p ) a\equiv b(mod\ p) ab(mod p),则 a − c ≡ b − c ( m o d   p ) a-c\equiv b-c(mod\ p) acbc(mod p)
  • 同乘性:若 a ≡ b ( m o d   p ) a\equiv b(mod\ p) ab(mod p),则 a × c ≡ b × c ( m o d   p ) a\times c\equiv b\times c(mod\ p) a×cb×c(mod p)
  • 同除性:若 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 ab(mod p),ca,cb,(c,p)=1,则 a / c ≡ b / c ( m o d   p ) a/c\equiv b/c(mod\ p) a/cb/c(mod p)
  • 同幂性:若 a ≡ b ( m o d   p ) , c > 0 a\equiv b(mod\ p),c>0 ab(mod p),c>0,则 a c ≡ b c ( m o d   p ) a^c\equiv b^c(mod\ p) acbc(mod p)
  • 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%(pq)=x

数论常识:

  • 若2能整除a的最末位,则 2 ∣ a 2|a 2a
  • 若4能整除a的末两位,则 4 ∣ a 4|a 4a
  • 若8能整除a的末三位,则 8 ∣ a 8|a 8a
  • 若3能整除a的各位数字之和,则 3 ∣ a 3|a 3a
  • 若9能整除a的各位数字之和,则 9 ∣ a 9|a 9a
  • 若11能整除a的偶数位数字之和与奇数位数字之和的差,则 11 ∣ a 11|a 11a
  • 能被 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 (ab)%c=(a%cb%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\bigg|a,d\bigg|b a%b=c,da,db,则 ( 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 ipi打上标记

如发现 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)=ab

证明:
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,(0i1,0i2...0ik)
设 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,(0j1,0j2...0jk)
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=xd,b=yd

根据模运算的放缩性有: a % b = ( x ∗ d ) % ( y ∗ d ) = ( x % y ) ∗ d a\%b=(x*d)\%(y*d)=(x\%y)*d a%b=(xd)%(yd)=(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 );
}

时间复杂度 O ( log ⁡ ) O(\log) O(log),最坏情况就是斐波拉契数列,相当于相邻两位一位一位移动(辗转相减)

辗转相减法:

g c d ( a , b ) = g c d ( b , a − b ) , a > b gcd(a,b)=gcd(b,a-b),a>b gcd(a,b)=gcd(b,ab),a>b

证明:

a = A d , b = B d , ( A , B ) = 1 → ( a , b ) = d a=Ad,b=Bd,(A,B)=1\rightarrow (a,b)=d a=Ad,b=Bd,(A,B)=1(a,b)=d

a − b = ( A − B ) d a-b=(A-B)d ab=(AB)d

g c d ( b , a − b ) = g c d ( B d , ( A − B ) d ) ≠ d gcd(b,a-b)=gcd\bigg(Bd,(A-B)d\bigg)≠d gcd(b,ab)=gcd(Bd,(AB)d)=d

说明 g c d ( B , A − B ) > 1 gcd(B,A-B)>1 gcd(B,AB)>1

g c d ( B , A − B ) = g , B = s g , A − B = t g gcd(B,A-B)=g,B=sg,A-B=tg gcd(B,AB)=g,B=sg,AB=tg

则一定有 g ∣ A g\bigg|A gA

( A , B ) = 1 (A,B)=1 (A,B)=1矛盾,所以 g c d ( B , A − B ) = 1 gcd(B,A-B)=1 gcd(B,AB)=1


更相减损术

若约分 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\bigg|c dc,则存在整数 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 ax+by=1,(a,b)=1

证明转化为 求一对 x , y x,y x,y,使得 a ′ x + b ′ y = 1 a'x+b'y=1 ax+by=1,且满足 ( a ′ , b ′ ) = 1 (a',b')=1 (a,b)=1

即求证 a ′ x % b ′ = 1 a'x\%b'=1 ax%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) 0ka(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<b 0<k<b

∴ 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,a2,a3...(b1)a这些数取模 b b b,余数互不相等

证明:

反证法

设存在 0 < i < j < b 0<i<j<b 0<i<j<b,使得 a ∗ i ≡ a ∗ j ( m o d   b ) a*i\equiv a*j(mod\ b) aiaj(mod b)

则有 ( i − j ) ∗ a ≡ 0 ( m o d   b ) (i-j)*a\equiv 0(mod\ b) (ij)a0(mod b)

同理引理一, i − j , a i-j,a ij,a都不可能整除 b b b,故与假设矛盾,不成立


引理二

如果 ( a , b ) = 1 (a,b)=1 (a,b)=1,则必存在一个整数 k k k,满足 k ∗ a % b = 1 k*a\% b=1 ka%b=1

证明:
在这里插入图片描述
根据上面推论易知,这些数取模 b b b的值只会在区间 [ 0 , b − 1 ] [0,b-1] [0,b1] 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 ka%b=1

k ∗ a − p ∗ b = 1 k*a-p*b=1 kapb=1,裴蜀定理得证


威尔逊定理

( p − 1 ) ! ≡ − 1 ( m o d   p ) (p-1)!\equiv -1(mod\ p) (p1)!1(mod p)当且仅当 p p p为质数

证明:

先证充分性 → p \rightarrow p p为质数,有 ( p − 1 ) ! ≡ p − 1 ( m o d   p ) (p-1)!\equiv p-1(mod\ p) (p1)!p1(mod p)

假设 0 < i < p 0<i<p 0<i<p,根据上面的裴蜀定理,可得 ( i , p ) = 1 (i,p)=1 (i,p)=1,且必存在一个整数 j ( 0 < j < p ) j(0<j<p) j(0<j<p)

使得 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,p1]中逆元是一对一对的

然而……也有可能存在 i i i的逆元是本身的,那么此时的 i i i就要满足以下条件

i 2 % p = 1 ⇒ ( i + 1 ) ( i − 1 ) % p = 0 i^2\%p=1\Rightarrow (i+1)(i-1)\%p=0 i2%p=1(i+1)(i1)%p=0

∴ i + 1 = 0 ∴i+1=0 i+1=0 p p p i − 1 = 0 i-1=0 i1=0 p p p

∵ 0 < i < p ∵0<i<p 0<i<p

∴ i + 1 = p , i − 1 = 0 ∴i+1=p,i-1=0 i+1=p,i1=0

i = p − 1 , 1 i=p-1,1 i=p1,1

每一对逆元取模 p p p都为 1 1 1,需要证明的原式变成 1 ∗ p − 1 ≡ p − 1 ( m o d   p ) 1*p-1\equiv p-1(mod\ p) 1p1p1(mod p)

显然成立,证毕
在这里插入图片描述


再证必要性 → ( p − 1 ) ! ≡ p − 1 ( m o d   p ) \rightarrow (p-1)!\equiv p-1(mod\ p) (p1)!p1(mod p),当该式成立时, p p p一定为质数

反证法,即证明 p p p不为质数时,该式不成立

p p p不为质数,则 [ 2 , p − 1 ] [2,p-1] [2,p1]中一定有 p p p的因子,设为 i i i,则 i , p / i i,p/i i,p/i均为 p p p的因子

  • 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×...×(p1)一定是 p p p的倍数,取模 p p p 0 0 0

  • 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×...×(p1)一定是 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 p1不可能是 i i i的倍数,所以 ( p − 1 ) ! ≡ − 1 ( m o d   p ) (p-1)!\equiv-1(mod\ p) (p1)!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 ap1%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) (a1)(a2)...(a(p1))=ap1(p1)!  (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\} {(a1)%p,(a2)%p,...,(a(p1))%p}={1,p1}
即取模后的值互不相等,且 ∈ [ 1 , p − 1 ] ∈[1,p-1] [1,p1]
∴ ( 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) (a1)%p,(a2)%p,...,(a(p1))%p=(p1)!  (mod p)
( p − 1 ) ! = a p − 1 ( p − 1 ) !    ( m o d   p ) (p-1)!=a^{p-1}(p-1)!\ \ (mod\ p) (p1)!=ap1(p1)!  (mod p)
∴ a p − 1 = 1    ( m o d   p ) ∴a^{p-1}=1\ \ (mod\ p) ap1=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,...,p1}
p p p剩余系指的是 { 0 , 1 , 2 , . . . , p − 1 } \{0,1,2,...,p-1\} {0,1,2,...,p1},即小于 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 p p 6 6 6,则 Z p ∗ = { 1 , 5 } Z_p^*=\{1,5\} Zp={1,5}
缩系又称为简化剩余系

在这里插入图片描述


欧拉函数

欧拉函数即为缩系的大小

ϕ ( 1 ) = 1 \phi(1)=1 ϕ(1)=1

  • 如果 n n n为质数,则 ϕ ( n ) = n − 1 \phi(n)=n-1 ϕ(n)=n1
  • 如果 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)=apap1=ap(1a1)
  • 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 ) = a 1 p 1 ( 1 − 1 a 1 ) ∗ a 2 p 2 ( 1 − 1 a 2 ) . . . a k p k ( 1 − 1 a k ) \phi(n)=\phi(a_1^{p_1})\phi(a_2^{p_2})...\phi(a_k^{p_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}) ϕ(n)=ϕ(a1p1)ϕ(a2p2)...ϕ(akpk)=a1p1(1a11)a2p2(1a21)...akpk(1ak1)
    = 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(1a11)(1a21)...(1ak1)

∑ d ∣ n ϕ ( d ) = n \sum_{d\big|n}\phi(d)=n dnϕ(d)=n

考虑用分数形式证明

n n n个真分数: 1 n , 2 n , . . . , n − 1 n , n n \frac{1}{n},\frac{2}{n},...,\frac{n-1}{n},\frac{n}{n} n1,n2,...,nn1,nn

然后进行分数化简,按分母不同分类

分母一定是 n n n的因数,且分母分子互质,并且真分数形式的分子小于分母

那么该类分数个数就是分母的 ϕ \phi ϕ,得证

小于 n n n且与 n n n互质的所有正整数之和为 n ϕ ( n ) 2 \frac{n\phi(n)}{2} 2nϕ(n)

证明:
s = { a 1 , a 2 , . . . , a k } s=\{a_1,a_2,...,a_k\} s={a1,a2,...,ak}是在模 n n n意义下的缩系,根据缩系定义,个数就是 ϕ ( n ) \phi(n) ϕ(n)

t = { n − a 1 , n − a 2 , . . . , n − a k } t=\{n-a_1,n-a_2,...,n-a_k\} t={na1,na2,...,nak}也是模 n n n意义下的缩系(详见辗转相除法的辗转相减)

两个集合相加,证毕
在这里插入图片描述

//求单个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\} {ap1,ap2,...,apk}也构成了 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) (ap1)(ap2)...(apk)p1p2...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)} arar%ϕ(m)+ϕ(m)

证明:

分类讨论

  • .如果 ( a , m ) = 1 (a,m)=1 (a,m)=1,则显然成立

    因为由欧拉定理得 a ϕ ( m ) ≡ 1 ( m o d m ) a^{\phi(m)}\equiv1\pmod m aϕ(m)1(modm)

  • ( 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} {xy (mod m)xy (mod n)
则有
x ≡ y   ( m o d    l c m ( n , m ) ) x\equiv y\ (mod\ \ lcm(n,m)) xy (mod  lcm(n,m))

证明:
显然 ( x − y ) (x-y) (xy)既是 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)\ge 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,p1)=1,(p2,p21)=1,...,(pq,pq1)=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)=pq1(p1)

根据数学归纳法

考虑 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 pk1(p1)>=k

∵ k > 1 ∵k>1 k>1

∴ ∴ 显然 p k ∗ ( p − 1 ) > = k + 1 p^k*(p-1)>=k+1 pk(p1)>=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\bigg|a pa

    由引理二可得 ϕ ( 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=xpr=ypϕ(m)=zpk(从 p p p的指数上抽一些下来使 x → y → z x\rightarrow y\rightarrow z xyz

    m ∣ a r , m ∣ p ϕ ( m ) m\bigg|a^r,m\bigg|p^{\phi(m)} mar,mpϕ(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) arar%ϕ(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) arar%ϕ(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) arar%ϕ(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) arar%ϕ(mn)+ϕ(mn)  (mod  mn)

    m 1 , m 2 , . . . , m n m_1,m_2,...,m_n m1,m2,...,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)}\pmod m arar%ϕ(m)+ϕ(m)(modm)

区间逆元

如果整数 a , b a,b a,b满足 a ∗ b % p = 1 a*b\%p=1 ab%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} a1

证明:

( 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),da,dp

∴ d ∣ a % p ∴d|a\%p da%p(感性理解为:x倍 d d d减去y倍 p p p直到 x < y x<y x<y,其差一定也为 d d d的倍数)

∴ 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=ab1%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[mi]

证明:

f [ i ] ∗ i ≡ 1     ( m o d   m ) f[i]*i\equiv1\ \ \ (mod\ m) f[i]i1   (mod m)

f [ i ] ∗ ( m − i ) ≡ − 1     ( m o d   m ) f[i]*(m-i)\equiv-1\ \ \ (mod\ m) f[i](mi)1   (mod m)

f [ m − i ] ∗ ( m − i ) ≡ 1     ( m o d   m ) f[m-i]*(m-i)\equiv1\ \ \ (mod\ m) f[mi](mi)1   (mod m)

f [ i ] = − f [ m − i ] f[i]=-f[m-i] f[i]=f[mi]


公式二:

f [ i ] = k ∗ f [ k ∗ i ] f[i]=k*f[k*i] f[i]=kf[ki]

证明:

f [ i ∗ k ] ∗ ( i ∗ k ) ≡ 1     ( m o d   m ) f[i*k]*(i*k)\equiv 1\ \ \ (mod\ m) f[ik](ik)1   (mod m)

( f [ i ∗ k ] ∗ k ) ∗ i ≡ 1     ( m o d   m ) (f[i*k]*k)*i\equiv 1\ \ \ (mod\ m) (f[ik]k)i1   (mod m)

f [ i ] ∗ i ≡ 1     ( m o d   m ) f[i]*i\equiv 1\ \ \ (mod\ m) f[i]i1   (mod m)

f [ i ∗ k ] ∗ k = f [ i ] f[i*k]*k=f[i] f[ik]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]=kf[kn]=m/n×f[mm%n]

f [ m − m % n ] = − f [ m % n ] f[m-m\%n]=-f[m\%n] f[mm%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])


inv[1] = 1;
for( int i = 2;i <= n;i ++ )
	inv[i] = ( mod - mod / i ) * inv[mod % i] % mod;

扩展欧几里得

扩展欧几里得是用来求不定方程: 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+(aa/bb)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+(aa/bb)y
a x + b y − b x ′ − a y ′ + a / b ∗ b y ′ = 0 ax+by-bx'-ay'+a/b*by'=0 ax+bybxay+a/bby=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 xaya+ybxb+a/byb=0
( x − y ′ ) a + ( y − x ′ + a / b ∗ y ′ ) b = 0 (x-y')a+(y-x'+a/b*y')b=0 (xy)a+(yx+a/by)b=0
∵ a ∗ b ≠ 0 ∵a*b≠0 ab=0
∴ x − y ′ = 0 , y − x ′ + a / b ∗ y ′ = 0 ∴x-y'=0,y-x'+a/b*y'=0 xy=0,yx+a/by=0
∴ { x = y ′ y = x ′ − y ′ ∗ ( a / b ) ∴\begin{cases}x=y'\\y=x'-y'*(a/b)\end{cases} {x=yy=xy(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(xk)+b(y+bak)=c
因为 a a a缩小若干倍,为了保证方程的正确性, b b b就应该放大若干倍,所以需满足 b ∣ a k b\bigg|ak bak
∴ b g c d ( a , b ) ∣ a g c d ( a , b ) k ∴\frac{b}{gcd(a,b)}\bigg|\frac{a}{gcd(a,b)}k gcd(a,b)bgcd(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)bk
所以原方程的 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

同理,通解也可以被表示出来 X = x + t × b g c d ( a , b ) , Y = y − t × a g c d ( a , b ) X=x+t\times \frac{b}{gcd(a,b)},Y=y-t\times \frac{a}{gcd(a,b)} X=x+t×gcd(a,b)b,Y=yt×gcd(a,b)a

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} xa1  (mod  r1)xa2  (mod  r2)...xak  (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 ciAi%ri=1

x i = a i ∗ c i ∗ A i x_i=a_i*c_i*A_i xi=aiciAi,则 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=1kaiciAi%ri

对于 x x x,加上所有的 r r r值的最小公倍数,它仍然满足所有方程

所以,只要存在 x x x,则意味着有无穷多组解

通解为: x = ∑ i = 1 k ( a i ∗ c i ∗ A i % r i ) + p ∗ ∏ i = 1 k r i , p ∈ Z x=\sum_{i=1}^k(a_i*c_i*A_i\%r_i)+p*\prod_{i=1}^kr_i,p∈Z x=i=1k(aiciAi%ri)+pi=1kri,pZ


扩展中国剩余定理

求一个模线性方程组 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} xa1  (mod  r1)xa2  (mod  r2)...xak  (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=kr1+a1=pr2+a2 k ∗ r 1 − p ∗ r 2 = a 2 − a 1 k*r_1-p*r_2=a_2-a_1 kr1pr2=a2a1

这种形如 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 a2a1时,方程组无解

否则,根据 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 k0r1pr2=a2a1

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=kr1+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=k0r1+blcm(r1,r2)+a1,bZ
x ≡ a 1    ( m o d    l c m ( r 1 , r 2 ) ) x\equiv a_1\ \ (mod\ \ lcm(r_1,r_2)) xa1  (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) kr1pr2=(a2a1)的解

而不是 k ∗ r 1 − p ∗ r 2 = g c d ( r 1 , r 2 ) k*r_1-p*r_2=gcd(r_1,r_2) kr1pr2=gcd(r1,r2)的解,前者是后者的倍数

//扩展中国剩余定理,求最小整数解x的模板代码
#include <cstdio>
#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;
}

终于写完了!!!!!!!!!!!!!!!!!!!!!
在这里插入图片描述

利用以上所有知识进行证明

p p p是质数( p > 3 p>3 p>3),则 2 p + 1 2p+1 2p+1 4 p + 2 4p+2 4p+2至多有一个数是质数

抛开 3 3 3的倍数(肯定是合数),任何整数都可以被改写成 3 k ± 1 3k±1 3k±1的形式

  • p = 3 k + 1 p=3k+1 p=3k+1
    2 p + 1 = 6 k + 3 = 3 ( k + 1 ) 2p+1=6k+3=3(k+1) 2p+1=6k+3=3(k+1),合数
    4 p + 2 = 12 k + 6 = 6 ( 2 k + 1 ) 4p+2=12k+6=6(2k+1) 4p+2=12k+6=6(2k+1),合数
  • p = 3 k − 1 p=3k-1 p=3k1
    2 p + 1 = 6 k − 1 2p+1=6k-1 2p+1=6k1,未知
    4 p + 2 = 12 k − 2 = 2 ( 6 k − 1 ) 4p+2=12k-2=2(6k-1) 4p+2=12k2=2(6k1),合数

最多就是那个未知情况为质数,得证

g c d ( f ( n ) , f ( m ) ) = f ( g c d ( n , m ) ) gcd(f(n),f(m))=f(gcd(n,m)) gcd(f(n),f(m))=f(gcd(n,m))
f : f: f: 斐波拉契数列

gcd ⁡ ( a n − 1 , a m − 1 ) = a g c d ( n , m ) − 1 \gcd(a^n-1,a^m-1)=a^{gcd(n,m)}-1 gcd(an1,am1)=agcd(n,m)1

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值