欧拉函数模板

欧拉函数:

定义:用于计算 p(n),比n小的所有与n互质的数。

计算公式:p(n)=n*(1-1/p1)*(1-1/p2)....*(1-1/pk)【p1,p2,pk都是n的素因子】

另:若n=p1^q1*p2^q2*.....*pk^qk

则,p(n)=(p1-1)*p1^(q1-1)*(p1-1)*p2^(q2-1)......*(pk-1)*pk^(qk-1)

性质:若m,n互质,φ(mn)=φ(m)φ(n)。当n为奇数时,φ(2n)=φ(n)

欧拉定理:

a,m互质,a^φ(m)≡1(mod m)

例:2,3互质,那么,2^2%3=1

推论:对于互质的数a、n,满足a^(φ(n)+1) ≡ a (mod n)

 欧拉公式的延伸:小于n 与n互质的数的和 是euler(n)*n/2

 

求欧拉函数的模板:

int euler(int n)//返回euler(n)
{
     int i;
     int res = n,a = n;
     for(i = 2;i*i <= a; ++i)
     {
         if(a%i == 0)
         {
             res -= res/i; //p(n) = (p - p/p1)(1 - 1/p2)......
             while(a%i == 0) a/=i;
         }
     }
     if(a > 1) res -= res/a;//存在大于sqrt(a)的质因子
     return res;
}

  

欧拉函数打表:

void SE()//select euler//类似于素数筛选法
{
    int i,j;
    euler[1] = 1;
    for(i = 2;i < Max; ++i)  euler[i]=i;
    for(i = 2;i < Max; ++i)
    {
         if(euler[i] == i)//这里出现的肯定是素数
         {
           for(j = i; j < Max; j += i)//然后更新含有它的数
           {
              euler[j] = euler[j]/i*(i - 1); // n*(1 - 1/p1)....*(1 - 1/pk).先除后乘
           }
        }
    }
     //for (int i = 1; i <= 20; ++i) printf("%d ",euler[i]);
}

  

posted @ 2012-08-03 09:31  E_star  阅读(1068)  评论(0编辑  收藏  举报