数论知识点总结(待更新)

本文深入解析数论中的关键算法,包括最大公约数、扩展欧几里得算法、逆元求解、埃拉托斯特尼筛法、费马小定理、线性同余方程求解及欧拉函数。通过实例和代码展示算法原理及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数论知识点总结

1.gcd1.gcd1.gcd(最大公约数)

对于给出的两个数a,ba,ba,b,我们可以用欧几里得算法来计算最大公约数。欧几里得算法的精髓就在于下面这个公式:
gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)b)b)
证明:
已知:gcd(a,b)∣agcd(a,b)|agcd(a,b)a并且gcd(a,b)∣bgcd(a,b)|bgcd(a,b)b,设aaa%b=rb=rb=r,则a=r+kba=r+kba=r+kb,故r=a−kbr=a-kbr=akb,根据同余关系可得:rrr%gcd(a,b)=0gcd(a,b)=0gcd(a,b)=0,因此gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)b)b)
code:

int gcd(int a,int b){
    return b?gcd(b,a%b):a
}

2.exgcd2.exgcd2.exgcd(扩展欧几里得算法)

扩展欧几里得算法是用于求解ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)的一组解的算法。
根据欧几里得算法我们可知:gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)b)b)
我们假设x1,y1x1,y1x1,y1是满足条件的一组解
那么ax1+by1=gcd(a,b)ax1+by1=gcd(a,b)ax1+by1=gcd(a,b)
gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)b)b)
ax1+by1=bx2+aax1+by1=bx2+aax1+by1=bx2+a%by2by2by2
aaa%b=a−a/b∗bb=a-a/b\ast bb=aa/bb
因而ax1+by1=bx2+ay2−a/b∗by2=ay2+b∗(x2−a/b∗y2)ax1+by1=bx2+ay2-a/b\ast by2=ay2+b*(x2-a/b\ast y2)ax1+by1=bx2+ay2a/bby2=ay2+b(x2a/by2)
那么我们就得到了一组合法的x1,y1x1,y1x1,y1的解:x1=y2,y1=x2−a/b∗y2x1=y2,y1=x2-a/b\ast y2x1=y2,y1=x2a/by2
也就是我们递归下去即可。当b=0b=0b=0的时候我们就可以发现x=1,y=0x=1,y=0x=1,y=0是合法的
这是我们再返回x=1,y=0x=1,y=0x=1,y=0。最后就一直会回溯下去,得到我们的x1,y1x1,y1x1,y1

void exgcd(int a,int b){
    if(!b){
        x=1,y=0;
        return ;
    }
    exgcd(b,a%b)
    int temp=x;
    x=y;y=temp-a/b*x;
}

但是如果要求ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)的最小整数解的时候,我们就要对xxx批量的加上bbb的倍数,但是这不会影响最终的结果。
因为ax+by+kab−kab=a(x+kb)+b∗(y−ka)ax+by+kab-kab=a(x+kb)+b*(y-ka)ax+by+kabkab=a(x+kb)+b(yka),这样依旧是合法的。
因此我们直接让x=(xx=(xx=(x%b+b)b+b)b+b)%bbb即为最终的答案。

3.3.3.逆元

对于aaammm,如果ax≡1(modm)ax\equiv1(modm)ax1(modm),那么称xxxaaammm下的逆元。
那么我们该怎么求解逆元呢?我们将逆元的等式转化一下:
ax+my=1ax+my=1ax+my=1
由于ax+my=kax+my=kax+my=k有解当且仅当kkk%gcd(a,m)=0gcd(a,m)=0gcd(a,m)=0的时候有解,说明gcd(a,m)=1gcd(a,m)=1gcd(a,m)=1
那么我们直接用扩展欧几里得求解即可。

int x,y;
void exgcd(int a,int b){
    if(!b){
        x=1,y=0;
        return ;
    }
    exgcd(b,a%b)
    int temp=x;
    x=y;y=temp-a/b*x;
}
int inv(int a,int m){//a在m下的逆元
    exgcd(a,m);
    return (x%m+m)%m;
}

逆元一般是用在除法取模上面,如(a/b)(a/b)(a/b)%mmm即为aaa%m∗inv(b,m)m\ast inv(b,m)minv(b,m)

4.4.4.埃拉托斯特尼筛法

埃拉托斯特尼筛法是一个复杂度为nlnnlnnnlnnlnnnlnnlnn的筛法。
当选中一个数为素数的时候,就把以这个数为因子的数全部筛掉即可。

const int N=1e6+100;
vector<int> pr;
bool vis[N];
void seive(){
	vis[0]=vis[1]=1;
	for(int i=2;i<=N-10;i++){
		if(!vis[i]){
			pr.push_back(i);
			for(int j=2*i;j<=N-10;j+=i) vis[j]=1;
		}
	}
} 

5.5.5.费马小定理

假设aaa是一个整数,ppp是一个质数,那么ap−aa^p-aapappp的倍数
ap≡a(modp)a^p\equiv a(modp)apa(modp),如果aaa不是ppp的倍数,这个定理也可以写成:
ap−1≡1(modp)a^{p-1}\equiv1(modp)ap11(modp)

6.6.6.线性同余方程求解

形如ax≡b(modm)ax\equiv b(modm)axb(modm)即为线性同余方程。
将线性同余方程变形后即可得到:
ax+my=bax+my=bax+my=b
只有当bbb%gcd(a,m)=0gcd(a,m)=0gcd(a,m)=0时该方程才有解。
我们先利用扩展欧几里得算法求出
ax+my=gcd(a,m)ax+my=gcd(a,m)ax+my=gcd(a,m)的一组解(x0,y0)(x0,y0)(x0,y0),那么x=x0∗(b/gcd(a,m))x=x0*(b/gcd(a,m))x=x0(b/gcd(a,m))%mmm
即为原方程的一组解。

7.7.7.欧拉函数

欧拉函数即为小于nnn的数中与nnn互质的数的个数
比如φ(8)=4\varphi(8)=4φ(8)=4
欧拉函数的通式为:
φ(x)=x(1−1p1)(1−1p2)...(1−1pn)\varphi(x)=x(1-\frac{1}{p1})(1-\frac{1}{p2})...(1-\frac{1}{pn})φ(x)=x(1p11)(1p21)...(1pn1)
其中p1,p2,...pnp1,p2,...pnp1,p2,...pnxxx的质因数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值