文章目录

  • 一.欧拉函数简介
  • 二.欧拉函数计算
  • 三.欧拉函数值打表
  • 四.练手题目

一.欧拉函数简介

在数论中,对正整数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=1k(1−1pi)φ(n)=n\cdot \prod_{i=1}^k(1-\frac{1}{p_i})φ(n)=n⋅∏i=1k​(1−pi​1​),其中,pi为n的质因数

即根据质因数分解定理,将一个数n分解成有限个质数的乘积:n=p1a1⋅p2a2⋅p3a3⋅p4a4⋅⋅⋅⋅n=p_1^{a1}\cdot p_2^{a2}\cdot p_3^{a3}\cdot p_4^{a4}\cdot\cdot\cdot\cdotn=p1a1​⋅p2a2​⋅p3a3​⋅p4a4​⋅⋅⋅⋅

则,φ(n)=n⋅(1−1p1)⋅(1−1p2)⋅(1−1p3)⋅⋅⋅⋅φ(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−p1​1​)⋅(1−p2​1​)⋅(1−p3​1​)⋅⋅⋅⋅

例:

6=2*3

则,φ(6)=6⋅(1−12)⋅(1−13)=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−Np=N(1−1p)②φ(N)=N-\frac{N}{p}=N(1-\frac{1}{p})②φ(N)=N−pN​=N(1−p1​)

1~N中共有p,2p,3p……N共Np\frac{N}{p}pN​个p的倍数(N也是p的倍数)

现假设N还有1个质因子q,则利用容斥原理,得:

③φ(N)=N−Np−Nq+Npq=N[(1−1p)−1q(1−1p)]=N(1−1p)(1−1q)③φ(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−1p1)⋅(1−1p2)⋅(1−1p3)⋅⋅⋅⋅φ(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−p1​1​)⋅(1−p2​1​)⋅(1−p3​1​)⋅⋅⋅⋅

三.欧拉函数值打表

预备知识:

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

若m,n互质,φ(mn)=φ(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−1p1)⋅(1−1p2)⋅(1−1p3)⋅⋅⋅⋅φ(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−p1​1​)⋅(1−p2​1​)⋅(1−p3​1​)⋅⋅⋅⋅

因为m和n互质,所以m和n没有共同的因子,则mn的所有质因子其实就是m的质因子加上n的质因子,再想想欧拉函数的计算方法,φ(mn)φ(mn)φ(mn)可以被拆为φ(m)⋅φ(n)φ(m)\cdotφ(n)φ(m)⋅φ(n)

这个特性为我们揭示了一个数的欧拉函数值与其质因数欧拉函数值的关系,我们可以利用其来筛出欧拉函数值:

用phi数组储存欧拉函数值(phi即φ的英文)

①phi数组初始化为0,表示未处理(phi[1]的值为1)

②从2开始循环,在处理一个数的同时处理其所有倍数,令它们乘上i−1i\frac{i-1}{i}ii−1​即(1−1i)(1-\frac{1}{i})(1−i1​),反过来理解每个数都会被其质因数这么处理一次

③两个if( !phi[j] )需要理解,先说第二个:每个数如果没被处理过则让它先等于该数本身(之前说了phi值为0表示一个数还没被处理过)。这很容易理解,因为求欧拉函数值的公式为:φ(n)=n⋅(1−1p1)⋅(1−1p2)⋅(1−1p3)⋅⋅⋅⋅φ(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−p1​1​)⋅(1−p2​1​)⋅(1−p3​1​)⋅⋅⋅⋅,之所以没被处理过才进行这步操作是为了保证这步操作只被执行一次。

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

