最近不知道怎么了,老是把写好的博客误删,继续当是复习好了。

          昨天学了一下欧拉函数,觉得挺简单的,其实就是一个公式。那么什么是欧拉函数呢?欧拉函数就是用来求小于或等于 n 的所有与 n 互质的数的和的一个函数。

        (一) 由于欧拉函数又叫 ψ 函数,所以我们用  ψ(x) 来表示公式:

        (1)ψ(x) = x*(1-1/p1)*(1-1/p2)*(1-1/p3)*............*(1-1/pn)              其中的 p1,p2,p3.............pn 都是 x 的质因子(注意:每种质因子只能出现一次)

        (2)当 x 可以用质数 p 的 k 次幂来表示,那么 ψ(x) = p^K - P^(K-1)          因为除了 p 的倍数外,其他数都与 x 互质。

        (二)  昨天看了一些资料,发现求小于或等于 n 的所有与 n 互质的数的和的方法有挺多的,这里列举几个:

        (1)通过纯暴力的方法,从 1 到 x 一个一个的来算,如果任取 1<=n<=x ,有 gcd(n,x)=1,则计数变量加 1 (这种方法太耗时了,不可取)。

        (2)先通过筛选筛掉 x 的所有质因子的倍数,再通过公式一来算出 ψ(x) (这种方法比较麻烦,也不可取)。

        (3)欧拉函数(欧拉函数是积性函数——若n,m互质,则 ψ(m n)=ψ(m)ψ(n) )。

         具体代码实现:     

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int eular(int n)
{
     int res=1;
     for(int i=2;i*i<=n;i++)
     {
         if(n%i==0)
             n/=i,res*=i-1;
         while(n%i==0)
             n/=i,res*=i;        
     }    
     if(n>1)
     {
         res*=n-1;
     }
     return res;
}
int main()
{
     int n;
     while(scanf("%d",&n)!=EOF)
     {
          printf("%d\n",eular(n));                          
     }    
     //system("pause");
     return 0;
}

         代码分析:

         代码中用到了两个性质,一个是公式二,另外一个是欧拉函数是积性函数。

         举一个例子:当 x = 24 时,ψ(24) = ψ(3*8) = ψ(3)*ψ(8) = ψ(3^1)*ψ(2^3)   (积性函数的性质)

                         ψ(3^1) = (3-1)*3^0 , ψ(2^3) = (2-1)*2^2          (公式二)

                         其实代码中的那个for循环就相当于一个筛选,将质因子的幂次都筛掉,同时计算每个独立的 ψ(k) 。

posted on 2011-08-18 10:05  枫叶飘泪  阅读(730)  评论(0编辑  收藏  举报