数论学习_欧拉函数

Posted zzq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论学习_欧拉函数相关的知识,希望对你有一定的参考价值。

       在数论,对正整数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 }

 

以上是关于数论学习_欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章

「数论基础」欧拉定理(费马小定理)

数论之欧拉定理

数论——欧拉定理

欧拉函数性质与求法 [数论][欧拉函数]

数论——欧拉函数

数论之旅4---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)