欧拉函数算法的实现

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

对于正整数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;
}


相关文章
|
1天前
|
机器学习/深度学习 算法 C语言
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
75 0
|
1天前
|
算法 Java vr&ar
保持无损连接和函数依赖的3NF合成算法(详细简介)期末必备
保持无损连接和函数依赖的3NF合成算法(详细简介)期末必备
8 0
|
1天前
|
机器学习/深度学习 算法 大数据
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
37 3
|
1天前
|
机器学习/深度学习 存储 算法
【程序员必须掌握的算法】【Matlab智能算法】GRNN神经网络-遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值
【程序员必须掌握的算法】【Matlab智能算法】GRNN神经网络-遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值
|
1天前
|
算法 Java C++
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
17 0
|
1天前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
15 0
|
1天前
|
算法 Java C++
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
22 0
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
1天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1

热门文章

最新文章