打死没想到会在H老师处学懂数论
- 同余,整除
- 模运算
- 埃式筛法
- 欧拉筛法
- 最大公约数和最小公倍数
- 辗转相除法
- 更相减损术
- 裴蜀定理
- 威尔逊定理
- 费马定理
- 同余等价类、剩余系、缩系
- 欧拉函数
- 欧拉定理
- 扩展欧拉定理
- 区间逆元
- 扩展欧几里得
- 中国剩余定理
- 扩展中国剩余定理
- 利用以上所有知识进行证明
同余,整除
整除的性质:
- 传递性:若a∣b,b∣ca|b,b|ca∣b,b∣c,则a∣ca|ca∣c
- a∣b,a∣ca|b,a|ca∣b,a∣c等价于对于任意的整数x,yx,yx,y,有a∣(bx+cy)a|(bx+cy)a∣(bx+cy)
- 设m≠0m≠0m=0,则a∣ba|ba∣b等价于ma∣mbma|mbma∣mb
- 设整数x,yx,yx,y满足ax+by=1,a∣n,b∣,nax+by=1,a|n,b|,nax+by=1,a∣n,b∣,n,则(ab)∣n(ab)|n(ab)∣n
- 若b=q∗d+cb=q*d+cb=q∗d+c,则d∣bd|bd∣b的充要条件是d∣cd|cd∣c
同余的性质:
- 同加性:若a≡b(modp)a\equiv b(mod\ p)a≡b(mod p),则a+c≡b+c(modp)a+c\equiv b+c(mod\ p)a+c≡b+c(mod p)
- 同减性:若a≡b(modp)a\equiv b(mod\ p)a≡b(mod p),则a−c≡b−c(modp)a-c\equiv b-c(mod\ p)a−c≡b−c(mod p)
- 同乘性:若a≡b(modp)a\equiv b(mod\ p)a≡b(mod p),则a×c≡b×c(modp)a\times c\equiv b\times c(mod\ p)a×c≡b×c(mod p)
- 同除性:若a≡b(modp),c∣a,c∣b,(c,p)=1a\equiv b(mod\ p),c|a,c|b,(c,p)=1a≡b(mod p),c∣a,c∣b,(c,p)=1,则a/c≡b/c(modp)a/c\equiv b/c(mod\ p)a/c≡b/c(mod p)
- 同幂性:若a≡b(modp),c>0a\equiv b(mod\ p),c>0a≡b(mod p),c>0,则ac≡bc(modp)a^c\equiv b^c(mod\ p)ac≡bc(mod p)
- 若a%p=x,a%q=x,(p,q)=1a\% p=x,a\% q=x,(p,q)=1a%p=x,a%q=x,(p,q)=1,则a%(p∗q)=xa\% (p*q)=xa%(p∗q)=x
数论常识:
- 若2能整除a的最末位,则2∣a2|a2∣a
- 若4能整除a的末两位,则4∣a4|a4∣a
- 若8能整除a的末三位,则8∣a8|a8∣a
- 若3能整除a的各位数字之和,则3∣a3|a3∣a
- 若9能整除a的各位数字之和,则9∣a9|a9∣a
- 若11能整除a的偶数位数字之和与奇数位数字之和的差,则11∣a11|a11∣a
- 能被7,11,137,11,137,11,13整除的数的特征是:这个数的末三位与末三位以前的数字所组成数之差能被7,11,137,11,137,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
- (ab)%c=(a%c)b%c(a^b)\% c=(a\% c)^b\% c(ab)%c=(a%c)b%c
2.放缩性
- 如果a%b=c,d≠0a\% b=c,d≠0a%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∣ba\%b=c,d\bigg|a,d\bigg|ba%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)/ba/b\%c=a\%(b\times c)/ba/b%c=a%(b×c)/b
埃式筛法
先把nnn以内的222的倍数(不包含222)全部删除,再把nnn以内的333的倍数(不包含333)全部删除,…
这样做下去,最后剩下的以内的数全为质数
这里的删除其实不是真的删除,只是打上一个删除标记而已
每个数都会被它的质因子打一次标记,而一个数的不同的质因子个数不超过logNlogNlogN
所以时间复杂度为O(NlogN)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;}
}
欧拉筛法
在上述的埃氏筛法中,一个数可能被它的各个质因子都筛了一遍
而一个数的质因子种类数是不会超过logNlogNlogN的,所以时间复杂度为O(NlogN)O(NlogN)O(NlogN)
而欧式筛法保证每个数只被它的最小质因子筛一遍,这样,时间复杂度便降成了O(N)O(N)O(N)
有一个质数集合SSS,一开始,质数集合为空
同时有一个boolboolbool数组flagflagflag,表示删除标记
有两层循环:
外层循环从222开始枚举倍数,设当前枚举的量为aaa
如果aaa是质数,则将aaa加入质数集合
内层循环枚举质数集合中的元素,将数组中它们的aaa倍全部打上删除标记
显然,未打删除标记的数都是质数了(flagflagflag数组中下标小于222的元素是无效的,不用考虑)
但现在的时间复杂度仍然是O(NlogN)O(NlogN)O(NlogN)的,接下来,要用一个优化来完成O(N)O(N)O(N)的蜕变
设当前倍数为aaa,在内层循环中,设当前枚举到集合SSS中的第iii个质数pip_ipi
先将i∗pii*p_ii∗pi打上标记
如发现iii是pip_ipi的倍数时
此时后续的质数就无需再枚举了,可以提前退出内层循环
外层循环处理下一轮,即a++a++a++
为什么满足这种条件就可以提前breakbreakbreak呢?
设后续的质数为pi′p_i'pi′,而pi′>pip_i'>p_ipi′>pi
因为aaa是pip_ipi的倍数,那么a×pi′a\times p_i'a×pi′也是pip_ipi的倍数
设a×pi′=b×pia\times p_i'=b\times p_ia×pi′=b×pi
∵pi′>pi∵p_i'>p_i∵pi′>pi
∴b>a∴b>a∴b>a
我们希望每个数被它的最小质因子给删掉
所以a×pi′a\times p_i'a×pi′应该被pip_ipi删掉(就要求a×pi′/pia\times p_i'/p_ia×pi′/pi尽量大)
所以后续所有的质数就都留给倍数aaa增长到bbb再去处理了
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;}}
}
最大公约数和最小公倍数
gcd(a,b)×lcm(a,b)=a∗bgcd(a,b)\times lcm(a,b)=a*bgcd(a,b)×lcm(a,b)=a∗b
证明:
将a,ba,ba,b进行质因子分解,设a,ba,ba,b的质因子集合并集为p1,p2,p3...pkp_1,p_2,p_3...p_kp1,p2,p3...pk
设a=p1i1p2i2...pkik,(0≤i1,0≤i2...0≤ik)设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=p1j1p2j2...pkjk,(0≤j1,0≤j2...0≤jk)设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)
gcd(a,b)=p1min(i1,j1)p2min(i2,j2)...pkmin(ik,jk)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)
lcm(a,b)=p1max(i1,j1)p2max(i2,j2)...pkmax(ik,jk)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)
∵min(it,jt)+max(it,jt)=it+jt∵min(i_t,j_t)+max(i_t,j_t)=i_t+j_t∵min(it,jt)+max(it,jt)=it+jt
∴gcd(a,b)+lcm(a,b)=p1i1+j1p2i2+j2...pkik+jk∴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
辗转相除法
gcd(a,b)≡gcd(b,a%b)gcd(a,b)\equiv gcd(b,a\%b)gcd(a,b)≡gcd(b,a%b)
证明:
设d=gcd(a,b),a=x∗d,b=y∗dd=gcd(a,b),a=x*d,b=y*dd=gcd(a,b),a=x∗d,b=y∗d
根据模运算的放缩性有:a%b=(x∗d)%(y∗d)=(x%y)∗da\%b=(x*d)\%(y*d)=(x\%y)*da%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 );
}
时间复杂度O(log)O(\log)O(log),最坏情况就是斐波拉契数列,相当于相邻两位一位一位移动(辗转相减)
辗转相减法:
gcd(a,b)=gcd(b,a−b),a>bgcd(a,b)=gcd(b,a-b),a>bgcd(a,b)=gcd(b,a−b),a>b
证明:
令a=Ad,b=Bd,(A,B)=1→(a,b)=da=Ad,b=Bd,(A,B)=1\rightarrow (a,b)=da=Ad,b=Bd,(A,B)=1→(a,b)=d
则a−b=(A−B)da-b=(A-B)da−b=(A−B)d
若gcd(b,a−b)=gcd(Bd,(A−B)d)≠dgcd(b,a-b)=gcd\bigg(Bd,(A-B)d\bigg)≠dgcd(b,a−b)=gcd(Bd,(A−B)d)=d
说明gcd(B,A−B)>1gcd(B,A-B)>1gcd(B,A−B)>1
令gcd(B,A−B)=g,B=sg,A−B=tggcd(B,A-B)=g,B=sg,A-B=tggcd(B,A−B)=g,B=sg,A−B=tg
则一定有g∣Ag\bigg|Ag∣∣∣∣A
与(A,B)=1(A,B)=1(A,B)=1矛盾,所以gcd(B,A−B)=1gcd(B,A-B)=1gcd(B,A−B)=1
更相减损术
若约分ab\frac{a}{b}ba
如a,ba,ba,b均为偶,可先将a,ba,ba,b折半,即/2/2/2
否则,将a,ba,ba,b交替的减去对方
直到最后两数相等,此时的数乘上先前除掉的222即为原来a,ba,ba,b的最大公约数
裴蜀定理
如果a,ba,ba,b的最大公约数为ddd,且d∣cd\bigg|cd∣∣∣∣c,则存在整数x,yx,yx,y,使得ax+by=cax+by=cax+by=c
证明:
转化证明存在x,yx,yx,y使得ax+by=dax+by=dax+by=d
假设存在这样一对x,yx,yx,y,那么只需将其进行倍数放缩即可
∵(a,b)=d∵(a,b)=d∵(a,b)=d
∴∴∴设a′=a/d,b′=b/da'=a/d,b'=b/da′=a/d,b′=b/d
则有a′x+b′y=1,(a′,b′)=1a'x+b'y=1,(a',b')=1a′x+b′y=1,(a′,b′)=1
证明转化为 求一对x,yx,yx,y,使得a′x+b′y=1a'x+b'y=1a′x+b′y=1,且满足(a′,b′)=1(a',b')=1(a′,b′)=1
即求证a′x%b′=1a'x\%b'=1a′x%b′=1(感性理解:若干倍的a′a'a′减去若干倍的b′b'b′等于111)
引理一
如果a,ba,ba,b为正整数,且a,ba,ba,b互质,则不存在小于bbb的正整数kkk,使得0≡k∗a(modb)0\equiv k*a(mod\ b)0≡k∗a(mod b)
证明:
用反证法即可,假设存在这样的一个kkk使得该式成立
则需满足kkk或者aaa能整除bbb
∵(a,b)=1∵(a,b)=1∵(a,b)=1
∴a∴a∴a不可能整除bbb
∵0<k<b∵0<k<b∵0<k<b
∴k∴k∴k亦不可能整除bbb
推论
如果a,ba,ba,b为正整数,且a,ba,ba,b互质,则0,a,a∗2,a∗3...(b−1)∗a0,a,a*2,a*3...(b-1)*a0,a,a∗2,a∗3...(b−1)∗a这些数取模bbb,余数互不相等
证明:
反证法
设存在0<i<j<b0<i<j<b0<i<j<b,使得a∗i≡a∗j(modb)a*i\equiv a*j(mod\ b)a∗i≡a∗j(mod b)
则有(i−j)∗a≡0(modb)(i-j)*a\equiv 0(mod\ b)(i−j)∗a≡0(mod b)
同理引理一,i−j,ai-j,ai−j,a都不可能整除bbb,故与假设矛盾,不成立
引理二
如果(a,b)=1(a,b)=1(a,b)=1,则必存在一个整数kkk,满足k∗a%b=1k*a\% b=1k∗a%b=1
证明:
根据上面推论易知,这些数取模bbb的值只会在区间[0,b−1][0,b-1][0,b−1](k=0k=0k=0时取模余数为000)
而且各不相同,其中一定存在取模后的余数为111的值
根据引理二可知, 如果(a,b)=1(a,b)=1(a,b)=1,则必存在一个整数kkk,满足k∗a%b=1k*a\% b=1k∗a%b=1
即k∗a−p∗b=1k*a-p*b=1k∗a−p∗b=1,裴蜀定理得证
威尔逊定理
(p−1)!≡−1(modp)(p-1)!\equiv -1(mod\ p)(p−1)!≡−1(mod p),当且仅当ppp为质数
证明:
先证充分性→p\rightarrow p→p为质数,有(p−1)!≡p−1(modp)(p-1)!\equiv p-1(mod\ p)(p−1)!≡p−1(mod p)
假设0<i<p0<i<p0<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=1i\times j\%p=1i×j%p=1,即jjj是iii的逆元,由此可见逆元具有唯一性,相互性
所以在[1,p−1][1,p-1][1,p−1]中逆元是一对一对的
然而……也有可能存在iii的逆元是本身的,那么此时的iii就要满足以下条件
i2%p=1⇒(i+1)(i−1)%p=0i^2\%p=1\Rightarrow (i+1)(i-1)\%p=0i2%p=1⇒(i+1)(i−1)%p=0
∴i+1=0∴i+1=0∴i+1=0或ppp,i−1=0i-1=0i−1=0或ppp
∵0<i<p∵0<i<p∵0<i<p
∴i+1=p,i−1=0∴i+1=p,i-1=0∴i+1=p,i−1=0
即i=p−1,1i=p-1,1i=p−1,1
每一对逆元取模ppp都为111,需要证明的原式变成1∗p−1≡p−1(modp)1*p-1\equiv p-1(mod\ p)1∗p−1≡p−1(mod p)
显然成立,证毕
再证必要性→(p−1)!≡p−1(modp)\rightarrow (p-1)!\equiv p-1(mod\ p)→(p−1)!≡p−1(mod p),当该式成立时,ppp一定为质数
反证法,即证明ppp不为质数时,该式不成立
如ppp不为质数,则[2,p−1][2,p-1][2,p−1]中一定有ppp的因子,设为iii,则i,p/ii,p/ii,p/i均为ppp的因子
-
若i≠p/ii≠p/ii=p/i,则1×2×3×...×(p−1)1\times 2\times 3\times ...\times (p-1)1×2×3×...×(p−1)一定是ppp的倍数,取模ppp为000
-
若i=p/ii=p/ii=p/i,则1×2×3×...×(p−1)1\times 2\times 3\times ...\times (p-1)1×2×3×...×(p−1)一定是iii的倍数,模ppp必为iii的倍数
又因为ppp是iii的倍数,且i>1i>1i>1,所以p−1p-1p−1不可能是iii的倍数,所以(p−1)!≡−1(modp)(p-1)!\equiv-1(mod\ p)(p−1)!≡−1(mod p)
费马定理
如果ppp为质数,且a%p≠0a\%p≠0a%p=0,则有ap−1%p=1a^{p-1}\%p=1ap−1%p=1
证明:
(a∗1)∗(a∗2)∗...∗(a∗(p−1))=ap−1∗(p−1)!(modp)(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)!(modp)∴(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)!=ap−1(p−1)!(modp)(p-1)!=a^{p-1}(p-1)!\ \ (mod\ p)(p−1)!=ap−1(p−1)! (mod p)
∴ap−1=1(modp)∴a^{p-1}=1\ \ (mod\ p)∴ap−1=1 (mod p)
同余等价类、剩余系、缩系
对于一个正整数ppp,所有非负整数模ppp的结果,只有ppp种可能,即{0,1,2,...,p−1}\{0,1,2,...,p-1\}{0,1,2,...,p−1}
模ppp的剩余系指的是{0,1,2,...,p−1}\{0,1,2,...,p-1\}{0,1,2,...,p−1},即小于ppp的所有非负整数,这个集合中包含了所有模ppp的余数
模ppp的剩余系记为ZpZ_pZp
剩余系中,每一个元素代表的是一类数
比如在剩余系ZpZ_pZp中
- 000表示的是所有模ppp为000的数,即{0,p,2p,3p...}\{0,p,2p,3p...\}{0,p,2p,3p...}
- 111表示的是所有模ppp为111的数,即{1,p+1,2p+1,3p+1...}\{1,p+1,2p+1,3p+1...\}{1,p+1,2p+1,3p+1...}
这些模ppp余数相同的数,称为同余等价类
可以发现,在模意义下,所有的非负整数可以被分为若干同余等价类
如果我们只考虑剩余系中与模数p互质的数,便得到一个子集,称为模p的缩系,记为Zp∗Z_p^*Zp∗
如ppp为666,则Zp∗={1,5}Z_p^*=\{1,5\}Zp∗={1,5}
缩系又称为简化剩余系
欧拉函数
欧拉函数即为缩系的大小
ϕ(1)=1\phi(1)=1ϕ(1)=1
- 如果nnn为质数,则ϕ(n)=n−1\phi(n)=n-1ϕ(n)=n−1
- 如果n=apn=a^pn=ap,且aaa为质数,则ϕ(n)=ap−ap−1=ap(1−1a)\phi(n)=a^p-a^{p-1}=a^p(1-\frac{1}{a})ϕ(n)=ap−ap−1=ap(1−a1)
- 令n=a1p1a2p2...akpkn=a_1^{p_1}a_2^{p_2}...a_k^{p_k}n=a1p1a2p2...akpk,根据积性函数性质
ϕ(n)=ϕ(a1p1)ϕ(a2p2)...ϕ(akpk)=a1p1(1−1a1)∗a2p2(1−1a2)...akpk(1−1ak)\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(1−a11)∗a2p2(1−a21)...akpk(1−ak1)
=n∗(1−1a1)∗(1−1a2)∗...∗(1−1ak)=n*(1-\frac{1}{a_1})*(1-\frac{1}{a_2})*...*(1-\frac{1}{a_k})=n∗(1−a11)∗(1−a21)∗...∗(1−ak1)
∑d∣nϕ(d)=n\sum_{d\big|n}\phi(d)=nd∣∣n∑ϕ(d)=n
考虑用分数形式证明
nnn个真分数:1n,2n,...,n−1n,nn\frac{1}{n},\frac{2}{n},...,\frac{n-1}{n},\frac{n}{n}n1,n2,...,nn−1,nn
然后进行分数化简,按分母不同分类
分母一定是nnn的因数,且分母分子互质,并且真分数形式的分子小于分母
那么该类分数个数就是分母的ϕ\phiϕ,得证
小于nnn且与nnn互质的所有正整数之和为nϕ(n)2\frac{n\phi(n)}{2}2nϕ(n)
证明:
设s={a1,a2,...,ak}s=\{a_1,a_2,...,a_k\}s={a1,a2,...,ak}是在模nnn意义下的缩系,根据缩系定义,个数就是ϕ(n)\phi(n)ϕ(n)
则t={n−a1,n−a2,...,n−ak}t=\{n-a_1,n-a_2,...,n-a_k\}t={n−a1,n−a2,...,n−ak}也是模nnn意义下的缩系(详见辗转相除法的辗转相减)
两个集合相加,证毕
//求单个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(modp)a^{\phi(p)}\equiv1(mod\ p)aϕ(p)≡1(mod p)
证明:
设ppp的简化剩余系为{p1,p2,p3,...,pk}\{p_1,p_2,p_3,...,p_k\}{p1,p2,p3,...,pk}
∵(a,p)=1∵(a,p)=1∵(a,p)=1
∴{a∗p1,a∗p2,...,a∗pk}∴\{a*p_1,a*p_2,...,a*p_k\}∴{a∗p1,a∗p2,...,a∗pk}也构成了ppp的简化剩余系
(证明可参考裴蜀定理中的推论反证法)
∴(a∗p1)∗(a∗p2)∗...∗(a∗pk)≡p1∗p2∗...∗pk(modp)∴(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(modp)∴a^{\phi(p)}\equiv 1(mod\ p)∴aϕ(p)≡1(mod p)
扩展欧拉定理
若a,ma,ma,m为正整数,当r>ϕ(m)r>\phi(m)r>ϕ(m)时,有ar≡ar%ϕ(m)+ϕ(m)a^r\equiv a^{r\%\phi(m)+\phi(m)}ar≡ar%ϕ(m)+ϕ(m)
证明:
分类讨论
-
.如果(a,m)=1(a,m)=1(a,m)=1,则显然成立
因为由欧拉定理得aϕ(m)≡1(modm)a^{\phi(m)}\equiv1\pmod maϕ(m)≡1(modm)
-
若(a,m)>1(a,m)>1(a,m)>1
引理一:
如果满足
{x≡y(modm)x≡y(modn)\begin{cases}x\equiv y\ (mod\ m)\\x\equiv y\ (mod\ n)\end{cases}{x≡y (mod m)x≡y (mod n)
则有
x≡y(modlcm(n,m))x\equiv y\ (mod\ \ lcm(n,m))x≡y (mod lcm(n,m))
证明:
显然(x−y)(x-y)(x−y)既是mmm的倍数,又是nnn的倍数,则其必然为lcm(n,m)lcm(n,m)lcm(n,m)的倍数
引理二:
如果ppp为质数,ϕ(pq)≥q\phi(p^q)\ge qϕ(pq)≥q
证明:
给两种证明方法
法一:
以每ppp个为一个周期划分
显然(p,p−1)=1,(p2,p2−1)=1,...,(pq,pq−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
此时光考虑一部分就已经满足ϕ(pq)=q\phi(p^q)=qϕ(pq)=q,故引理显然成立
法二:
ϕ(pq)=pq−1∗(p−1)\phi(p^q)=p^{q-1}*(p-1)ϕ(pq)=pq−1∗(p−1)
根据数学归纳法
考虑q=1,ϕ(p)>=1q=1,\phi(p)>=1q=1,ϕ(p)>=1显然成立
设q=kq=kq=k时成立,即pk−1∗(p−1)>=kp^{k-1}*(p-1)>=kpk−1∗(p−1)>=k
∵k>1∵k>1∵k>1
∴∴∴显然pk∗(p−1)>=k+1p^k*(p-1)>=k+1pk∗(p−1)>=k+1
即当q=k+1q=k+1q=k+1时,也成立
接下来继续证明扩展欧拉定理
-
若m=pkm=p^km=pk,即mmm为质数的幂时
∵(a,m)>1∵(a,m)>1∵(a,m)>1
∴p∣a∴p\bigg|a∴p∣∣∣∣a
由引理二可得ϕ(pk)≥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
∴ar=x∗pr=y∗pϕ(m)=z∗pk∴a^r=x*p^r=y*p^{\phi(m)}=z*p^k∴ar=x∗pr=y∗pϕ(m)=z∗pk(从ppp的指数上抽一些下来使x→y→zx\rightarrow y\rightarrow zx→y→z)
即m∣ar,m∣pϕ(m)m\bigg|a^r,m\bigg|p^{\phi(m)}m∣∣∣∣ar,m∣∣∣∣pϕ(m)
∴ar≡ar%ϕ(m)+ϕ(m)≡0(modm)∴a^r\equiv a^{r\%\phi(m)+\phi(m)}\equiv 0(mod\ \ m)∴ar≡ar%ϕ(m)+ϕ(m)≡0(mod m)
-
若m=p1k1p2k2...pnknm=p_1^{k_1}p_2^{k_2}...p_{n}^{k_n}m=p1k1p2k2...pnkn
设m1=p1k1m_1=p_1^{k_1}m1=p1k1,则ar≡ar%ϕ(m1)+ϕ(m1)(modm1)a^r\equiv a^{r\%\phi(m_1)+\phi(m_1)}\ \ (mod\ \ m_1)ar≡ar%ϕ(m1)+ϕ(m1) (mod m1)
设m2=p2k2m_2=p_2^{k_2}m2=p2k2,则ar≡ar%ϕ(m2)+ϕ(m2)(modm2)a^r\equiv a^{r\%\phi(m_2)+\phi(m_2)}\ \ (mod\ \ m_2)ar≡ar%ϕ(m2)+ϕ(m2) (mod m2)
..................
设mn=pnknm_n=p_n^{k_n}mn=pnkn,则ar≡ar%ϕ(mn)+ϕ(mn)(modmn)a^r\equiv a^{r\%\phi(m_n)+\phi(m_n)}\ \ (mod\ \ m_n)ar≡ar%ϕ(mn)+ϕ(mn) (mod mn)
m1,m2,...,mnm_1,m_2,...,m_nm1,m2,...,mn 不同的质数的幂,两两互质
ϕ(m)=ϕ(m1)∗ϕ(m2)∗...∗ϕ(mn)\phi(m)=\phi(m_1)*\phi(m_2)*...*\phi(m_n)ϕ(m)=ϕ(m1)∗ϕ(m2)∗...∗ϕ(mn)
又根据引理一,则得到:
ar≡ar%ϕ(m)+ϕ(m)(modm)a^r\equiv a^{r\%\phi(m)+\phi(m)}\pmod mar≡ar%ϕ(m)+ϕ(m)(modm)
区间逆元
如果整数a,ba,ba,b满足a∗b%p=1a*b\%p=1a∗b%p=1,则称a,ba,ba,b在模ppp的意义下互为逆元
只有(a,p)=1(a,p)=1(a,p)=1,在模ppp的意义下aaa才有逆元,aaa的逆元记作a−1a^{-1}a−1
证明:
若(a,p)>1(a,p)>1(a,p)>1,则令d=gcd(a,p),d∣a,d∣pd=gcd(a,p),d|a,d|pd=gcd(a,p),d∣a,d∣p
∴d∣a%p∴d|a\%p∴d∣a%p(感性理解为:x倍ddd减去y倍ppp直到x<yx<yx<y,其差一定也为ddd的倍数)
∴a≡(x%y)d(modp)∴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%pa/b\%p=a*b^{-1}\%pa/b%p=a∗b−1%p
有一种求区间逆元的方式,时间复杂度为O(n)O(n)O(n)
设模数为m,f[n]m,f[n]m,f[n]表示nnn的逆元,其中[1,n)[1,n)[1,n)的逆元已经求出,则
f[n]=(−f[m%n]∗(m/n)%m+m)%mf[n]=(-f[m\%n]*(m/n)\%m+m)\%mf[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(modm)f[i]*i\equiv1\ \ \ (mod\ m)f[i]∗i≡1 (mod m)
f[i]∗(m−i)≡−1(modm)f[i]*(m-i)\equiv-1\ \ \ (mod\ m)f[i]∗(m−i)≡−1 (mod m)
f[m−i]∗(m−i)≡1(modm)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(modm)f[i*k]*(i*k)\equiv 1\ \ \ (mod\ m)f[i∗k]∗(i∗k)≡1 (mod m)
(f[i∗k]∗k)∗i≡1(modm)(f[i*k]*k)*i\equiv 1\ \ \ (mod\ m)(f[i∗k]∗k)∗i≡1 (mod m)
f[i]∗i≡1(modm)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])
inv[1] = 1;
for( int i = 2;i <= n;i ++ )inv[i] = ( mod - mod / i ) * inv[mod % i] % mod;
扩展欧几里得
扩展欧几里得是用来求不定方程:ax+by=cax+by=cax+by=c,且已知整数a,b,ca,b,ca,b,c
要求gcd(a,b)∣cgcd(a,b)|cgcd(a,b)∣c,才能保证有解
算法思想:递归求解
先求方程ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b),求出该方程的解,乘上系数c/gcd(a,b)c/gcd(a,b)c/gcd(a,b)即为原方程的解
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'ax+by=gcd(a,b)=gcd(b,a%b)=bx′+(a%b)y′=bx′+(a−a/b∗b)y′
将a,ba,ba,b看做变量,移项合并同类项
ax+by=bx′+(a−a/b∗b)y′ax+by=bx'+(a-a/b*b)y'ax+by=bx′+(a−a/b∗b)y′
ax+by−bx′−ay′+a/b∗by′=0ax+by-bx'-ay'+a/b*by'=0ax+by−bx′−ay′+a/b∗by′=0
xa−y′a+yb−x′b+a/b∗y′b=0xa-y'a+yb-x'b+a/b*y'b=0xa−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,yx,yx,y
而求x′,y′x',y'x′,y′可以继续递归下去
gcd(a,b)gcd(a,b)gcd(a,b)中的参数bbb最终会变为000,此时gcd(a,0)=agcd(a,0)=agcd(a,0)=a
于是有ax+by=gcd(a,0)=aax+by=gcd(a,0)=aax+by=gcd(a,0)=a,可以求出x=1,y=0x=1,y=0x=1,y=0
这是最底层的x,yx,yx,y,然后一层层返回,就可以求出最原始的x,yx,yx,y了
注意,exgcdexgcdexgcd求出来的x,yx,yx,y满足的方程组是ax+bx=gcd(a,b)ax+bx=gcd(a,b)ax+bx=gcd(a,b)
将这一对x,yx,yx,y乘上cgcd(a,b)\frac{c}{gcd(a,b)}gcd(a,b)c,才是原方程的一组解
而且,这一组解只是一组特解,并不一定是最小的,可以通过通解公式去找到最小解xxx
ax+by=cax+by=cax+by=c
a(x−k)+b(y+akb)=ca(x-k)+b(y+\frac{ak}{b})=ca(x−k)+b(y+bak)=c
因为aaa缩小若干倍,为了保证方程的正确性,bbb就应该放大若干倍,所以需满足b∣akb\bigg|akb∣∣∣∣ak
∴bgcd(a,b)∣agcd(a,b)k∴\frac{b}{gcd(a,b)}\bigg|\frac{a}{gcd(a,b)}k∴gcd(a,b)b∣∣∣∣gcd(a,b)ak
∵(bgcd(a,b),agcd(a,b))=1∵(\frac{b}{gcd(a,b)},\frac{a}{gcd(a,b)})=1∵(gcd(a,b)b,gcd(a,b)a)=1
∴bgcd(a,b)∣k∴\frac{b}{gcd(a,b)}|k∴gcd(a,b)b∣k
所以原方程的aaa可以无限缩小bgcd(a,b)\frac{b}{gcd(a,b)}gcd(a,b)b倍,直到a<bgcd(a,b)a<\frac{b}{gcd(a,b)}a<gcd(a,b)b
同理,通解也可以被表示出来X=x+t×bgcd(a,b),Y=y−t×agcd(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=y−t×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 )
中国剩余定理
求一个模线性方程组xxx
{x≡a1(modr1)x≡a2(modr2)...x≡ak(modrk)\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)
其中r1,r2,...,rkr_1,r_2,...,r_kr1,r2,...,rk互质
对于rir_iri,设Ai=∏j≠irjA_i=\prod_{j≠i}r_jAi=∏j=irj
∵(r1,r2,...,rk)=1∵(r_1,r_2,...,r_k)=1∵(r1,r2,...,rk)=1
∴(Ai,ri)=1∴(A_i,r_i)=1∴(Ai,ri)=1
则一定存在一个整数cic_ici满足ci∗Ai%ri=1c_i*A_i\% r_i=1ci∗Ai%ri=1
设xi=ai∗ci∗Aix_i=a_i*c_i*A_ixi=ai∗ci∗Ai,则xi%ri=aix_i\%r_i=a_ixi%ri=ai
因为AiA_iAi是除了rir_iri以外的其他rrr值的最小公倍数
所以,xi%rj=0(j≠i)x_i\%r_j=0(j≠i)xi%rj=0(j=i),即xix_ixi模其他的rrr余数都为000,只有模rir_iri的时候,余数为aia_iai
换言之,把xix_ixi加到满足其他方程j(j≠i)j(j≠i)j(j=i)的解xjx_jxj上,(xi+xj)(x_i+x_j)(xi+xj)也一样满足方程jjj
同理,如果xjx_jxj也是这么求出来的,则(xi+xj)(x_i+x_j)(xi+xj)也满足方程iii
那么,我们对于每一个方程,都按照这个方法求出来该方程的解
把这些解累加起来,发现,这个和仍然满足每一个方程
即x=∑i=1kai∗ci∗Ai%rix=\sum_{i=1}^ka_i*c_i*A_i\%r_ix=∑i=1kai∗ci∗Ai%ri
对于xxx,加上所有的rrr值的最小公倍数,它仍然满足所有方程
所以,只要存在xxx,则意味着有无穷多组解
通解为:x=∑i=1k(ai∗ci∗Ai%ri)+p∗∏i=1kri,p∈Zx=\sum_{i=1}^k(a_i*c_i*A_i\%r_i)+p*\prod_{i=1}^kr_i,p∈Zx=i=1∑k(ai∗ci∗Ai%ri)+p∗i=1∏kri,p∈Z
扩展中国剩余定理
求一个模线性方程组xxx
{x≡a1(modr1)x≡a2(modr2)...x≡ak(modrk)\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)
其中r1,r2,...,rkr_1,r_2,...,r_kr1,r2,...,rk不一定互质
首先,取前两个方程x=k∗r1+a1=p∗r2+a2x=k*r_1+a_1=p*r_2+a_2x=k∗r1+a1=p∗r2+a2k∗r1−p∗r2=a2−a1k*r_1-p*r_2=a_2-a_1k∗r1−p∗r2=a2−a1
这种形如ax+by=cax+by=cax+by=c的不定方程,可以用扩展欧几里得计算
当gcd(r1,r2)gcd(r_1,r_2)gcd(r1,r2)不能整除a2−a1a_2-a_1a2−a1时,方程组无解
否则,根据exgcdexgcdexgcd,求出k0k_0k0,满足k0∗r1−p∗r2=a2−a1k_0*r_1-p*r_2=a_2-a_1k0∗r1−p∗r2=a2−a1
kkk的通解为:
k=k0+b∗(r2/gcd(r1,r2))k=k_0+b*(r_2/gcd(r_1,r_2))k=k0+b∗(r2/gcd(r1,r2))
带入到方程组x=k∗r1+a1x=k*r_1+a_1x=k∗r1+a1中,则有x=(k0+b∗(r2/gcd(r1,r2)))∗r1+a1=k0∗r1+b∗lcm(r1,r2)+a1,b∈Zx=(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∈Zx=(k0+b∗(r2/gcd(r1,r2)))∗r1+a1=k0∗r1+b∗lcm(r1,r2)+a1,b∈Z
即x≡a1(modlcm(r1,r2))x\equiv a_1\ \ (mod\ \ lcm(r_1,r_2))x≡a1 (mod lcm(r1,r2))
这个方程相当于合并了原来的两个方程,而形式上又和原来的方程一致
继续采用这个方法,不断地合并方程组中的两个方程
直到最后合并为一个方程,则可以得到xxx的通解
注意在这个过程中,要注意求出的k0k_0k0是k∗r1−p∗r2=(a2−a1)k*r_1-p*r_2=(a_2-a_1)k∗r1−p∗r2=(a2−a1)的解
而不是k∗r1−p∗r2=gcd(r1,r2)k*r_1-p*r_2=gcd(r_1,r_2)k∗r1−p∗r2=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;
}
终于写完了!!!!!!!!!!!!!!!!!!!!!
利用以上所有知识进行证明
若ppp是质数(p>3p>3p>3),则2p+12p+12p+1和4p+24p+24p+2至多有一个数是质数
抛开333的倍数(肯定是合数),任何整数都可以被改写成3k±13k±13k±1的形式
- p=3k+1p=3k+1p=3k+1
2p+1=6k+3=3(k+1)2p+1=6k+3=3(k+1)2p+1=6k+3=3(k+1),合数
4p+2=12k+6=6(2k+1)4p+2=12k+6=6(2k+1)4p+2=12k+6=6(2k+1),合数 - p=3k−1p=3k-1p=3k−1
2p+1=6k−12p+1=6k-12p+1=6k−1,未知
4p+2=12k−2=2(6k−1)4p+2=12k-2=2(6k-1)4p+2=12k−2=2(6k−1),合数
最多就是那个未知情况为质数,得证
gcd(f(n),f(m))=f(gcd(n,m))gcd(f(n),f(m))=f(gcd(n,m))gcd(f(n),f(m))=f(gcd(n,m))
f:f:f: 斐波拉契数列
gcd(an−1,am−1)=agcd(n,m)−1\gcd(a^n-1,a^m-1)=a^{gcd(n,m)}-1gcd(an−1,am−1)=agcd(n,m)−1