【欧拉函数】 欧拉函数计算及打表

一.欧拉函数简介

在数论中,对正整数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)=ni=1k(1pi1),其中,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=p1a1p2a2p3a3p4a4

则, φ ( 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(1p11)(1p21)(1p31)

例:

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(121)(131)=2

即,6以内有2个数和6互质

验证:1、5和6互质,2、3、4、6都是6
的因数

显而易见地,当n为质数时, φ ( n ) = n − 1 φ(n)=n-1 φ(n)=n1

欧拉函数计算模板:

素因数分解即可

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)=NpN=N(1p1)

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)=NpNqN+pqN=N[(1p1)q1(1p1)]=N(1p1)(1q1)

……

得欧拉函数计算公式:

φ ( 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(1p11)(1p21)(1p31)

三.欧拉函数值打表

预备知识:

欧拉函数为积性函数,即:

若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)=22=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(1p11)(1p21)(1p31)

因为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} ii1 ( 1 − 1 i ) (1-\frac{1}{i}) (1i1),反过来理解每个数都会被其质因数这么处理一次

③两个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(1p11)(1p21)(1p31),之所以没被处理过才进行这步操作是为了保证这步操作只被执行一次。

④第一个 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
题解:传送门

  • 11
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值