欧拉函数算法的实现

简介: 欧拉函数算法的实现

对于正整数nn,欧拉函数是小于或等于nn的正整数中与nn互质的数的数目,记作φ(n)φ(n).

φ(1)=1φ(1)=1

求n的欧拉值

首先, 欧拉函数是一个积性函数,当m,nm,n互质时,φ(mn)=φ(m)∗φ(n)φ(mn)=φ(m)∗φ(n)

根据唯一分解定理知 n=pa11∗pa22∗…∗paxxn=p1a1∗p2a2∗…∗pxax

因此 φ(n)=φ(pa11)∗…∗φ(paxx)φ(n)=φ(p1a1)∗…∗φ(pxax)

对于任意一项 φ(pass)=pass−p(as−1)sφ(psas)=psas−ps(as−1)

从定义出发 φ(pass)φ(psas)等于小于或等于passpsas的正整数中与passpsas互质的数的数目

从11到passpsas中共有passpsas个数字

其中与passpsas不互质的有ps,2ps,…,psas−1∗psps,2ps,…,psas−1∗ps ,共psas−1psas−1项

所以 φ(pass)φ(psas) = passpsas - psas−1=pass∗(1−1ps)psas−1=psas∗(1−1ps)

因此

φ(n)=φ(pa11)∗…∗φ(paxx)
φ(n)=φ(p1a1)∗…∗φ(pxax)
=(pa11−p1a1−1)∗…∗(paxx−pxax−1)
=(p1a1−p1a1−1)∗…∗(pxax−pxax−1)
=pa11∗(1−1p1)∗pa22∗(1−1p2)∗…∗paxx∗(1−1px)
=p1a1∗(1−1p1)∗p2a2∗(1−1p2)∗…∗pxax∗(1−1px)
=pa11∗pa22∗…∗paxx∗(1−1p1)∗(1−1p2)∗…∗(1−1px)
=p1a1∗p2a2∗…∗pxax∗(1−1p1)∗(1−1p2)∗…∗(1−1px)
=n∗∏i=1x(1−1pi)

一.欧拉函数 O(a√∗n)O(a∗n)

对于一个大于1的自然数n来说,由算术基本定理可以将n分解为k个质数的乘积:n=pα11×pα22×…×pαkkn=p1α1×p2α2×…×pkαk

记欧拉函数为ϕ(n)ϕ(n),

欧拉函数ϕ(n)ϕ(n)解决的问题:求解1~n中与n互质的数的个数

互斥:对于两个数a与b,若a和b的公约数只有1时,称a和b互斥

欧拉函数的具体公式:ϕ(n)=n×p1−1p1×p2−1p2×…×pk−1pkϕ(n)=n×p1−1p1×p2−1p2×…×pk−1pk

二.欧拉函数的证明:

证:

利用容斥原理来证明,如不懂,可以先看一下 小学数学:容斥原理

设sum为1~n中与n互斥

基本思路是去掉1~n中所有p1,p2,…,pk的倍数p1,p2,…,pk的倍数

①当p1,p2,…,pk的倍数集合没有交集时p1,p2,…,pk的倍数集合没有交集时

sum=n−np1−np2−…−npksum=n−np1−np2−…−npk

②当p1,p2,…,pk中的任意两个数的倍数集合拥有交集时p1,p2,…,pk中的任意两个数的倍数集合拥有交集时

这时在第①步时,会多减一次pi×pjpi×pj,所以需要加上一次pi×pjpi×pj

因此有sum=n−np1−np2−…−npk+np1×p2+np1×p3+…+npk−1×pksum=n−np1−np2−…−npk+np1×p2+np1×p3+…+npk−1×pk

依次类推有③,④,……

最后将n提出来,就可出现ϕ(n)=n×p1−1p1×p2−1p2×…×pk−1pkϕ(n)=n×p1−1p1×p2−1p2×…×pk−1pk的形式

证毕证毕

三.时间复杂度分析:

算法的瓶颈主要在分解质因数上,分解质因数的时间复杂度为O(a√)O(a),但由于有n组数据,所以时间复杂度为O(a√∗n)O(a∗n)

四.代码

#include
using namespace std;
int main()
{
int n;
cin>>n;
while(n–)
{
int a,res;
cin>>a;
res = a;
for(int i=2;i<=a/i;i++)
{
if(a%i0)
{
while(a%i0)
a/=i;
res = res / i*(i-1);
}
}
if(a>1) res = res /a*(a-1);
cout<<res<<endl;
}
return 0;
}


相关文章
|
3月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
155 67
|
5月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
54 3
|
6月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
7月前
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
7月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
8月前
|
算法 vr&ar
技术好文共享:遗传算法解决函数优化
技术好文共享:遗传算法解决函数优化
|
8月前
|
算法 C语言 Python
简单遗传算法优化简单一元函数(python)
简单遗传算法优化简单一元函数(python)
70 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
148 68

热门文章

最新文章