码迷,mamicode.com
首页 > 其他好文 > 详细

数论学习_欧拉函数

时间:2017-08-26 21:28:23      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:fun   数值   class   phi   .com   sign   height   sig   static   

       在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler‘so totient function),它又称为Euler‘s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。    

        求解小于n且与n互素的整数个数。给出正整数n的唯一分解式: n=p1a1p2a2p3a3......pkak,求1,2,3......n中与n互素的数的个数,不难想到用容斥定理求解,让n减去与n不互素的数,也就是pi的倍数。先减去不是pi的倍数得数,在加上是pipj倍数得数......这些很好计算就是n/pi,n/pipj。 n-n/p1-n/p2....-n/pk+n/p1p2+n/p1p3......换个思路想就是对于每个因子pi,要么贡献是1要么贡献是-1/pi,得技术分享 这就是著名的欧拉函数。

      下面讨论如何求解单个整数的欧拉函数值,显然可以找到这个数所有的质因子然后再依次计算,需要用到试除法依次判断sqrt(N)内所有的素数是否是N的因子。

这需要生成质数表。但其实并不用那么麻烦,只需要每次找到一个素因子之后把他除干净即可,可以保证找到的因子都是素数。这个思想是不是很熟悉?没错这就是利用了素数筛法的思路,只不过变化了一下形式。

 1 int euler_phi(int n)
 2 {
 3     int m = sqrt(n + 0.5);
 4     int ans = n;
 5     for (int i = 2;i <= m;++i)
 6     {
 7         if (n%i == 0) {
 8             ans = ans / i*(i - 1);
 9             while (n%i == 0)n /= i;
10         }
11     }
12     if (n > 1)ans = ans/n * (n - 1);
13     return ans;
14 }

 

数论学习_欧拉函数

标签:fun   数值   class   phi   .com   sign   height   sig   static   

原文地址:http://www.cnblogs.com/zzqc/p/7436265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!