欧拉函数:
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler’s totient function),它又称为Euler’s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。
性质:
参见
这是一个比较详细的解释了。
c语言实现:
直接法:
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; //保证i为n的素数因子
}
}
if(n>1) ret*=n-1; //不是很懂
return ret;
}
打表法:
void init(){
euler[1]=1;
for(int i=2;i<Max;i++)
euler[i]=i;
for(int i=2;i<Max;i++)
if(euler[i]==i)
for(int j=i;j<Max;j+=i)
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}
Emmmm,这两个算法还是没怎么看懂,待补……
想了很久,发现,其实这个就和素数筛法是一个道理。
对于直接法,举个例子,比如说32这个数,在i=2时,反复除以2,删去了非质数因子4、8、16。
而打表法和素数打表基本一致。