定义

111~NNN中与NNN互质的数的个数叫欧拉函数,记为φ(N)\varphi(N)φ(N)
对NNN分解质因数N=p1c1∗p1c1∗...∗pkckN=p_1^{c_1}*p_1^{c_1}*...*p_k^{c_k}N=p1c1​​∗p1c1​​∗...∗pkck​​
则有φ(N)=N∗(1−1p1)∗(1−1p2)∗...∗(1−1pk)\varphi(N)=N*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{p_k})φ(N)=N∗(1−p1​1​)∗(1−p2​1​)∗...∗(1−pk​1​)
特别的φ(1)=1\varphi(1)=1φ(1)=1


证明

首先显然111~NNN中与NNN互质的数就是
1−N1-N1−N中不与NNN含有相同质因子的数

那么先简单分析NNN只有两个质因子的情况
假设p,qp,qp,q为NNN的质因子
那么111~NNN中p的倍数有Np\frac{N}{p}pN​个,q的倍数有Nq\frac{N}{q}qN​个
我们自然要筛掉这些数N−Np−NqN-\frac{N}{p}-\frac{N}{q}N−pN​−qN​

但是注意到这里面p∗qp*qp∗q的倍数被减了两次
根据容斥原理,当然还要加回来
得N−Np−Nq+NpqN-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}N−pN​−qN​+pqN​

对这个式子稍作变换
N−Np−Nq+NpqN-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}N−pN​−qN​+pqN​
⇓\ \ \ \ \ \ \ \ \ \ \ \Downarrow           ⇓
N∗(1−1p−1q+1pq)N*(1-\frac{1}{p}-\frac{1}{q}+\frac{1}{pq})N∗(1−p1​−q1​+pq1​)
⇓\ \ \ \ \ \ \ \ \ \ \ \Downarrow           ⇓
N∗(1−1p)∗(1−1q)N*(1-\frac{1}{p})*(1-\frac{1}{q})N∗(1−p1​)∗(1−q1​)
只有两个质因数的情况证毕
到这里再用数学归纳法就可以拓展出上述得式子了


实现

根据上述函数定义式
可以得到一个在分解质因数时同时求解单个欧拉函数的方法
时间复杂度为O(N)O(\sqrt{N})O(N​)

int phi(int x)
{int res=x;for(int i=2;i*i<=x;++i){if(x%i==0){res=res/i*(i-1);while(x%i==0) x/=i;}}if(x>1) res=res/x*(x-1);return res;
}

当然我们还可以有递推打表的计算
类似埃式筛法
每枚举到一个质数,就更新他的所有倍数的phi值
复杂度约为O(NlogN)O(NlogN)O(NlogN)

