第二十六章 数论——欧拉函数(详解与证明)

  • 欧拉函数
    • 1、互质
    • 2、欧拉函数的定义
    • 3、欧拉函数的公式
    • 4、欧拉函数的证明
    • 5、欧拉函数的使用
      • (1)问题一:
        • 思路
        • 代码
      • (2)问题二:
        • 思路
          • case1case1case1
          • case2case2case2
          • case3case3case3
        • 代码

欧拉函数

1、互质

如果gcd(a,b)=1gcd(a,b)=1gcd(a,b)=1,则说明两个数互质。即如果两个数最大公约数是1,那么这两个数就是互质的。
比如14和15

14的约数:1,2,7,14
15的约数:1,3,5,15

二者的最大公约数是1,即gcd(14,15)=1gcd(14,15)=1gcd(14,15)=1,所以14和15互质。

2、欧拉函数的定义

对于一个数nnn,从111到nnn中,与nnn互质的个数记作Φ(n)\Phi (n)Φ(n),那么这个Φ(n)\Phi (n)Φ(n)就i被称作欧拉函数。

比如:
Φ(6)=2\Phi (6)=2Φ(6)=2

因为,

1,2,3,4,5,6中与6互质的是1和5。

3、欧拉函数的公式

根据算数基本定理,该合数可以写成有限个质数的乘积,即:

n=p1k∗p2m∗p3x...pnwn=p_1^k*p_2^m*p_3^x...p_n^wn=p1k​∗p2m​∗p3x​...pnw​

那么Φ(n)=n∗(p1−1p1)∗(p2−1p2)∗...∗(pn−1pn)\Phi (n)=n*(\frac{p_1-1}{p_1})*(\frac{p_2-1}{p2})*...*(\frac{p_n-1}{p_n})Φ(n)=n∗(p1​p1​−1​)∗(p2p2​−1​)∗...∗(pn​pn​−1​)

这就是著名的欧拉函数。

我们可以验证一下:

6=2∗36=2*36=2∗3

Φ(6)=6∗2−12∗3−13=2\Phi (6)=6*\frac{2-1}{2}*\frac{3-1}{3}=2Φ(6)=6∗22−1​∗33−1​=2

特殊地,

如果一个数是质数,我假设这个质数是ppp,质数的算数基本定理的表达式就是本身,所以

Φ(p)=p∗(p−1p)=p−1\Phi (p)=p*(\frac{p-1}{p})=p-1Φ(p)=p∗(pp−1​)=p−1

所以,如果一个数是质数,那么这个数ppp:
Φ(p)=p−1\Phi (p)=p-1Φ(p)=p−1

那么这个函数怎么证明呢?

我们继续向下看:

4、欧拉函数的证明

5、欧拉函数的使用

(1)问题一:

思路

现在问题的关键其实就是质因数的分解,而质因数的分解,作者在前面的文章详细讲解过分解方式:

传送门:质因数的分解

代码

#include<iostream>
using namespace std;long long phi(int a)
{long long ans=a;for(int i=2;i<=a/i;i++){if(a%i==0)ans=ans*(i-1)/i;while(a%i==0)a/=i;}if(a>1)ans=ans*(a-1)/a;return ans;
}int main()
{int n;cin>>n;for(int i=0;i<n;i++){int a;scanf("%d",&a);cout<<phi(a)<<endl;}return 0;
}

(2)问题二:

思路

这道题的关键在于求出1到n之间的每个数字的欧拉函数之和,那么我们可以将1到n之间的数字分成三类:

case1case1case1

Φ(1)=1\Phi (1)=1Φ(1)=1

case2case2case2

Φ(质数)=质数−1\Phi(质数)=质数-1Φ(质数)=质数−1

case3case3case3

合数的话,则需要分解质因数计算求解。
Φ(n)=n∗(p1−1p1)∗(p2−1p2)∗...∗(pn−1pn)\Phi (n)=n*(\frac{p_1-1}{p_1})*(\frac{p_2-1}{p2})*...*(\frac{p_n-1}{p_n})Φ(n)=n∗(p1​p1​−1​)∗(p2p2​−1​)∗...∗(pn​pn​−1​)

涉及到数的筛选问题:

