如果记小于n且与n互质的数的个数为Φ(n),则在数论上叫函数Φ(n)为欧拉函数,求Φ(60)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果记小于n且与n互质的数的个数为Φ(n),则在数论上叫函数Φ(n)为欧拉函数,求Φ(60)相关的知识,希望对你有一定的参考价值。

如果记小于n且与n互质的数的个数为Φ(n),则在数论上叫函数Φ(n)为欧拉函数,求Φ(60)
要过程
不要枚举,欧拉函数是不是有公式
是什么,怎么证明

第二个回答里的地址正解,有一个定理如下图:这里μ(n)是莫比乌斯函数

为计算方便还有以下性质

φ(p^a)=p^a-p^(a-1),p是素数

φ(mn)=φ(m)φ(n)(d/φ(d)),d=(m,n)

计算φ(60)就不困难了 

可以参考T. Apostol 的Introduction to Analytical Number Theory;第二章里有关于基本的算数的函数的性质的讨论

参考技术A 我记得好像没有这个公式。
高斯曾经研究过这个问题,似乎没有得出答案。

或者这个公式是个超越函数,仍然需要枚举……

上面的链接中并没有写出我们想要的公式,同余(mud)也是需要枚举的。
参考技术B 你要的在下面,请看

参考资料:http://baike.baidu.com/view/107769.htm?fr=ala0_1

参考技术C 1

数论--欧拉函数

欧拉函数,用φ(n)表示

欧拉函数是求小于等于n的数中与n互质的数的数目

比如φ(10),小于等于10的数中与10互质的数有1,3,7,9,所以φ(10)=4

 

那么,问题来了,如何求求小于等于n的数中与n互质的数的数目???

比如求φ(10)

先质因子分解,10=2*5,再去掉所有2和5的倍数:2的倍数2,4,6,8,10;5的倍数:5,10;

10-10/2-10/5,但是这样算10去掉了两次,那就加回来,10-10/2-10/5+10/2/5=4(容斥原理)

φ(10)=4;

再比如φ(30)

30=2*3*5;

30-30/2-30/3-30/5+ 30/(2*3) + 30/(2*5) + 30/(3*5) - 30/(2*3*5)=8

φ(30)=8

但是这样算太麻烦了!

看简单方法:

φ(30)   =   30*(1 - 1/2)*(1 - 1/3)*(1 - 1/5)   =   30*(1 - 1/2 - 1/3 - 1/5 + 1/6 + 1/10 + 1/15 - 1/30)

可以发现吧,展开后(划线的)跟上面那个式子(斜体的)其实是一样的

于是,可以写代码:

 1 #include<cstdio>
 2 
 3 int phi(int x){//欧拉函数
 4     int ans = x;
 5     for(int i = 2; i*i <= x; i++){
 6         if(x % i == 0){
 7             ans = ans / i * (i-1);
 8             while(x % i == 0) x /= i;
 9         }
10     }
11     if(x > 1) ans = ans / x * (x-1);
12     return ans;
13 }
14 
15 int main()
16 {
17     printf("%d\\n",phi(30));
18 }

时间复杂度为O(√n)

 

如果要预处理n个数的欧拉函数值,可以用筛子的思想(还记得前面提到的素数筛吗??)

#include<cstdio>
const int N = 100000 + 5;
int phi[N];
void Euler(){
    phi[1] = 1;
    for(int i = 2; i < N; i ++){
        if(!phi[i]){//类似素数筛,phi[i]==0代表i是素数 
            for(int j = i; j < N; j += i){
                if(!phi[j]) phi[j] = j;
                phi[j] = phi[j] / i * (i-1);//i一定是j的素因子 (看for循环环里面的j的变化) 
            }
        }
    }
}
int main(){
    Euler();
    printf("%d\\n",phi[30]);
}

 

性质:

p为质数

1. phi(p)=p-1   因为质数p除了1以外的因数只有p,故1至p的整数只有p与p不互质 

2. 如果i mod p = 0, 那么 phi(i * p)=phi(i) * p       //例:10%2==0,phi(2*10)=phi(10)*2=4*2=8 正解

3.若i mod p ≠0,  那么 phi( i * p )=phi(i) * ( p-1 )   //例:10%3!=0,phi(3*10)=phi(10)*(3-1)=4*2=8 正解

 

公式:

技术分享

超欧拉取模进化公式

 技术分享

 

以上是关于如果记小于n且与n互质的数的个数为Φ(n),则在数论上叫函数Φ(n)为欧拉函数,求Φ(60)的主要内容,如果未能解决你的问题,请参考以下文章

浅谈欧拉函数

欧拉函数 / 蒙哥马利快速幂 / 容斥

欧拉函数

Uva10820 欧拉公式模板(求小于n且与n互素的数的个数)

理解RSA算法

欧拉函数