基础数论算法详解

基础数论算法


首先,它们这些算法十分基础,基础到并不包含莫比乌斯反演什么的,所以仅仅当做娱乐性质的文章

内容一览

由于数论中的算法较多,下面先进行一个小汇总

当然啦,都是一些比较基础的东西,意思是需要数学基础的东西

下面将进行逐个讲解

详解

素数的筛法

原理

我们很多时候用的是朴素的质数筛法,即我们按照2到 n 进行筛去,记录一个 vis 数组表示当前数是否为质数即可

代码

但是还有一种 O(n) 的方法,即欧拉筛法,每次让每一个数只被它所含有的最小的质因子筛去,详情见代码

代码

void construct_prime_table(LL range){
    for(LL i=2;i<range;i++){
        if(!vis[i])pt[cnt++]=i;
        for(int j=0;j<cnt;j++){
            if(i*pt[j]>=range)break;
            vis[i*pt[j]]=1;
            if(i%pt[j]==0)break;
        }
    }
}

最大公约数(GCD)

原理

这个东西其实非常简单啦,我们可以使用辗转相除法或是更相减损法,但是下面只贴辗转相除法的代码,而更相减损法也有它的用武之地,那就是在求两个巨大的高精度数的时候,用于 Stein 算法,其他文章会予以介绍

下面贴代码

代码

LL gcd(LL x,LL y){
   if(y==0)return x;
   return gcd(y,x%y);
}

扩展GCD算法

原理

主要是来源于数论中的裴蜀定理,然后思路与原GCD十分相近,可以求出使得

ax+by=gcd(

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值