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

n的欧拉函数值用符号φ(n)表示

欧拉函数的定义是,对于一个正整数n,小于n且与n互质的数的数目(包括1,特殊地,φ(1)=1 )。

设p1,p2,p3,...,pr为n的全部r个质因数,则有φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pr)。

显然,用这个方法来计算单个欧拉函数是可以求解的。

附上代码:

 1 int get_phi(int x){
 2     int re=x;
 3     for(int i=2;i*i<=x;i++)
 4         if(x%i==0){
 5             re/=i;re*=i-1;
 6             while(x%i==0)
 7                 x/=i;
 8         }
 9     //仍有质因数?特判x=2及x=3的情况
10     if(x^1) re/=x,re*=x-1;
11     return re;
12 }

这个求法的时间复杂度是O(√n)d的。

但这个求法有弊端:

* 对于大量需要计算的欧拉函数值,逐一分解n的时间复杂度显然是十分高的。

在使用求解欧拉函数之前,介绍欧拉函数的几个性质:

(1) 欧拉函数是积性函数,即满足φ(mn)=φ(m)φ(n)。

(2) 当n为奇数时,有φ(2n)=φ(n)。

(3) n=∑ d|n φ(d)    ( d|n )。

(4) 对于给定的一个质数p,φ(p)=p -1。则对于正整数 n = p^k ,φ(n) = p^k - p^(k -1)。

(5) 若(N % a == 0 && (N / a) mod a == 0) 则有:φ(N)=φ(N / a) * a。

(6) 若(N % a == 0 && (N / a) mod a != 0)  则有:φ(N)=φ(N / a) * (a - 1)。

主要利用以上性质(4)(5)(6),我们可以用递推的方法按以下步骤来打出欧拉函数表。

(1) 记φ(1)=1。这是递推步骤吗。

(2) 根据性质(4),对于质数i,可直接得φ(i)=i-1,把i放入质数表prime中。

(3) 对于i,从头开始枚举质数(思考为什么枚举质数),根据性质(5)(6),当(i mod primej) != 0时,φ(i*primej) = φ(i)*(primej -1)

                             当枚举到(i mod primej) == 0时,φ(i*primej) = φ(i)*(primej),并停止(思考为什么要停止),枚举下一个i。

由此我们得到了打出欧拉函数表的主要代码(变量的定义不在这里展示)

 1     phi[1]=1;
 2     for(int i=2;i<=n;i++){
 3         if(!check[i]){
 4             prime[++cnt]=i;
 5             phi[i]=i-1;
 6         }
 7         for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
 8             check[i*prime[j]]=1;
 9             if(i%prime[j])  phi[i*prime[j]]=phi[i]*(prime[j]-1);
10             else{
11                 phi[i*prime[j]]=phi[i]*prime[j];
12                 break;
13             }
14         }
15     }
16 }

可以简单地得知时间复杂度是线性的O(n)。

利用打好的欧拉函数表,我们可以验证它的以上几个性质。



性质(2)

1     for(int i=n/2*2;i>1;i-=2)
2         if((i/2)&1)
3             printf("phi[%d] = %d = phi[%d/2] = phi[%d] = %d\n",i,phi[i],i,i/2,phi[i/2]);

example

phi[38] = 18 = phi[38/2] = phi[19] = 18
phi[34] = 16 = phi[34/2] = phi[17] = 16
phi[30] = 8 = phi[30/2] = phi[15] = 8
phi[26] = 12 = phi[26/2] = phi[13] = 12
phi[22] = 10 = phi[22/2] = phi[11] = 10
phi[18] = 6 = phi[18/2] = phi[9] = 6
phi[14] = 6 = phi[14/2] = phi[7] = 6
phi[10] = 4 = phi[10/2] = phi[5] = 4
phi[6] = 2 = phi[6/2] = phi[3] = 2
phi[2] = 1 = phi[2/2] = phi[1] = 1




性质(3)

 1     for(int i=1;i<=n;i++){
 2         printf("%d = ",i);
 3         int temp=0;
 4         int j;
 5         for(j=1;j<=i;j++)
 6             if(i%j==0){
 7                 temp+=phi[j];
 8                 printf("phi[%d]( =%d ) ",j,phi[j]);
 9                 break;
10             }
11         for(j=j+1;j<=i;j++)
12             if(i%j==0){
13                 temp+=phi[j];
14                 printf("+ phi[%d]( =%d ) ",j,phi[j]);
15             }
16         printf(" =%d\n",temp);
17     }