void euler(int n)
{for(int i=1;i<=n;++i) phi[i]=i;for(int i=2;i<=n;++i){if(phi[i]==i)//发现一个质数for(int j=i;j<=n;j+=i)//处理("筛")他的倍数phi[j]=phi[j]/i*(i-1);}
}

既然有类似埃式筛的递推方法
那么自然也不会少了线性筛

利用线性筛递推求解phi需要用到欧拉函数的两个性质
1.若有p∣Np\mid Np∣N,且满足p2∣Np^2\mid Np2∣N,则φ(N)=φ(N/p)∗p\varphi(N)=\varphi(N/p)*pφ(N)=φ(N/p)∗p
2.若有p∣Np\mid Np∣N,且一定不满足p2∣Np^2\mid Np2∣N,则φ(N)=φ(N/p)∗(p−1)\varphi(N)=\varphi(N/p)*(p-1)φ(N)=φ(N/p)∗(p−1)
这两条性质会在接下来给出证明

线性筛中每个合数n只会被他的最小质因子p筛一次
于是我们利用这点从φ(N/p)\varphi(N/p)φ(N/p)递推到φ(N)\varphi(N)φ(N)

复杂度为O(N)O(N)O(N)

void Phi(int n)
{phi[1]=1;for(int i=2;i<=n;++i){if(!vis[i]) prim[++cnt]=i,phi[i]=i-1;for(int j=1;j<=cnt;++j){if(i*prim[j]>n) break;vis[i*prim[j]]=1;if(i%prim[j]==0){ phi[i*prim[j]]=phi[i]*prim[j]; break;}else phi[i*prim[j]]=phi[i]*phi[prim[j]];}}
}

欧拉函数的性质

1.∀N>1\forall N>1∀N>1,111~NNN中与NNN互质的数的和为N∗φ(N)/2N*\varphi(N)/2N∗φ(N)/2

证明

若有x∈[1,N]x\in[1,N]x∈[1,N]且gcd(N,x)=1(即N与x互质)gcd(N,x)=1(即N与x互质)gcd(N,x)=1(即N与x互质)
根据更相减损术有gcd(N,x)=gcd(N,N−x)gcd(N,x)=gcd(N,N-x)gcd(N,x)=gcd(N,N−x)

即111~NNN中与NNN互质的数是成对出现的,对称轴就是N/2N/2N/2
也就是说111~NNN中与NNN互质的数的平均值是N/2N/2N/2
而总和就是N∗φ(N)/2N*\varphi(N)/2N∗φ(N)/2
证毕


2.(1)当a,ba,ba,b互质时,有φ(a∗b)=φ(a)∗φ(b)\varphi(a*b)=\varphi(a)*\varphi(b)φ(a∗b)=φ(a)∗φ(b)
(2)对NNN分解质因数N=p1c1∗p1c1∗...∗pkckN=p_1^{c_1}*p_1^{c_1}*...*p_k^{c_k}N=p1c1​​∗p1c1​​∗...∗pkck​​,则有φ(N)=∏i=1kφ(pici)\varphi(N)=\prod_{i=1}^k\varphi(p_i^{c_i})φ(N)=∏i=1k​φ(pici​​)

证明

这里的两条性质其实是直接应用了积性函数的性质
什么是积性函数
如果当a,ba,ba,b互质时,有f(a∗b)=f(a)∗f(b)f(a*b)=f(a)*f(b)f(a∗b)=f(a)∗f(b),则f(x)为积性函数f(x)为积性函数f(x)为积性函数
上述(1)是直接应用了定义
而(2)中将N分解质因数,显然分解的每一项都两两互质
根据积性函数定义也不难得出上述式子


3.(1)若有p∣Np\mid Np∣N,且满足p2∣Np^2\mid Np2∣N,则φ(N)=φ(N/p)∗p\varphi(N)=\varphi(N/p)*pφ(N)=φ(N/p)∗p
(2)若有p∣Np\mid Np∣N,且一定不满足p2∣Np^2\mid Np2∣N,则φ(N)=φ(N/p)∗(p−1)\varphi(N)=\varphi(N/p)*(p-1)φ(N)=φ(N/p)∗(p−1)

证明

上述(1)中"若有p∣Np\mid Np∣N,且满足p2∣Np^2\mid Np2∣N"
说明N和N/p含有相同质因子
我们分析只含有两个质因子p和q的简单情况
φ(N)=N−Np−Nq+Npq\varphi(N)=N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}φ(N)=N−pN​−qN​+pqN​
φ(N/p)=Np−Np2−Npq+Np2q\varphi(N/p)=\frac{N}{p}-\frac{N}{p^2}-\frac{N}{pq}+\frac{N}{p^2q}φ(N/p)=pN​−p2N​−pqN​+p2qN​
二者相除商为p
用数学归纳法扩展出k个质因子的情况可以得到相同结果

