一.欧拉函数简介
在数论中,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(因此φ(1)=1)。此函数以其首名研究者欧拉命名(Euler’s totient function),它又称为Euler’s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。
注:a,b互质即gcd(a,b)=1
二.欧拉函数计算
计算公式 φ ( n ) = n ⋅ ∏ i = 1 k ( 1 − 1 p i ) φ(n)=n\cdot \prod_{i=1}^k(1-\frac{1}{p_i}) φ(n)=n⋅∏i=1k(1−pi1),其中,pi为n的质因数
即根据质因数分解定理,将一个数n分解成有限个质数的乘积: n = p 1 a 1 ⋅ p 2 a 2 ⋅ p 3 a 3 ⋅ p 4 a 4 ⋅ ⋅ ⋅ ⋅ n=p_1^{a1}\cdot p_2^{a2}\cdot p_3^{a3}\cdot p_4^{a4}\cdot\cdot\cdot\cdot n=p1a1⋅p2a2⋅p3a3⋅p4a4⋅⋅⋅⋅
则, φ ( n ) = n ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ ( 1 − 1 p 3 ) ⋅ ⋅ ⋅ ⋅ φ(n)=n\cdot (1-\frac{1}{p_1})\cdot (1-\frac{1}{p_2})\cdot (1-\frac{1}{p_3})\cdot\cdot\cdot\cdot φ(n)=n⋅(1−p11)⋅(1−p21)⋅(1−p31)⋅⋅⋅⋅
例:
6=2*3
则, φ ( 6 ) = 6 ⋅ ( 1 − 1 2 ) ⋅ ( 1 − 1 3 ) = 2 φ(6)=6\cdot(1-\frac{1}{2})\cdot(1-\frac{1}{3})=2 φ(6)=6⋅(1−21)⋅(1−31)=2
即,6以内有2个数和6互质
验证:1、5和6互质,2、3、4、6都是6
的因数
显而易见地,当n为质数时, φ ( n ) = n − 1 φ(n)=n-1 φ(n)=n−1
欧拉函数计算模板:
素因数分解即可
int Euler(int N){
int ret=N;
for(int i=2;i*i<=N;i++)
if(N%i==0){
ret=ret*(i-1)/i;
while(N%i==0)
N/=i;
}
if(N>1) ret=ret*(N-1)/N;
return ret;
}
补一下计算欧拉函数值公式的证明,不想看的可以跳过:
在计算1~ N中与N互质的个数时,先设置初始值为N,即假设1~ N都与N互质。
① φ ( N ) = N ①φ(N)=N ①φ(N)=N
若p是数N的一个质因子,则p以及p的倍数必然与N起码包含一个共同的因子:p,即它们的gcd值>1,故p及p的倍数不可能与N互质
所以应减去这部分,即:
② φ ( N ) = N − N p = N ( 1 − 1 p ) ②φ(N)=N-\frac{N}{p}=N(1-\frac{1}{p}) ②φ(N)=N−pN=N(1−p1)
1~N中共有p,2p,3p……N共 N p \frac{N}{p} pN个p的倍数(N也是p的倍数)
现假设N还有1个质因子q,则利用容斥原理,得:
③ φ ( N ) = N − N p − N q + N p q = N [ ( 1 − 1 p ) − 1 q ( 1 − 1 p ) ] = N ( 1 − 1 p ) ( 1 − 1 q ) ③φ(N)=N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}=N[(1-\frac{1}{p})-\frac{1}{q}(1-\frac{1}{p})]=N(1-\frac{1}{p})(1-\frac{1}{q}) ③φ(N)=N−pN−qN+pqN=N[(1−p1)−q1(1−p1)]=N(1−p1)(1−q1)
……
得欧拉函数计算公式:
φ ( n ) = n ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ ( 1 − 1 p 3 ) ⋅ ⋅ ⋅ ⋅ φ(n)=n\cdot (1-\frac{1}{p_1})\cdot (1-\frac{1}{p_2})\cdot (1-\frac{1}{p_3})\cdot\cdot\cdot\cdot φ(n)=n⋅(1−p11)⋅(1−p21)⋅(1−p31)⋅⋅⋅⋅
三.欧拉函数值打表
预备知识:
欧拉函数为积性函数,即:
若m,n互质, φ ( m n ) = φ ( m ) ⋅ φ ( n ) φ(mn)=φ(m)\cdotφ(n) φ(mn)=φ(m)⋅φ(n)
例: φ ( 12 ) = φ ( 3 ) ⋅ φ ( 4 ) = 2 ⋅ 2 = 4 φ(12)=φ(3)\cdot φ(4)=2\cdot 2=4 φ(12)=φ(3)⋅φ(4)=2⋅2=4
证明:
回想欧拉函数的计算方法: φ ( n ) = n ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ ( 1 − 1 p 3 ) ⋅ ⋅ ⋅ ⋅ φ(n)=n\cdot (1-\frac{1}{p_1})\cdot (1-\frac{1}{p_2})\cdot (1-\frac{1}{p_3})\cdot\cdot\cdot\cdot φ(n)=n⋅(1−p11)⋅(1−p21)⋅(1−p31)⋅⋅⋅⋅
因为m和n互质,所以m和n没有共同的因子,则mn的所有质因子其实就是m的质因子加上n的质因子,再想想欧拉函数的计算方法, φ ( m n ) φ(mn) φ(mn)可以被拆为 φ ( m ) ⋅ φ ( n ) φ(m)\cdotφ(n) φ(m)⋅φ(n)
这个特性为我们揭示了一个数的欧拉函数值与其质因数欧拉函数值的关系,我们可以利用其来筛出欧拉函数值:
用phi数组储存欧拉函数值(phi即φ的英文)
①phi数组初始化为0,表示未处理(phi[1]的值为1)
②从2开始循环,在处理一个数的同时处理其所有倍数,令它们乘上 i − 1 i \frac{i-1}{i} ii−1即 ( 1 − 1 i ) (1-\frac{1}{i}) (1−i1),反过来理解每个数都会被其质因数这么处理一次
③两个if( !phi[j] )需要理解,先说第二个:每个数如果没被处理过则让它先等于该数本身(之前说了phi值为0表示一个数还没被处理过)。这很容易理解,因为求欧拉函数值的公式为: φ ( n ) = n ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ ( 1 − 1 p 3 ) ⋅ ⋅ ⋅ ⋅ φ(n)=n\cdot (1-\frac{1}{p_1})\cdot (1-\frac{1}{p_2})\cdot (1-\frac{1}{p_3})\cdot\cdot\cdot\cdot φ(n)=n⋅(1−p11)⋅(1−p21)⋅(1−p31)⋅⋅⋅⋅,之所以没被处理过才进行这步操作是为了保证这步操作只被执行一次。
④第一个 if( !phi[j] ) 则是为了只让质因数去对它的倍数进行操作:一个数如果是合数,它必然被之前的素数处理过,所以phi的值不可能是0,这样就保证了只有素数才会对其倍数进行处理
可以发现这个做法和素数筛很像。
代码如下:
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int phi[1000010];
void Euler_excel(int n){
phi[1]=1;
for(int i=2;i<=n;i++) phi[i]=0;
for(int i=2;i<=n;i++)
if(!phi[i]){
for(int j=i;j<=n;j+=i){
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
四.练手题目
1 .
计算欧拉函数值模板题:HDU-1286
2 .
欧拉函数打表模板题:LightOJ-1370
题解:传送门
3 .
Visible Lattice Points: POJ-3090
题解:传送门
今天的文章欧拉函数值计算_100的欧拉函数值分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/82683.html