欧拉函数基础
在数论,对正整数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;