我们可以联想到之前所学的两种筛法:埃氏筛法和欧拉筛法

不了解这两个筛法的同学建议先去看一下作者之前的讲解:

埃氏筛法和欧拉筛法

我们这里采用欧拉筛法

那么欧拉筛和欧拉函数怎么结合求呢?

首先我们根据欧拉函数公式:

Φ(n)=n∗(p1−1p1)∗(p2−1p2)∗...∗(pn−1pn)\Phi (n)=n*(\frac{p_1-1}{p_1})*(\frac{p_2-1}{p2})*...*(\frac{p_n-1}{p_n})Φ(n)=n∗(p1​p1​−1​)∗(p2p2​−1​)∗...∗(pn​pn​−1​)

可以知道,结果只和质数本身有关,和他的指数是无关的

另外,我们的欧拉筛是用来筛质数的,质数的欧拉函数也是很好求的,那么我们思考一下:

能否用质数的欧拉函数结果去求解合数的欧拉函数?

primes[j]primes[j]primes[j]是质数,所以我们的Φ(primes[j])=primes[j]−1\Phi(primes[j])=primes[j]-1Φ(primes[j])=primes[j]−1

我们欧拉筛的第二层循环中,我们存在这样一个判断 imodprimes[j]是否等于0i\ mod\ primes[j]是否等于0i mod primes[j]是否等于0


第一种情况:imodprimes[j]==0第一种情况:i\ mod\ primes[j]==0第一种情况:i mod primes[j]==0

这个判断说明,primes[j]primes[j]primes[j]是iii的一个质因数。

也就是说,Φ(i)\Phi(i)Φ(i)中存在一项(1−1primes[j])(1-\frac{1}{primes[j]})(1−primes[j]1​)

而我们假设k=i∗primes[j]k=i*primes[j]k=i∗primes[j],那么kkk的算数基本定理的表达式当中只是比iii的表达式中,primes[j]primes[j]primes[j]的这一项所对的指数加了1而已。

也就是说,

i∗primes[j]i*primes[j]i∗primes[j]和iii所含的质因数种类是相同的

所以二者的欧拉函数中,后面的多项式乘积都是一样的,只是前面的系数nnn不同,因此我们可以得到下面的结论。

Φ(i∗primes[j])=primes[j]∗Φ(i)\Phi(i*primes[j])=primes[j]*\Phi(i)Φ(i∗primes[j])=primes[j]∗Φ(i)


第二种情况:imodprimes[j]!=0第二种情况:i\ mod\ primes[j]!=0第二种情况:i mod primes[j]!=0

因为,primes[j]primes[j]primes[j]不是iii的质因数,但是primes[j]primes[j]primes[j]却是primes[j]∗iprimes[j]*iprimes[j]∗i的质因数。

此时就说明,primes[j]∗iprimes[j]*iprimes[j]∗i的算术基本定理的表达式中比iii的算数基本定理中多了一项primes[j]primes[j]primes[j]

所以,此时Φ(i∗primes[j])\Phi(i*primes[j])Φ(i∗primes[j])比Φ(i)\Phi(i)Φ(i)不仅系数多了一个primes[j]primes[j]primes[j],同时,由于前者的质因数多了一个,所以还多了一项(1−1primes[j])(1-\frac{1}{primes[j]})(1−primes[j]1​)

所以:

Φ(i∗primes[j])=primes[j]∗Φ(i)∗(1−1primes[j])=(primes[j]−1)∗Φ(i)\Phi(i*primes[j])=primes[j]*\Phi(i)*(1-\frac{1}{primes[j]})=(primes[j]-1)*\Phi(i)Φ(i∗primes[j])=primes[j]∗Φ(i)∗(1−primes[j]1​)=(primes[j]−1)∗Φ(i)


所以根据上面三种情况,我们可以将其融合到我们的欧拉筛中。

代码

#include<iostream>
using namespace std;
const int N=1e6+10;
int primes[N],cnt;
int euler[N];
bool st[N];
void get_eulers(int n)
{euler[1]=1;for(int i=2;i<=n;i++){if(!st[i]){primes[cnt++]=i;euler[i]=i-1;}for(int j=0;primes[j]<=n/i;j++){st[i*primes[j]]=true;if(i%primes[j]==0){euler[i*primes[j]]=primes[j]*euler[i];break;}euler[i*primes[j]]=(primes[j]-1)*euler[i];}}
}
int main()
{int n;cin>>n;get_eulers(n);long long res=0;for(int i=1;i<=n;i++){res+=euler[i];}cout<<res<<endl;return 0;
}

