Book--欧拉函数

度娘的解释: 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。(至于证明嘛,还没搞清楚,留给大牛们去研究叭~)

 版本1:度娘娘给的

#include <cstdio>
#include <cstdlib>
 
using namespace std;
#define N 10000000
 
int main(int argc, const char *argv[]){
    int *phi;
    char *prime;
    prime = (char*)malloc((N + 1) * sizeof(char));
    prime[0] = prime[1] = 0;
    for(int i = 2; i <= N; i++)
        prime[i] = 1;
    for(int i = 2; i * i <= N; i++)
        if(prime[i])
            for(int j = i * i; j <= N; j += i)//首先建立筛法素数表
                prime[j] = 0;
    //这段求出了N内的所有素数
    phi = (int*)malloc((N + 1) * sizeof(int));
    for(int i = 1; i <= N; i++)
        phi[i] = i;
    for(int i = 2; i <= N; i++)
        if(prime[i])
            for(int j = i; j <= N; j += i)
                phi[j] = phi[j] / i * (i - 1); //此处注意先/i再*(i-1),否则范围较大时会溢出
    return 0;
}
版本2:快速版eula函数算法!简直精巧

void eula(){
    for(int i=1;i<=N;i++)
        phi[i] = i;
    for(int i=2;i<=N;i++)
        if(phi[i]==i)     //如果phi[i]==i的话说明还没有进行过计算,为素数
                          //没有进行过计算,说明在当前i值之前(即比i小的数中)没有i的因数,所以i为素数 
            for(int j=i;j<=N;j+=i)
                phi[j]=phi[j]/i*(i-1);//将非素数进行计算
    return;
}

 

posted @ 2014-05-27 21:06  Naturain  阅读(142)  评论(0编辑  收藏  举报