特别简单的noip-数论选讲

简单数论选讲

声明:此课件中用这个格式的证明不必详细了解,只是为了让你更信服

一、逆元

因为逆元不归我讲,但是又很重要,所以在这里一笔带过

一整数aaa对同余ppp之模逆元是指满足以下公式的整数bbb

a−1≡b(mod p)a^{-1}\equiv b(mod\ p)a1b(mod p)

也可以写成以下的式子

ab≡1(mod p)ab\equiv 1(mod\ p)ab1(mod p)

整数aaa对模数ppp之模逆元存在的充分必要条件是aaappp互素,若此模逆元存在,在模数ppp下的除法可以用和对应模逆元的乘法来达成,此概念和实数除法的概念相同。

模意义下的逆元就好比实数运算中的倒数,模意义下除以一个数就相当于乘上这个数的逆元,就可以实现模意义下的除法啦!

二、费马小定理

费马小定理在OI中最(wei)大(yi)的用途就是求乘法逆元

内容:当ppp为质数时有ap−1≡1(mod p)a^{p-1}\equiv 1(mod\ p)ap11(mod p)

所以ap−2∗a≡1(mod p)a^{p-2}*a\equiv 1(mod\ p)ap2a1(mod p),即ap−2a^{p-2}ap2aaa在模ppp意义下的逆元

可以直接用快速幂求出

费马小定理的证明(其实并没有多大用):

引理一:如果p,cp,cp,c互质a∗c≡b∗c(mod p)a*c\equiv b*c(mod\ p)acbc(mod p),则有a≡b(mod p)a \equiv b(mod\ p)ab(mod p)

证明:
∵a∗c≡b∗c(mod p)\because a*c\equiv b*c(mod\ p)acbc(mod p)
∴(a−b)∗c≡0(mod p)\therefore (a-b)*c\equiv 0(mod\ p)(ab)c0(mod p)
∵c\because ccppp互质
∴a−b≡0(mod p)\therefore a-b\equiv 0(mod\ p)ab0(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}a1c,a2c,...,apc也是ppp的完全剩余系

完全剩余系,即是通过对一系列正整数mod mmod\ mmod m后产生的从000m−1m-1m1的完全数系

证明:反证法,假设存在ai∗c≡aj∗c(mod p)a_i*c\equiv a_j*c(mod\ p)aicajc(mod p),由引理一得,ai≡aj(mod p)a_i\equiv a_j(mod\ p)aiaj(mod p),假设不成立,引理二成立

费马小定理证明:
∵0,1,2,3,...,p−1\because 0,1,2,3,...,p-10,1,2,3,...,p1ppp的一个完全剩余系
∴0,a,2∗a,3∗a,...,(p−1)∗a\therefore 0,a,2*a,3*a,...,(p-1)*a0,a,2a,3a,...,(p1)appp的一个完全剩余系,
{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,2a mod p,3a mod p,...,(p1)a mod p}={1,2,3,...,p1}
∴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)123...(p1)a2a3a...(p1)a(mod p)
∴(p−1)!≡ap−1∗(p−1)!(mod p)\therefore (p-1)!\equiv a^{p-1}*(p-1)!(mod\ p)(p1)!ap1(p1)!(mod p)
∴ap−1≡1(mod p)\therefore a^{p-1}\equiv 1(mod\ p)ap11(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)=xi=1n(1pi1),其中p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pnxxx所有的质因子;特别的,Φ(1)=1\Phi(1)=1Φ(1)=1

如何理解这个式子呢?因为对于某一个质因数pip_ipi,在111xxx中有xpi\frac{x}{p_i}pix个数是pip_ipi的倍数,那么就有x∗(1−1pi)x*(1-\frac{1}{p_i})x(1pi1)个数不是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})xi=1n(1pi1)个数不是其中任何一个质因数的倍数,也就是与xxx互质的数的数目,即Φ(x)\Phi(x)Φ(x)

3.欧拉函数的性质

1)欧拉函数是积性函数,即满足:若a,ba,ba,b互质,则Φ(a∗b)=Φ(a)∗Φ(b)\Phi(a*b)=\Phi(a)*\Phi(b)Φ(ab)=Φ(a)Φ(b)(所以可以线性筛)

2)若ppp为质数,则Φ(p)=p−1\Phi(p)=p-1Φ(p)=p1

3)小于nnnnnn互质的数的和为Φ(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)=pkpk1

5)n=∑d∣nΦ(d)n=\sum_{d|n}\Phi(d)n=dnΦ(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_ji,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)=abi=1n(1ai1)i=1m(1bi1)=Φ(ab)

2)1,2,...,p−11,2,...,p-11,2,...,p1都与ppp互质,所以Φ(p)=p−1\Phi(p)=p-1Φ(p)=p1