【欧拉函数】 欧拉函数计算及打表相关推荐

  1. c语言欧拉函数,欧拉函数

    欧拉函数 我们用$\phi(n)$表示欧拉函数 定义:$\phi(n)$表示对于整数$n$,小于等于$n$中与$n$互质的数的个数 性质 1.$\phi(n)$为积性函数 2.$\sum_{d|n}\ ...

  2. 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)

    [目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...

  3. 欧拉函数和莫比乌斯函数

    多校赛上最近有道题目是gugufishtion Problem Description Today XianYu is too busy with his homework, but the bori ...

  4. 线性筛与欧拉函数、莫比乌斯函数

    网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用. 最朴素的素数筛--埃拉托斯特尼筛法(Sieve of Eratosthenes) 复杂度 Olognlogn int primes[ ...

  5. 多线程之基于积分法与欧拉恒等式法的圆周率计算及OMP优化

    文章目录 一.问题描述 二.积分法 算法推导 编程实现 OMP优化 三.欧拉恒等式 算法推导 编程实现 前期准备 加法 减法 乘法 除法 算法实现 OMP优化 四.总结 积分法与欧拉恒等式法的对比 O ...

  6. 牛顿拉夫逊基波潮流计算通用型程序,runpf函数的替换

    牛顿拉夫逊基波潮流计算通用型程序,runpf函数的替换,可提供matlab版和python版 ID:4480672886448715

  7. 欧拉、欧几里得、笛卡尔都没能解决的数学问题,他探索了新的方案

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 欧拉.欧几里得.笛卡尔.尼科马修斯都没能解决的千年数学问题,还有破解的可能吗? 还真有可能. 最近,一位名为佩斯·尼尔森 (Pace Nie ...

  8. 小福利,带你快速入门sumifs多条件求和函数、设置下拉菜单结合vlookup函数双条件查找数据、excel的切片器(表关联)、数据透视表、数据透视图

    第一部分:利用sumifs函数求得双条件下的求和值 如题,现在需要根据下拉菜单年份和商品来查找利润, 第一步,在年份H3设置数据验证,分别是2019,2020,2021 第二步,在商品H4设置数据验证 ...

  9. Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装)

    Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装) 对于excel Java POI 使用 目前简单导出导入功能网上很多,但是对于有下拉选,样式等缺点却是最大硬伤,故此封装一个通 ...

  10. 常用函数的拉氏变换表

    常用函数的拉氏变换表 拉氏变换 L[f(t)]=F(s)=∫0∞f(t)e−stdt;(s+σ+jω为复变量){L}[f(t)]=F(s)=\int_0^{\infty}f(t)e^{-st}dt ; ...

最新文章

  1. zabbix3.2监控redis
  2. 「iOS 面试之道」勘误(二)
  3. 人脸识别双目摄像头何时同时打开双目
  4. web.config总结
  5. VMware Fusion 静态ip
  6. 40幅五彩缤纷的秋天风景摄影作品欣赏(上篇)
  7. select选择框必输校验_轮子这么多,我们为什么选择自研NewSQL
  8. 网站本地调试工具_一款Web调试代理工具:Fiddler
  9. Spring IOC学习心得之BeanPostProcessor,BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口是如何起作用的
  10. 更新项目java_java – 什么是Maven – 更新项目?
  11. FreeBSD8下安装软件相关
  12. Binary Tree Right Side View 二叉树右视图
  13. linux delete快捷键,Linux 常用快捷键
  14. ssm留学生交流互动论坛网站计算机毕业设计
  15. 毕业论文页眉(文字)页脚(页码)插入方法
  16. Java中使用Protocol Buffer
  17. L9953LXP_车门致动器驱动器
  18. 漏洞系列一一看我一招征服漏洞SSRF
  19. ubuntu18.04根目录已满造成开机失败报错Fail to start....
  20. 珠海到各大机场的线路

热门文章

  1. 张钹:人工智能技术已进入第三代
  2. 【重识云原生】第四章云网络4.3.10.6节——VXLAN应用部署方案
  3. 三相桥式全控电路matlab,基于Matlab/Simulink的三相桥式全控整流电路的仿真分析
  4. 【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型
  5. 五险一金 - 医疗保险(常见问题)
  6. sqlserver列转行,纵向数据转横向
  7. Centos-7游戏服务器环境部署(上)
  8. C#调用百度翻译API实现自己的简单翻译工具
  9. linux 生成随机文件,Linux 批量创建文件,文件名随机取
  10. java游戏应龙女魃转世_应龙女魃的故事传说