欧拉函数的证明与实现

欧拉函数的证明 

求单个数的欧拉函数 

int euler(int n){
	int ans = n;
	for(int i=2;i*i<=n;i++){
		if(n % i == 0){
			ans = ans / i * (i - 1);
			while(n % i == 0)	n /= i;
		}
	}
	if(n > 1)	ans = ans / n * (n - 1);
	return ans;
}

欧拉函数打表 

void euler(){
    for(int i=1;i<N;i++)    phi[i] = i;
    for(int i=2;i<N;i++){   
        if(phi[i] == i){    //表示是素数
            for(int j=i;j<N;j+=i)
                phi[j] = phi[j] / i * (i - 1);
        }
    }
}

欧拉筛法

void init(){
    phi[1] = 1;
    for(int i=2;i<MAXN;++i){
        if(!vis[i]){
            phi[i] = i - 1;
            num[cnt++] = i;
        }
        for(int j=0;j<cnt&&i*num[j]<=MAXN;++j){
            vis[i * num[j]] = 1;
            if(i % num[j])    phi[i * num[j]] = phi[i] * (num[j] - 1);
            else{
                phi[i * num[j]] = phi[i] * num[j];
                break;
            }
        }
    }
}

 

posted @ 2019-03-08 17:43  月光下の魔术师  阅读(11)  评论(0)    收藏  举报