example

1 = phi[1]( =1 ) =1
2 = phi[1]( =1 ) + phi[2]( =1 ) =2
3 = phi[1]( =1 ) + phi[3]( =2 ) =3
4 = phi[1]( =1 ) + phi[2]( =1 ) + phi[4]( =2 ) =4
5 = phi[1]( =1 ) + phi[5]( =4 ) =5
6 = phi[1]( =1 ) + phi[2]( =1 ) + phi[3]( =2 ) + phi[6]( =2 ) =6
7 = phi[1]( =1 ) + phi[7]( =6 ) =7
8 = phi[1]( =1 ) + phi[2]( =1 ) + phi[4]( =2 ) + phi[8]( =4 ) =8
9 = phi[1]( =1 ) + phi[3]( =2 ) + phi[9]( =6 ) =9
10 = phi[1]( =1 ) + phi[2]( =1 ) + phi[5]( =4 ) + phi[10]( =4 ) =10



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

时间: 2024-11-20 04:30:01

欧拉函数性质与求法 [数论][欧拉函数]的相关文章

poj 2480 Longge&amp;#39;s problem 积性函数性质+欧拉函数

题意: 求f(n)=∑gcd(i, N) 1<=i <=N. 分析: f(n)是积性的数论上有证明(f(n)=sigma{1<=i<=N} gcd(i,N) = sigma{d | n}phi(n / d) * d ,后者是积性函数),能够这么解释:当d是n的因子时,设1至n内有a1,a2,..ak满足gcd(n,ai)==d,那么d这个因子贡献是d*k,接下来证明k=phi(n/d):设gcd(x,n)==d,那么gcd(x/d,n/d)==1,所以满足条件的x/d数目为phi(

poj 2480 Longge&#39;s problem 积性函数性质+欧拉函数

题意: 求f(n)=∑gcd(i, N) 1<=i <=N. 分析: f(n)是积性的数论上有证明(f(n)=sigma{1<=i<=N} gcd(i,N) = sigma{d | n}phi(n / d) * d ,后者是积性函数),可以这么解释:当d是n的因子时,设1至n内有a1,a2,..ak满足gcd(n,ai)==d,那么d这个因子贡献是d*k,接下来证明k=phi(n/d):设gcd(x,n)==d,那么gcd(x/d,n/d)==1,所以满足条件的x/d数目为phi(

数论入门——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛

一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数\(\mu(n)\)为: 当n有平方因子时,\(\mu(n)=0\). 当n没有平方因子时,\(\mu(n)=(-1)^{\omega(n)}\),\(\omega(n)\)表示n不同质因子的个数. 性质1: \(\sum_{d|n}\mu(d)=[n=1]\) 证明:我们把n分解质因数,则原式\(=(-1+1)^{\omega(n)}=0\). 因为对于不同的质因子,只有选和不选两种方案,这是一个组合数相加的形式,偶数加奇数减,根据二项式

lightOJ1370 欧拉函数性质

D - (例题)欧拉函数性质 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popul

HDU 4002 Find the maximum(数论-欧拉函数)

Find the maximum Problem Description Euler's Totient function, φ (n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n . For example, as 1, 2, 4, 5, 7, and 8, are all less than

POJ 2154 Color(组合数学-波利亚计数,数论-欧拉函数,数论-整数快速幂)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7693   Accepted: 2522 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

hdu1395 数论 欧拉函数

hdu1395 数论   欧拉函数对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解2.如果是奇数 首先根据欧拉定理 我们可知 phi(n)一定是满足要求的 然后答案一定是 phi( i ) 的因数 然后我们就可以 O(sqrt(phi(i))的时间内 枚举每个因数 然后快速幂验证就行了 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const double eps

HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解

题意: 给定\(n,m,p\),求 \[ \sum_{a=1}^n\sum_{b=1}^m\frac{\varphi(ab)}{\varphi(a)\varphi(b)}\mod p \] 思路: 由欧拉函数性质可得:\(x,y\)互质则\(\varphi(xy)=\varphi(x)\varphi(y)\):\(p\)是质数则\(\varphi(p^a)=(p-1)^{a-1}\).因此,由上述两条性质,我们可以吧\(a,b\)质因数分解得到 \[ \begin{aligned} \sum_{

ACM数论-欧几里得与拓展欧几里得

ACM数论--欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). int gcd(int a,int b) { return b ? gcd(b,a%b) : a; } 扩展欧几里德算法: 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使