简单数论选讲
声明:此课件中用这个格式的证明不必详细了解,只是为了让你更信服
一、逆元
因为逆元不归我讲,但是又很重要,所以在这里一笔带过
一整数aaa对同余ppp之模逆元是指满足以下公式的整数bbb
a−1≡b(mod p)a^{-1}\equiv b(mod\ p)a−1≡b(mod p)
也可以写成以下的式子
ab≡1(mod p)ab\equiv 1(mod\ p)ab≡1(mod p)
整数aaa对模数ppp之模逆元存在的充分必要条件是aaa和ppp互素,若此模逆元存在,在模数ppp下的除法可以用和对应模逆元的乘法来达成,此概念和实数除法的概念相同。
模意义下的逆元就好比实数运算中的倒数,模意义下除以一个数就相当于乘上这个数的逆元,就可以实现模意义下的除法啦!
二、费马小定理
费马小定理在OI中最(wei)大(yi)的用途就是求乘法逆元
内容:当ppp为质数时有ap−1≡1(mod p)a^{p-1}\equiv 1(mod\ p)ap−1≡1(mod p)
所以ap−2∗a≡1(mod p)a^{p-2}*a\equiv 1(mod\ p)ap−2∗a≡1(mod p),即ap−2a^{p-2}ap−2为aaa在模ppp意义下的逆元
可以直接用快速幂求出
费马小定理的证明(其实并没有多大用):
引理一:如果p,cp,cp,c互质a∗c≡b∗c(mod p)a*c\equiv b*c(mod\ p)a∗c≡b∗c(mod p),则有a≡b(mod p)a \equiv b(mod\ p)a≡b(mod p)
证明:
∵a∗c≡b∗c(mod p)\because a*c\equiv b*c(mod\ p)∵a∗c≡b∗c(mod p)
∴(a−b)∗c≡0(mod p)\therefore (a-b)*c\equiv 0(mod\ p)∴(a−b)∗c≡0(mod p)
∵c\because c∵c与ppp互质
∴a−b≡0(mod p)\therefore a-b\equiv 0(mod\ p)∴a−b≡0(mod p)引理二:若有ppp的完全剩余系a1,a2,...,ap{a_1,a_2,...,a_p}a1,a2,...,ap,且p,cp,cp,c互质,则a1∗c,a2∗c,...,ap∗c{a_1*c,a_2*c,...,a_p*c}a1∗c,a2∗c,...,ap∗c也是ppp的完全剩余系
完全剩余系,即是通过对一系列正整数mod mmod\ mmod m后产生的从000至m−1m-1m−1的完全数系
证明:反证法,假设存在ai∗c≡aj∗c(mod p)a_i*c\equiv a_j*c(mod\ p)ai∗c≡aj∗c(mod p),由引理一得,ai≡aj(mod p)a_i\equiv a_j(mod\ p)ai≡aj(mod p),假设不成立,引理二成立
费马小定理证明:
∵0,1,2,3,...,p−1\because 0,1,2,3,...,p-1∵0,1,2,3,...,p−1为ppp的一个完全剩余系
∴0,a,2∗a,3∗a,...,(p−1)∗a\therefore 0,a,2*a,3*a,...,(p-1)*a∴0,a,2∗a,3∗a,...,(p−1)∗a为ppp的一个完全剩余系,
且{a mod p,2∗a mod p,3∗a mod p,...,(p−1)∗a mod p}={1,2,3,...,p−1}\{a\ mod\ p,2*a\ mod\ p,3*a\ mod\ p,...,(p-1)*a\ mod\ p\}=\{1,2,3,...,p-1\}{a mod p,2∗a mod p,3∗a mod p,...,(p−1)∗a mod p}={1,2,3,...,p−1}
∴1∗2∗3∗...∗(p−1)≡a∗2∗a∗3∗a∗...∗(p−1)∗a(mod p)\therefore 1*2*3*...*(p-1)\equiv a*2*a*3*a*...*(p-1)*a(mod\ p)∴1∗2∗3∗...∗(p−1)≡a∗2∗a∗3∗a∗...∗(p−1)∗a(mod p)
∴(p−1)!≡ap−1∗(p−1)!(mod p)\therefore (p-1)!\equiv a^{p-1}*(p-1)!(mod\ p)∴(p−1)!≡ap−1∗(p−1)!(mod p)
∴ap−1≡1(mod p)\therefore a^{p-1}\equiv 1(mod\ p)∴ap−1≡1(mod p)
时间复杂度:O(log p)O(log\ p)O(log p) 使用条件:a,pa,pa,p互质且ppp为质数
三、欧拉函数
1.欧拉函数的定义
欧拉函数Φ(n)\Phi(n)Φ(n)代表小于nnn并且与nnn互质的数的个数,特别的,Φ(1)=1\Phi(1)=1Φ(1)=1。
2.欧拉函数的求法
Φ(x)=x∗∏i=1n(1−1pi)\Phi(x)=x*\prod_{i=1}^{n}(1-\frac{1}{p_i})Φ(x)=x∗∏i=1n(1−pi1),其中p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pn为xxx所有的质因子;特别的,Φ(1)=1\Phi(1)=1Φ(1)=1
如何理解这个式子呢?因为对于某一个质因数pip_ipi,在111到xxx中有xpi\frac{x}{p_i}pix个数是pip_ipi的倍数,那么就有x∗(1−1pi)x*(1-\frac{1}{p_i})x∗(1−pi1)个数不是pip_ipi的倍数,对于所有xxx的质因数pi,p2,...,pnp_i,p_2,...,p_npi,p2,...,pn考虑的话,就有x∗∏i=1n(1−1pi)x*\prod_{i=1}^{n}(1-\frac{1}{p_i})x∗∏i=1n(1−pi1)个数不是其中任何一个质因数的倍数,也就是与xxx互质的数的数目,即Φ(x)\Phi(x)Φ(x)
3.欧拉函数的性质
1)欧拉函数是积性函数,即满足:若a,ba,ba,b互质,则Φ(a∗b)=Φ(a)∗Φ(b)\Phi(a*b)=\Phi(a)*\Phi(b)Φ(a∗b)=Φ(a)∗Φ(b)(所以可以线性筛)
2)若ppp为质数,则Φ(p)=p−1\Phi(p)=p-1Φ(p)=p−1
3)小于nnn与nnn互质的数的和为Φ(n)∗n2\Phi(n)*\frac{n}{2}Φ(n)∗2n(n=1的时候不满足此性质)
4)若ppp为质数,且n=pkn=p^kn=pk,则Φ(n)=pk−pk−1\Phi(n)=p^k-p^{k-1}Φ(n)=pk−pk−1
5)n=∑d∣nΦ(d)n=\sum_{d|n}\Phi(d)n=∑d∣nΦ(d),此公式在杜教筛中有很大用
上列性质的证明:
1)若a,ba,ba,b互质,设a,ba,ba,b所有质因数分别为{a1,a2,...,an}\{a_1,a_2,...,a_n\}{a1,a2,...,an},{b1,b2,...,bm}\{b_1,b_2,...,b_m\}{b1,b2,...,bm},且∀i,j ai≠bj\forall i,j\ a_i\neq b_j∀i,j ai=bj(因为$a,b $互质)
Φ(a)∗Φ(b)=a∗b∗∏i=1n(1−1ai)∗∏i=1m(1−1bi)=Φ(a∗b)\Phi(a)*\Phi(b)=a*b*\prod_{i=1}^{n}(1-\frac{1}{a_i})*\prod_{i=1}^{m}(1-\frac{1}{b_i})=\Phi(a*b)Φ(a)∗Φ(b)=a∗b∗∏i=1n(1−ai1)∗∏i=1m(1−bi1)=Φ(a∗b)
2)1,2,...,p−11,2,...,p-11,2,...,p−1都与ppp互质,所以Φ(p)=p−1\Phi(p)=p-1Φ(p)=p−1
3)若(a,n)=1(a,n)=1(a,n)=1,则有(n−a,n)=1(n-a,n)=1(n−a,n)=1(想一想,为什么?),所以与nnn互质的数的平均数是n/2n/2n/2,而个数又是Φ(n)\Phi(n)Φ(n),可以得到这些数的和就是Φ(n)∗n/2\Phi(n)*n/2Φ(n)∗n/2。
4)代入公式显然。
5)引理一:令F(x)=∑d∣xΦ(d)F(x)=\sum_{d|x}\Phi(d)F(x)=∑d∣xΦ(d),则F(x)F(x)F(x)为积性函数
证明:设(a,b)=1(a,b)=1(a,b)=1,则
F(a)∗F(b)=∑i∣aΦ(i)∗∑j∣bΦ(j)=Φ(i1)∗Φ(j1)+Φ(i1)∗Φ(j2)+...Φ(i2)∗Φ(j1)+Φ(i2)∗Φ(j2)+...+Φ(ip)∗Φ(jq)=Φ(i1∗j1)+Φ(i1∗j2)+...+Φ(i2∗j1)+Φ(i2∗j2)+...+Φ(ip∗jq) F(a)*F(b)=\sum_{i|a}\Phi(i)*\sum_{j|b}\Phi(j)\\ =\Phi(i_1)*\Phi(j_1)+\Phi(i_1)*\Phi(j_2)+...\Phi(i_2)*\Phi(j_1)+\Phi(i_2)*\Phi(j_2)+...+\Phi(i_p)*\Phi(j_q)\\ =\Phi(i_1*j_1)+\Phi(i_1*j_2)+...+\Phi(i_2*j_1)+\Phi(i_2*j_2)+...+\Phi(i_p*j_q) F(a)∗F(b)=i∣a∑Φ(i)∗j∣b∑Φ(j)=Φ(i1)∗Φ(j1)+Φ(i1)∗Φ(j2)+...Φ(i2)∗Φ(j1)+Φ(i2)∗Φ(j2)+...+Φ(ip)∗Φ(jq)=Φ(i1∗j1)+Φ(i1∗j2)+...+Φ(i2∗j1)+Φ(i2∗j2)+...+Φ(ip∗jq)
(这里排版bug了,也懒得改了)
不难看出i1∗j1,i1∗j2...,ip∗jqi_1*j_1,i_1*j_2...,i_p*j_qi1∗j1,i1∗j2...,ip∗jq正好是a∗ba*ba∗b的所有因数,就相当于是把aaa的所有因数同时乘上j1,j2,...,jqj_1,j_2,...,j_qj1,j2,...,jq,所得到的所有数必然是a∗ba*ba∗b的所有因数,所以F(a)∗F(b)=F(a∗b)F(a)*F(b)=F(a*b)F(a)∗F(b)=F(a∗b)得证,F(x)F(x)F(x)是积性函数因为F(x)F(x)F(x)为积性函数,所以我们只需要观察x=pkx=p^kx=pk的时候是否满足即可
F(pk)=Φ(p0)+Φ(p1)+...+Φ(pk)F(p^k)=\Phi(p^0)+\Phi(p^1)+...+\Phi(p^k)F(pk)=Φ(p0)+Φ(p1)+...+Φ(pk)
由性质(4)得,F(pk)=1+p1−p0+p2−p1+...+pk−pk−1=pkF(p^k)=1+p^1-p^0+p^2-p^1+...+p^k-p^{k-1}=p^kF(pk)=1+p1−p0+p2−p1+...+pk−pk−1=pk
因为F(x)F(x)F(x)是积性函数,所以对于所有的正整数,都有n=∑d∣nΦ(d)n=\sum_{d|n}\Phi(d)n=∑d∣nΦ(d),性质(5)得证
4.欧拉定理
一般的欧拉定理叙述为:对于∀a,p\forall a,p∀a,p,若gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1,则∀n,an≡an mod Φ(p)(mod p)\forall n,a^n\equiv a^{n\ mod\ \Phi(p)}(mod\ p)∀n,an≡an mod Φ(p)(mod p)
当n=Φ(p)n=\Phi(p)n=Φ(p)时,$a^{\Phi§}≡1(mod\ p) $(这玩意甚至可以直接推出费马小定理…)
证明:
欧拉定理的证明其实和费马小定理十分相似…
引理一:同费马小定理的引理一,如果p,cp,cp,c互质a∗c≡b∗c(mod p)a*c\equiv b*c(mod\ p)a∗c≡b∗c(mod p),则有a≡b(mod p)a \equiv b(mod\ p)a≡b(mod p)
引理二:若a,ba,ba,b与ppp互质,则a∗ba*ba∗b也与ppp互质
证明:这条是显然(凑字数)的,因为a∗ba*ba∗b不会多出任何ppp的质因数,所以一定互质…
引理三:设小于ppp并且与ppp互质的数分别为x1,x2,...,xΦ(p)x_1,x_2,...,x_{\Phi(p)}x1,x2,...,xΦ(p),且p,cp,cp,c互质,则c∗x1,c∗x2,...,c∗xΦ(p)c*x_1,c*x_2,...,c*x_{\Phi(p)}c∗x1,c∗x2,...,c∗xΦ(p)和它在模ppp意义下等价
证明:由引理二,c∗x1,c∗x2,...,c∗xΦ(p)c*x_1,c*x_2,...,c*x_{\Phi(p)}c∗x1,c∗x2,...,c∗xΦ(p)一定都与ppp互质,如果∃i,j\exists i,j∃i,j使得c∗xi≡c∗xj(mod p)c*x_i\equiv c*x_j(mod\ p)c∗xi≡c∗xj(mod p),由引理一,xi≡xj(mod p)x_i\equiv x_j(mod\ p)xi≡xj(mod p),与假设矛盾,所以c∗x1,c∗x2,...,c∗xΦ(p)c*x_1,c*x_2,...,c*x_{\Phi(p)}c∗x1,c∗x2,...,c∗xΦ(p)是x1,x2,...,xΦ(p)x_1,x_2,...,x_{\Phi(p)}x1,x2,...,xΦ(p)的一组置换,在模ppp意义下是等价的
欧拉定理证明:
∵a,p\because a,p∵a,p互质
由引理三,有x1∗x2∗...∗xΦ(p)≡a∗x1∗a∗x2∗...∗a∗xΦ(p)(mod p)x_1*x_2*...*x_{\Phi(p)}\equiv a*x_1*a*x_2*...*a*x_{\Phi(p)}(mod\ p)x1∗x2∗...∗xΦ(p)≡a∗x1∗a∗x2∗...∗a∗xΦ(p)(mod p)
∴∏i=1Φ(p)xi≡aΦ(p)∗∏i=1Φ(p)xi(mod p)\therefore \prod_{i=1}^{\Phi(p)}x_i\equiv a^{\Phi(p)}*\prod_{i=1}^{\Phi(p)}x_i(mod\ p)∴∏i=1Φ(p)xi≡aΦ(p)∗∏i=1Φ(p)xi(mod p)
∴aΦ(p)≡1(mod p)\therefore a^{\Phi(p)}\equiv 1(mod\ p)∴aΦ(p)≡1(mod p)
由欧拉定理,我们可以找出另一种逆元的求法,aaa在模ppp意义下的逆元为aΦ(p)−1a^{\Phi(p)-1}aΦ(p)−1
这一求法相较费马小定理,少了对ppp是否为质数的限制,只需a,pa,pa,p互质即可,这一条也是aaa存在逆元的充要条件,所以用欧拉函数求逆元是最万能的方法(可惜没人用)
5.扩展欧拉定理
扩展欧拉定理的叙述为:对于∀a,p\forall a,p∀a,p若gcd(a,p)≠1gcd(a,p)\neq 1gcd(a,p)=1,则有
an≡an mod Φ(p)(mod p)a^n\equiv a^{n\ mod\ \Phi(p)}(mod\ p)an≡an mod Φ(p)(mod p),(n<Φ(p)n<\Phi(p)n<Φ(p))(屁话)
an≡an mod Φ(p)+Φ(p)(mod p)a^n\equiv a^{n\ mod\ \Phi(p)+\Phi(p)}(mod\ p)an≡an mod Φ(p)+Φ(p)(mod p),(otherwiseotherwiseotherwise)
证法太麻烦,noip也不带考的,大家略微了解一下就好了!(如果非要看证法可以看另一篇课件)
6.欧拉函数的线性筛法
首先根据积性函数的性质,如果i,ji,ji,j互质,则Φ(i∗j)=Φ(i)∗Φ(j)\Phi(i∗j)=\Phi(i)∗\Phi(j)Φ(i∗j)=Φ(i)∗Φ(j);
所以对于i mod primej≠0i\ mod\ prime_j\neq 0i mod primej=0的情况,Φ(i∗primej)\Phi(i*prime_j)Φ(i∗primej)直接等于Φ(i)∗Φ(primej)\Phi(i)*\Phi(prime_j)Φ(i)∗Φ(primej)即可。
对于i mod primej=0i\ mod\ prime_j=0i mod primej=0的情况,考虑求解Φ(n)\Phi(n)Φ(n)的公式,多乘一个primejprime_jprimej并不会多一个质因子,只有前面的nnn多乘了一个primejprime_jprimej,所以这种情况Φ(i∗primej)=Φ(i)∗primej\Phi(i*prime_j)=\Phi(i)*prime_jΦ(i∗primej)=Φ(i)∗primej
详细代码如下:
inline void prime_shaker(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!pd[i]) prime[++top]=i,phi[i]=i-1;
for(int j=1;j<=top && 1ll*prime[j]*i<=n;j++){
pd[i*prime[j]]=true;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}
没错我大括号不换行,你打我啊~
中国剩余定理(crt)
简单的中国剩余定理
设有模线性方程组(S):
(S):{x≡a1(mod m1)x≡a2(mod m2)...x≡an(mod mn)
(S) : \left \{
\begin{aligned}
x& \equiv a_1(mod\ m_1)\\
x& \equiv a_2(mod\ m_2)\\
&...\\
x& \equiv a_n(mod\ m_n)
\end{aligned}
\right.
(S):⎩⎨⎧xxx≡a1(mod m1)≡a2(mod m2)...≡an(mod mn)
且m1,m2,...,mnm_1,m_2,...,m_nm1,m2,...,mn两两互质,中国剩余定理就是一个通过构造方式求解一组xxx的算法
因为是构造,所以先直接告诉大家构造方式:
设M=∏i=1nmi,Mi=M/miM=\prod^{n}_{i=1} m_i,M_i=M/m_iM=∏i=1nmi,Mi=M/mi,Mi−1M^{−1}_iMi−1为MiM_iMi在mim_imi意义下的逆元,则通解x=∑i=1nai∗Mi∗Mi−1x=\sum ^{n}_{i=1}a_i∗M_i∗M^{−1}_ix=∑i=1nai∗Mi∗Mi−1
这个构造式应该怎么考虑呢?
通解xxx可以看作是一堆奇怪东西的和(∑j=1naj∗Mj∗Mj−1\sum_{j=1}^{n}a_j*M_j*M_j^{-1}∑j=1naj∗Mj∗Mj−1),我们考虑这个和xxx在第iii个方程组中是什么样的
对于i≠ji\neq ji=j的项,相当于是aj∗a_j*aj∗一个包含因数mim_imi的数∗*∗另一个奇怪的数,这一项包含因数mim_imi,所以在第iii个方程组的贡献是000
对于i=ji=ji=j的项,相当于是ai∗Mi∗Mi−1=aia_i*M_i*M_i^{-1}=a_iai∗Mi∗Mi−1=ai,贡献是aia_iai
所以x mod mi=0+0+...+0+ai=aix\ mod\ m_i=0+0+...+0+a_i=a_ix mod mi=0+0+...+0+ai=ai,该构造成立
这个构造方式只能适用于mim_imi两两互质的情况,且如果∏i=1nmi\prod_{i=1}^nm_i∏i=1nmi过大的话也不好计算,所以就有了扩展的中国剩余定理
扩展中国剩余定理(excrt)
前置技能:扩展欧几里得算法(exgcd)
扩展欧几里得算法不归我讲…所以我先只介绍下它的用处
扩展欧几里得算法可以快速求出ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)的一组解x,yx,yx,y,假设我们已经掌握了这个算法,那么我们来利用这个算法推一下中国剩余定理吧!
其实扩展crt特别简单…假设你搞出了前kkk组的一个最小正整数解xxx,想推出前k+1k+1k+1个方程的解
令M=∏i=1kmiM=\prod_{i=1}^k m_iM=∏i=1kmi,显然∀t,x+t∗M\forall t,x+t*M∀t,x+t∗M都是满足的
那么对于新的一组方程x≡ak+1(mod mk+1)x\equiv a_{k+1}(mod\ m_{k+1})x≡ak+1(mod mk+1)我们要找的是令x+t∗M≡ak+1(mod mk+1)x+t*M\equiv a_{k+1}(mod\ m_{k+1})x+t∗M≡ak+1(mod mk+1)最小的ttt,
即t∗M+mk+1∗p≡ak+1−xt*M+m_{k+1}*p\equiv a_{k+1}-xt∗M+mk+1∗p≡ak+1−x,可以轻松的利用exgcd求出最小解,若某时某刻exgcd无解,则原模线性方程组无解。
大致代码如下:
typedef long long LL;
LL calc(){
LL M=m[1],x=a[1];///第一组的解就是a[1],此时M之积为m[1]
for(int i=2;i<=n;i++){
LL g=gcd(M,m[i]),t=((a[i]%m[i]-x%m[i])%m[i]+m[i])%m[i];
if(t%g!=0) return -1;//判断exgcd是否有解
LL xx,y;
exgcd(M,m[i],xx,y);
xx=mul(xx,t/g,m[i]/g);//快速乘,防止爆long long
x=xx*M+x;
M=M*(m[i]/g);
x=(x%M+M)%M;
}
return x%M;
}
啊…数学真是太奇妙了!