学习笔记:欧拉函数与欧拉定理
欧拉函数与欧拉定理
欧拉函数
定义
欧拉函数,即 ,表示的是小于等于 和 互质的数的个数。
比如说 。
当 n 是质数的时候,显然有 。
性质
-
欧拉函数是积性函数。
积性是什么意思呢?如果有 ,那么 。
特别地,当 是奇数时 。
-
。
如果 ,那么 。
如果我们设 表示 的数的个数,那么 。
根据上面的证明,我们发现,,从而 。注意到约数 和 具有对称性,所以上式化为 。证毕。
-
若 ,其中 是质数,那么 。
(根据定义可知) -
由唯一分解定理,设 ,其中 是质数,有 。
引理:设 为任意质数,那么 。
证明:显然对于从 1 到 的所有数中,除了 个 的倍数以外其它数都与 互素,故 ,证毕。
接下来我们证明 。由唯一分解定理与 函数的积性。
证毕。
实现
如果只要求一个数的欧拉函数值,那么直接根据定义质因数分解的同时求就好了。这个过程可以用 Pollard Rho 算法优化。
int euler_phi(int n) {
int m = int(sqrt(n + 0.5)), ans = n;
for(int i = 2 ; i <= m ; i ++)
if (n % i == 0){
ans = ans / i * (i - 1);
while(n % i == 0)n /= i;
}
if(n > 1)ans = ans / n * (n - 1);
return ans;
}
如果将上面的程序改成如下形式,会提升一点效率:
int euler_phi(int n){
int ans = n;
for(int i = 2 ; i * i <= n ; i ++)
if(n % i == 0){
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1)ans = ans / n * (n - 1);
return ans;
}
如果是多个数的欧拉函数值,可以利用线性筛来求得。
注意到在线性筛中,每一个合数都是被最小的质因子筛掉。比如设 是 的最小质因子,,那么线性筛的过程中 通过 筛掉。
观察线性筛的过程,我们还需要处理两个部分,下面对 分情况讨论。
如果 ,那么 包含了 的所有质因子。
那如果 呢,这时 和 是互质的,根据欧拉函数性质,我们有:
for(int i = 1 ; i <= 1145141919810 ; i ++)isp[i] = 1;
int cnt = 0, isp[1] = 0;phi[1] = 1;
for(int i = 2 ; i <= 1145141919810 ; i ++){
if(isp[i] != 0){
cnt++;pri[cnt] = i;
phi[i] = i - 1;
}
for(int j = 1 ; j <= cnt && i * pri[j] <= 1145141919810 ; j ++){
isp[i * pri[j]] = 0;
if (i % pri[j] != 0)
phi[i * pri[j]] = phi[i] * phi[pri[j]];
else{
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
}
}
欧拉定理
定义
若 ,则 。
证明
实际上这个证明过程跟上文费马小定理的证明过程是非常相似的:构造一个与 互质的数列,再进行操作。
设 为模 意义下的一个简化剩余系,则 也为模 意义下的一个简化剩余系。所以 ,可约去 ,即得 。
当 为素数时,由于 ,代入欧拉定理可立即得到费马小定理。
扩展欧拉定理
定义
解释
读者可能对第二行产生疑问,这一行表达的意思是:如果 的话,就不能降幂了。
主要是因为题目中 不会太大,而如果 ,自然复杂度是可以接受的。而如果 的话,复杂度可能就超出预期了,这个时候我们才需要降幂来降低复杂度。
证明
直观理解
需要知道的是,在 的条件下, 的取值范围一定在 ,而 ,那么对于任意一个数 ,那么很容易就能知道它的 后继,在有限的空间内这一定会形成一个循环。
在扩展欧拉定理中,循环分为纯循环和混循环。其中纯循环中不存在节点有两个前驱,而混循环则反之。而 形成的序列可以是一个混循环,那么只需要知道循环节的长度,和前面那一小段未进入循环节的长度,就可以根据这个性质来进行降幂了。
值得注意的是,无论是费马小定理,还是(扩展)欧拉定理,一个很重要的应用就是降幂,从而将不可能的表达式化为可能。
形式证明
-
命题: 的从 次, 次到 次幂模 构成的序列中,存在 和 ,使得前 个数(即从 到 )互不相同,从第 个数开始,每 个数就循环一次。
证明:
-
由鸽巢定理易证。
我们把 称为 幂次模 的循环起始点, 称为循环长度(注意: 可以为 )。
用公式表述为:。
证毕。
-
-
命题: 为素数的情况,该式成立。
证明:
-
若模 不能被 整除,而因为 是一个素数,那么 成立,根据欧拉定理,容易证明该式成立。
-
若模 能被 整除,那么存在 和 使得 ,且 成立。所以根据欧拉定理有 。
又由于 ,所以根据欧拉函数的求值规则,容易得到:,即我们有:。
所以 ,即 ,两边同时乘以 ,得 (因为 )
所以对于 中素因子 的次数 满足:。我们可以简单变换形式,得到 推论:
又由于 ,所以 (tips: 是素数,最小是 ,而 )。
所以因为 ,故有:
所以
即 。
证毕。
-
-
命题: 为素数的幂的情况,该式成立。
证明:
-
不妨令 ,是否依然有 ?
答案是肯定的,由命题 1 可知存在 使得 ,所以 ,所以令 时,我们能有 。
此时有关系: 且 ,且 ,由 与 的关系,依然可以得到 。
证毕。
-
-
命题: 为合数的情况,该式成立。
证明:
-
只证 拆成两个素数的幂的情况,大于两个的用数学归纳法可证。
设 ,其中 ,而 的循环长度为 ;
则 ,由于 ,那么 ,所以 ,;
由 与 的关系,依然可以得到 。
证毕。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!