上述(2)中 “若有p∣Np\mid Np∣N,且一定不满足p2∣Np^2\mid Np2∣N”
说明NNN和N/pN/pN/p一定互质
根据积性函数定义有φ(N)=φ(N/p)∗φ(p)\varphi(N)=\varphi(N/p)*\varphi(p)φ(N)=φ(N/p)∗φ(p)
因为p为素数,所以φ(p)=p−1\varphi(p)=p-1φ(p)=p−1
得φ(N)=φ(N/p)∗(p−1)\varphi(N)=\varphi(N/p)*(p-1)φ(N)=φ(N/p)∗(p−1)
证毕


4.∑d∣nφ(d)=n\sum_{d|n}\varphi(d)=n∑d∣n​φ(d)=n

证明

设f(n)=∑d∣nφ(d)=nf(n)=\sum_{d|n}\varphi(d)=nf(n)=∑d∣n​φ(d)=n
若有n,m互质,那么f(nm)=∑d∣nmφ(d)=∑d∣nφ(d)∗∑d∣mφ(d)f(nm)=\sum_{d|nm}\varphi(d)=\sum_{d|n}\varphi(d)*\sum_{d|m}\varphi(d)f(nm)=∑d∣nm​φ(d)=∑d∣n​φ(d)∗∑d∣m​φ(d)
可得f(n)f(n)f(n)为积性函数

对于n的某个质因子f(pk)=∑d∣pkφ(d)=φ(1)+φ(p)+φ(p2)+...+φ(pk)f(p^k)=\sum_{d|p^k}\varphi(d)=\varphi(1)+\varphi(p)+\varphi(p^2)+...+\varphi(p^k)f(pk)=∑d∣pk​φ(d)=φ(1)+φ(p)+φ(p2)+...+φ(pk)
由上述3.(1)知该式为一个等比数列+1公比为p
更具等比数列求和公式得f(pk)=pkf(p^k)=p^kf(pk)=pk

所以f(n)=∏i=1kf(pk)=∏i=1kpk=nf(n)=\prod_{i=1}^{k}f(p^k)=\prod_{i=1}^kp^k=nf(n)=∏i=1k​f(pk)=∏i=1k​pk=n
证毕


欧拉定理

定理:若正整数a,na,na,n互质,则有aφ(n)≡1(modn)a^{\varphi(n)}\equiv 1(\mod n)aφ(n)≡1(modn)

推论:若正整数a,na,na,n互质,则对于任意正整数b,有ab≡abmodφ(n)(modn)a^b\equiv a^{b\mod \varphi(n)}(\mod n)ab≡abmodφ(n)(modn)

