程序技术好文:欧几里德算法

简介: 程序技术好文:欧几里德算法

欧几里德算法


欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:


定理:gcd(a,b) = gcd(b,a mod b)


证明:a可以表示成a = kb + r,则r = a mod b


假设d是a,b的一个公约数,则有


d|a, d|b,而r = a - kb,因此d|r


因此d是(b,a mod b)的公约数


假设d 是(b,a mod b)的公约数,则


d | b , d |r ,但是a = kb +r


因此d也是(a,b)的公约数


因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证


--------------------------------------------//代码效果参考:http://www.lyjsj.net.cn/wz/art_24111.html

---------------------

模P乘法逆元


对于整数a、p,如果存在整数b,满足ab mod p =1,则说,b是a的模p乘法逆元。


定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1


证明:


首先证明充分性


如果gcd(a,p) = 1,根据欧拉定理,aφ(p) ≡ 1 mod p,因此


显然aφ(p)-1 mod p是a的模p乘法逆元。


再证明必要性


假设存在a模p的乘法逆元为b


ab ≡ 1 mod p


则ab = kp +1 ,所以1 = ab - kp


因为gcd(a,p) = d


所以d | 1


所以d只能为1


-----------------------------------------------------------------------


扩展欧几里德算法


扩展欧几里德算法不但能计算(a,b)的最大公约数,而且能计算a模b及b模a的乘法逆元,用C语言描述如下:


intgcd(inta,intb,int&ar,int&br)


{


intx1,x2,x3;


inty1,y2,y3;


intt1,t2,t3;


if(0==a)


{//有一个数为0,就不存在乘法逆元


ar=0;


br=0;


returnb;


}


if(0==b)


{


ar=0;


br=0;


returna;


}


x1=1;


x2=0;


x3=a;


y1=0;


y2=1;


y3=b;


intk;


for(t3=x3%y3;t3!=0;t3=x3%y3)

//代码效果参考: http://www.lyjsj.net.cn/wx/art_24109.html


{


k=x3/y3;


t2=x2-ky2;


t1=x1-ky1;


x1=y1;


x1=y2;


x3=y3;


y1=t1;


y2=t2;


y3=t3;


}


if(y3==1)


{


//有乘法逆元


ar=y2;


br=x1;


return1;


}else{


//公约数不为1,无乘法逆元


ar=0;


br=0;


returny3;


}


}


扩展欧几里德算法对于最大公约数的计算和普通欧几里德算法是一致的。计算乘法逆元则显得很难明白。我想了半个小时才想出证明他的方法。


首先重复拙作整除中的一个论断:


如果gcd(a,b)=d,则存在m,n,使得d = ma + nb,称呼这种关系为a、b组合整数d,m,n称为组合系数。当d=1时,有 ma + nb = 1 ,此时可以看出m是a模b的乘法逆元,n是b模a的乘法逆元。


为了证明上面的结论,我们把上述计算中xi、yi看成ti的迭代初始值,考察一组数(t1,t2,t3),用归纳法证明:当通过扩展欧几里德算法计算后,每一行都满足a×t1 + b×t2 = t3


第一行:1 × a + 0 × b = a成立


第二行:0 × a + 1 × b = b成立


假设前k行都成立,考察第k+1行


对于k-1行和k行有


t1(k-1) t2(k-1) t3(k-1)


t1(k) t2(k) t3(k)


分别满足:


t1(k-1) × a + t2(k-1) × b = t3(k-1)


t1(k) × a + t2(k) × b = t3(k)


根据扩展欧几里德算法,假设t3(k-1) = j t3(k) + r


则:


t3(k+1) = r


t2(k+1) = t2(k-1) - j × t2(k)


t1(k+1) = t1(k-1) - j × t1(k)



t1(k+1) × a + t2(k+1) × b


=t1(k-1) × a - j × t1(k) × a +


t2(k-1) × b - j × t2(k) × b


= t3(k-1) - j t3(k) = r


= t3(k+1)


得证


因//代码效果参考:http://www.lyjsj.net.cn/wz/art_24107.html

此,当最终t3迭代计算到1时,有t1× a + t2 × b = 1,显然,t1是a模b的乘法逆元,t2是b模a的乘法逆元。
相关文章
|
2天前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
|
3天前
|
传感器 算法
技术心得记录:四元数及姿态解算Mahony算法
技术心得记录:四元数及姿态解算Mahony算法
|
3天前
|
机器学习/深度学习 算法 数据可视化
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
|
3天前
|
存储 算法 Python
技术心得记录:大整数算法【10】Comba乘法(实现)
技术心得记录:大整数算法【10】Comba乘法(实现)
|
3天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
|
3天前
|
机器学习/深度学习 并行计算 搜索推荐
程序技术好文:桶排序算法及其Java实现
程序技术好文:桶排序算法及其Java实现
|
3天前
|
算法
技术好文共享:算法之树表的查找
技术好文共享:算法之树表的查找
|
5天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
26 8
|
7天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
8天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。