基础数论算法
首先,它们这些算法十分基础,基础到并不包含莫比乌斯反演什么的,所以仅仅当做娱乐性质的文章
内容一览
由于数论中的算法较多,下面先进行一个小汇总
当然啦,都是一些比较基础的东西,意思是需要数学基础的东西
下面将进行逐个讲解
详解
素数的筛法
原理
我们很多时候用的是朴素的质数筛法,即我们按照2到 n 进行筛去,记录一个
代码
但是还有一种 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(