扩展欧拉定理:
a,n∈Za,n\in Za,n∈Z,则aba^bab {ab,b<φ(n)abmodφ(n)+φ(n),b>=φ(n)\left\{\begin{aligned}a^b,b<\varphi(n)\\ a^{b\mod\varphi(n)+\varphi(n) },b>=\varphi(n)\end{aligned}\right.{ab,b<φ(n)abmodφ(n)+φ(n),b>=φ(n)​modn\mod nmodn

证明略

应用

给定三个正整数a,m,ba,m,ba,m,b,求abmodma^b\mod mabmodm
1≤a≤109,1≤b≤1020000000,1≤m≤1061≤a≤10^{9},1≤b≤10^{20000000},1≤m≤10^61≤a≤109,1≤b≤1020000000,1≤m≤106

直接套用上述定理

#include<iostream>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long lt;const int maxn=100010;
lt a,m,phi,rem;lt read()
{lt x=0;char ss=getchar();while(ss<'0'||ss>'9') ss=getchar();while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();if(x>=phi) rem=1,x%=phi;}return x;
}lt calc(lt x)
{lt res=x;for(int i=2;i*i<=x;++i){if(x%i==0){res=res/i*(i-1);while(x%i==0) x/=i;}}if(x>1) res=res/x*(x-1);return res;
}lt qpow(lt aa,lt k)
{lt res=1;while(k){if(k&1) res=(res*aa)%m;aa=(aa*aa)%m; k>>=1;}return res;
}int main()
{scanf("%d%d",&a,&m);phi=calc(m);lt b=read();if(rem) b+=phi;printf("%d",qpow(a,b));return 0;
}

欧拉phi函数—详解相关推荐

  1. 欧拉 phi 函数代码

    今天看算法导论 ,看到欧拉 phi 函数,发现可以对之前写过的代码进行优化,所以重写了一次代码. 欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) ...

  2. 欧拉phi函数与欧拉定理

    欧拉phi函数 欧拉phi(x)函数等于不超过x且和x互素的整数个数. 欧拉phi函数证明: 附代码: #include<stdio.h> #include<string.h> ...

  3. 学习欧拉phi函数的思考

    其正确性思考写在了代码片上 忘记一件事:欧拉phi函数的作用是用来求1~n中与n互素的数的个数 #include<cstdio> #include<cstring> #incl ...

  4. 欧拉 phi 函数的积性证明

    在数论,对正整数n,欧拉函数是小于或等于 n 的数中与 n 互素的数的数目. 若 m,n互素,那么 证明: 构造如图所示的矩阵,恰好包含 mn 个数. 则 phi(mn)是上述数字矩阵中与 mn 互素 ...

  5. FatFs文件系统Nandflash驱动函数详解

    FatFs文件系统Nandflash驱动函数详解 转载 2015-08-06 14:43:27 标签:nandflash驱动函数详fatfs文件系统nandfla 本文讲解FatFs文件系统 下需要的 ...

  6. mysqlsum绝对值_MySQL_MySQL笔记之数学函数详解,绝对值函数ABS(x)和圆周率函数P - phpStudy...

    MySQL笔记之数学函数详解 绝对值函数ABS(x)和圆周率函数PI() mysql> SELECT ABS(0.5), ABS(-0.5), PI(); +----------+------- ...

  7. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  8. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  9. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

最新文章

  1. 【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★
  2. setsockopt()函数使用详解
  3. python二分法递归_python 【递归 及 二分法】
  4. PMcff 020产品经理峰会现场火爆,干货不断
  5. 关于Exchang server 2010 MCITP
  6. Web前端培训分享:前端开源平台介绍
  7. 程序员如何应对中年危机?让编程变得不再重要
  8. 2018年排名Top 100的Java类库——在分析了277,975份源码之后得出的结论
  9. 模拟集成电路设计初学系列
  10. STM32的ucgui移植
  11. OpenGL ES2 0 – Iphone开发指引
  12. [项目实战篇] Emos在线办公小程序--环境搭建
  13. 论文查重究竟查的是什么?其核心算法是怎样的?
  14. walking机器人入门教程-工具-命令管理器
  15. Gym安装Atari环境(Windows,Linux适用)
  16. 基金使用计划 数学建模 matlab,基金使用计划(数学建模).ppt
  17. CSMA/CD协议(先听再说,边听边说)
  18. 认识动物宝宝早教APP隐私政策NEW
  19. 指针进阶(指针与数组传参、数组指针与指针数组、函数指针数组、回调函数的辨析)
  20. MySQL基础入门到精通学习教程汇总【基础+高级完整版】

热门文章

  1. 基于eBPF技术的开源项目Kindling之探针架构介绍
  2. python wifi探针_什么是wifi探针??
  3. 深度摄像头测距原理简介
  4. 20180711 F-Divisions
  5. 泡泡玛特启示录:如何让大众消费者染上收藏癖?【姜太公公】
  6. matlab中的导函数驻点,[MATLAB基础] 求驻点
  7. bootstrap-table模板(template)-返回表格-分页模板-分页插件
  8. ssh无密登录配置详解(hadoop集群搭建)
  9. CVPR2022 oral | MetaFormer才是探索Transformer的源泉,衍生PoolFormer速度喜人
  10. pcie转sata3硬盘不启动_minipcie固态硬盘8g系统加装sata硬盘系统启动不了。求大神解惑。...