第二十六章 数论——欧拉函数(详解与证明)相关推荐

  1. 【4.3 欧拉函数详解】

    更好的阅读体验\color{red}{更好的阅读体验}更好的阅读体验 目录 4.3.1 公式法求欧拉函数 4.3.2 筛法求欧拉函数 概念 1∼N1∼N1∼N中与NNN互质的数的个数被称为欧拉函数,记 ...

  2. 【正点原子MP157连载】第二十六章 DS18B20数字温度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  3. Windows核心编程(笔记13) 第十六章--第二十六章

    改变下记录方式,只写自己觉得需要注意一下的防止出错的地方,或者一些特别重要的点,或者一些感悟. 第十六章 线程栈 第十七章 内存映射文件 1.注意写时复制在内存映射文件中的用处. 2.#pagma d ...

  4. 【正点原子STM32连载】 第二十六章 USMART调试组件实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  5. hdu1395 数论 欧拉函数

    hdu1395 数论   欧拉函数 对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解 2.如果是奇数 首先根据欧拉定理 我们可知 p ...

  6. 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理

    第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...

  7. C++程序设计原理与实践 习题答案 第二十六章 第26章习题答案

    第二十六章:测试 习题答案 本章的BinarySearch Binary_Search.h 26.2 26.2 测试集 26.3 26.4 26.5 26.8 and 26.9 26.8 测试集 26 ...

  8. C语言编程>第二十六周 ⑥ 请补充fun函数,该函数的功能是:按 “0”到 “9”统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。注意:不能使用字符串库函数。

    例题:请补充fun函数,该函数的功能是:按 "0"到 "9"统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中.注意:不能使用字符串库函数. ...

  9. 第二十六章 使用 CSP 进行基于标签的开发

    文章目录 第二十六章 使用 CSP 进行基于标签的开发 CSP 编译器 自动和手动页面编译 第二十六章 使用 CSP 进行基于标签的开发 CSP 允许使用标准 HTML 文件开发 CSP 应用程序. ...

最新文章

  1. 【廖雪峰python入门笔记】tuple_创建
  2. 简单的c语言课程设计管理类,C语言课程设计-学生成绩简单管理程序.doc
  3. 数据库被挂马的ASP处理方法
  4. Android Studio apk 打包流程
  5. pythontype函数使用_Python astype(np.float)函数使用方法解析
  6. Java基础篇2——运算符
  7. 设计模式---创建型模式
  8. 架构师要了解那些??
  9. 时至 2018 年,还有必要学 Vim 吗?
  10. 利用rsync+inotify搭建实时同步系统
  11. c++使用unordered_map与map的区别
  12. Linux学习笔记--终端命令
  13. [C语言]排序问题--我的解答
  14. 16进制发送 mqtt客户端调试工具_MQTT客户端调试工具(MQTT Simulate Device)
  15. matlab中的方波信号图片_哈工大、哈工程MATLAB被禁用,这个国产软件号称可替代!...
  16. 35KV变电站及10KV供配电系统倒闸操作屏QY-PGD09
  17. nyoj素数环(dfs)
  18. 【原创】objdump 的使用
  19. nginxweb服务器搭建
  20. CopyWebpackPlugin的ignore

热门文章

  1. 操作系统调度算法--高响应比优先调度算法解析
  2. OpenCV中值滤波器详解及代码实现
  3. ctfshow 网络迷踪-你的名字+噶即正义
  4. 寒假日报(1.18)
  5. PostgreSQL最后的救命稻草 — pg_resetwal
  6. android课程设计计步器,数字计步器课程设计.doc
  7. Windows+Visual stdio+CUDA编程方式及测试
  8. 极简工具,Tekla二次开发--构件图标注工具
  9. json格式的数据转化为字符串
  10. “降维算法”面试知识点总结-PCA+LDA算法-百面机器学习系列4