欧拉函数
在别人博客上找来一段模板代码,拿来分析一下
int euler(int n)
{
int res = n;
int m = (int)sqrt(n);
for(int i = 2; i <= m; i++)//以上两行非常类似求素数
if(n % i == 0) //说明n不是素数
{
res = res / i * (i-1);//这一步不是很懂,
while(n % i == 0) n /= i;//直到n不能被i整除为止
}
if(n > 1) res = res / n * (n-1); //经过以上的折腾,得到n,直接运算
return res;
}
欧拉函数是求小于x并且和x互质的数的个数(所谓两个数互质,那就是两个数的最大公约数是1)
通式:φ(x) = x ( 1 - 1/p1 )( 1 - 1/p2 )( 1 - 1/p3 )( 1 - 1/p4 )…..( 1 - 1/pn )
其中p1, p2……pn为x的所有不重合的质因数,x是不为0的整数(注意,我在这个地方加了一个不重合,比如 12 = 2 * 2 * 3 ,那么它的不重合的质因数就有 2 和 3,所以 φ(12) = x(1 - 1/2)( 1 - 1/3) = 4 ,也就是说 12 在 1~12 中有四个与其互质的数,分别为1、5、7、11,是不是2、3、4、6、8、9、10与12都不互质呢,很神奇吧 (ฅ>ω<*ฅ))
有个小细节是:φ(1)=1(唯一和1互质的数就是1本身)
看到这,我懂了
扫描二维码关注公众号,回复:
2688999 查看本文章