欧拉

来源:互联网 发布:面试什么是java线程池 编辑:程序博客网 时间:2024/04/20 11:46

诸多东西就不证明了

欧拉函数:
设n为正整数,以 φ(n)表示不超过n且与n互质的正整数的个数,称为n的欧拉函数值。

以下代码就是求互质的个数:#include<cstdio>using namespace std;int ok(int n){    int ans=n;    for(int i=2;i*i<=n;i++)    {        if(n%i==0)        {            ans-=ans/i;            while(n%i==0) n/=i;        }    }    if(n>1) ans-=ans/n;    return ans;}int main(){    int n;    printf("%d\n",ok(n));} 

欧拉筛法:
求n以下的所有质数。
1.设pr[i]为i最小质因子,然后从2开始计算
2.如果pr[i]没有在前面得到,就说明i是质数,所以pr[i]=i,prime[++len] = i。

void find(int  n){        sp = 0;    //有多少个质数        for(int i = 2;i <= n;i++)       {               if(!pr[i])   //如果没有在前面得到,说明是质数              {                     prime[++sp] = i;  //质数数目+1,记录下这个数是质数                     pr[i] = i;                }              for(int j = 1;j <= sp && i * prime[j] <= n;j++)  //过一下之前筛到的质数             {                     pr[i*prime[j]] = prime[j];// i*prime[j]是个合数                     if(prime[j] >= pr[i]) break;  //pr[i]存的是i的最小质因数 如果轮到的质数大于这个数的最小质因数,则证明这个数已被筛到过,break             }        }}

最后,强调一下
·欧拉函数得到与N互质的数的个数;
·而欧拉线性筛则是N以下的的所有质数。

0 0
原创粉丝点击