3)若(a,n)=1(a,n)=1(a,n)=1,则有(n−a,n)=1(n-a,n)=1(na,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)=dxΦ(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)=iaΦ(i)jbΦ(j)=Φ(i1)Φ(j1)+Φ(i1)Φ(j2)+...Φ(i2)Φ(j1)+Φ(i2)Φ(j2)+...+Φ(ip)Φ(jq)=Φ(i1j1)+Φ(i1j2)+...+Φ(i2j1)+Φ(i2j2)+...+Φ(ipjq)
(这里排版bug了,也懒得改了)
不难看出i1∗j1,i1∗j2...,ip∗jqi_1*j_1,i_1*j_2...,i_p*j_qi1j1,i1j2...,ipjq正好是a∗ba*bab的所有因数,就相当于是把aaa的所有因数同时乘上j1,j2,...,jqj_1,j_2,...,j_qj1,j2,...,jq,所得到的所有数必然是a∗ba*bab的所有因数,所以F(a)∗F(b)=F(a∗b)F(a)*F(b)=F(a*b)F(a)F(b)=F(ab)得证,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+p1p0+p2p1+...+pkpk1=pk

因为F(x)F(x)F(x)是积性函数,所以对于所有的正整数,都有n=∑d∣nΦ(d)n=\sum_{d|n}\Phi(d)n=dnΦ(d),性质(5)得证

4.欧拉定理

一般的欧拉定理叙述为:对于∀a,p\forall a,pa,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,anan 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)acbc(mod p),则有a≡b(mod p)a \equiv b(mod\ p)ab(mod p)

引理二:若a,ba,ba,bppp互质,则a∗ba*bab也与ppp互质

证明:这条是显然(凑字数)的,因为a∗ba*bab不会多出任何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)}cx1,cx2,...,cxΦ(p)和它在模ppp意义下等价

证明:由引理二,c∗x1,c∗x2,...,c∗xΦ(p)c*x_1,c*x_2,...,c*x_{\Phi(p)}cx1,cx2,...,cxΦ(p)一定都与ppp互质,如果∃i,j\exists i,ji,j使得c∗xi≡c∗xj(mod p)c*x_i\equiv c*x_j(mod\ p)cxicxj(mod p),由引理一,xi≡xj(mod p)x_i\equiv x_j(mod\ p)xixj(mod p),与假设矛盾,所以c∗x1,c∗x2,...,c∗xΦ(p)c*x_1,c*x_2,...,c*x_{\Phi(p)}cx1,cx2,...,cxΦ(p)x1,x2,...,xΦ(p)x_1,x_2,...,x_{\Phi(p)}x1,x2,...,xΦ(p)的一组置换,在模ppp意义下是等价的

欧拉定理证明:

∵a,p\because a,pa,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)x1x2...xΦ(p)ax1ax2...axΦ(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)xiaΦ(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,pa,pgcd(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)anan 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)anan mod Φ(p)+Φ(p)(mod p),(otherwiseotherwiseotherwise)

证法太麻烦,noip也不带考的,大家略微了解一下就好了!(如果非要看证法可以看另一篇课件)

6.欧拉函数的线性筛法

首先根据积性函数的性质,如果i,ji,ji,j互质,则Φ(i∗j)=Φ(i)∗Φ(j)\Phi(i∗j)=\Phi(i)∗\Phi(j)Φ(ij)=Φ(i)Φ(j)
所以对于i mod primej≠0i\ mod\ prime_j\neq 0i mod primej=0的情况,Φ(i∗primej)\Phi(i*prime_j)Φ(iprimej)直接等于Φ(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Φ(iprimej)=Φ(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):xxxa1(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/miMi−1M^{−1}_iMi1MiM_iMimim_imi意义下的逆元,则通解x=∑i=1nai∗Mi∗Mi−1x=\sum ^{n}_{i=1}a_i∗M_i∗M^{−1}_ix=i=1naiMiMi1

这个构造式应该怎么考虑呢?

通解xxx可以看作是一堆奇怪东西的和(∑j=1naj∗Mj∗Mj−1\sum_{j=1}^{n}a_j*M_j*M_j^{-1}j=1najMjMj1),我们考虑这个和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_iaiMiMi1=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_ii=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*Mt,x+tM都是满足的

那么对于新的一组方程x≡ak+1(mod mk+1)x\equiv a_{k+1}(mod\ m_{k+1})xak+1(mod mk+1)我们要找的是令x+t∗M≡ak+1(mod mk+1)x+t*M\equiv a_{k+1}(mod\ m_{k+1})x+tMak+1(mod mk+1)最小的ttt
t∗M+mk+1∗p≡ak+1−xt*M+m_{k+1}*p\equiv a_{k+1}-xtM+mk+1pak+1x,可以轻松的利用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;
}

啊…数学真是太奇妙了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值