欧拉函数基础

数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目

第一次接触欧拉函数  找度娘了一下   说 

 

Φ(n)=n*(1-1/p1)*(1-1/p2)*......*(1-1/pn);

p表示n的质因数

Φ(10)=10*(1-1/2)*(1-1/5)=4;

如果n是奇数  Φ(2n)=Φ(n);

如果m n 都是素数   Φ(mn)=Φ(m)Φ(n);

如果p是素数  Φ(p)=p-1;

其实是总共有1~p^k个数 

和p^k不互质的正整数有{1*p,2*p,...,p^(k-1)*p} 一共有p^k-1个;

所以Φ(n)=p^k-p^k-1;

但是如果p不是素数   就不能用这种方法

我们可以把n拆成几个素数相乘 然后把所有1~n之间素数的倍数都删去,剩下就是你要的啦

但是还有一个问题就是 有可能减重复   比如:24的素数有2还有3,2和3的倍数都有6,但是6这个数只能减一次

所以就有扯到另个一集合的问题

假如有一个集合U里面包含了许多个小集合p1,p2,p3...(这些每一个集合就是每一个素数的倍数   这些集合可能有重合的部分)

然后让求除了这些集合之外的集合 所以就用U*(1-p1)*(1-p2)*...*(1-pn);

1-pi表示除了pi集合中所有的数  

 

 

 

 

用c语音写一下

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<queue>

using namespace std;

#define N 1000005

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

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",eular(n));
    }
    return 0;
}

如果只知道Φ(n)求n 是有规律的

只需求Φ(n)+1之后的第一个素数就是n;

 

posted @ 2016-04-05 14:10  啦咯  阅读(203)  评论(0编辑  收藏  举报