【利用扩展Euclidean算法求乘法逆】

1. Equipment

(1) operating system version :WIN 10

(2) CPU instruction set: x 64

(3) software :Visual Studio 2019

2. process
  • Problem background analysis

利用扩展Euclidean算法计算下列的乘法逆:
(1) 17−117^{-1}17−1 mod 101
(2) 357−1357^{-1}357−1 mod 1234
(3)计算 gcd(57,93),并找出整数s和t,使得57s+93t=gcd(57,93)
(4)求解下列同余方程组
X≡12(mod25)X≡12(mod 25) X≡12(mod25)
X≡9(mod26)X≡9(mod 26) X≡9(mod26)
X≡23(mod27)X≡23(mod 27) X≡23(mod27)

​采用扩展欧几里得算法求解乘法逆元,通过学习可知,扩展欧几里得算法除了计算a、b两个整数的最大公约数,此算法还能找到整数x、y(其中一个很可能是负数),即得到ax+by=gcd(a,b)的整数解。若 a * x == 1mod p,则称x为a关于模p的乘法逆元。

  • Solution

code:先分别编写所需的函数部分

#include<iostream>
using namespace std;
/** @Author:timerring* @Date: 2021-11-19 12:41:32* @LastEditTime: 2021-11-21 23:12:45* @FilePath:c:\Users\timerring\Euclidean.cpp*/
int exgcd(int a, int b, int& x, int& y) {//定义扩展欧几里得算法if (b == 0){//最里面ax+0=a的情况x = 1;y = 0;return a;}//通过递归的方法进到最里层确定x,y的值,从逐步到外层计算出x,yint d = exgcd(b, a % b, x, y);//x==y1,y==x1-a/b*y1int temp = x;x = y;y = temp - a / b * y;return d;
}
int gcd(int a, int b) {//定义欧几里得算法if (a % b == 0) {return b;}return gcd(b, a % b);
}
bool linearEquation(int a, int b, int c, int& x, int& y)
{//定义求解线性等式int d = exgcd(a, b, x, y);if (c % d) return false;int k = c / d;x *= k; y *= k;//求的只是其中一个解return true;
}
int inverse(int a, int p) {//定义求逆元的方法int x, y, gcd;gcd = exgcd(a, p, x, y);if (gcd == 1) {//确保x为正数x = (x % p + p) % p;return x;}else {cout << "a,p不互质";return 0;}
}

运行结果:


1.对于(1)(2)题,可以直接采取调用inverse函数的方法求解其逆元:

int main() {//求解ax + py = gcd(a,p) = 1int a, p;cout << "请输入 a p" << endl;cin >> a >> p;cout << "a mod p的乘法逆元是" << inverse(a, p);return 0;
}

由结果可知,17mod101的逆元是6,357mod1234的逆元是1075.


2.对于(3)题,可以使用linearEquation函数完成对于线性等式a * s + p * t = gcd(a,p)的求解。

int main() {//求解ax + py = gcd(a,p)int a, p, x, y, temp;cout << "请输入对应的a和p:" << endl;cout << "(a * s + p * t = gcd(a,p))" << endl;cin >> a >> p;temp = gcd(a, p);linearEquation(a, p, temp, x, y);cout << "对应的s和t是" << "\ns = "<<x <<"\nt = "<<y;return 0;
}

由结果可知,求解得s = -13,t = 8。


3.对于(4)题求解同余方程组,可以采用不断合并方程的方式完成求解。

int main()
{int n, b1, m1;bool tf = true;printf("请输入方程组的个数:");scanf("%lld", &n);printf("请分别输入方程组的参数:\n");scanf("%lld%lld", &b1, &m1);for (int u = 2; u <= n; u++){int b2, m2;scanf("%lld%lld", &b2, &m2);int A, B, x, y, dd = b2 - b1;A = m1, B = m2;int d = exgcd(A, B, x, y);if (dd % d != 0) { printf("no solution!"); return 0; }x = (x * (dd / d) % (B / d) + (B / d)) % (B / d);b1 = m1 * x + b1;m1 = m1 * m2 / d;}if (tf == false) printf("no solution!");else printf("方程组的解为:%d\n", b1);return 0;
}

由结果可知,同余方程组的解为14387,通过验算可知,结果正确。


3. summary and harvest

我对扩展欧几里得算法及其多种的应用更加熟练了,也让我对它的理解更加全面,例如对于ax mod p = 1,x就是a 在mod p乘法群的乘法逆元,通过拓展欧几里得算法,得到ax + py = gcd(a,p),因为a属于模p乘法群,所以a<p,所以a与p互素,则有gcd(a,p)=1,即 ax + py = 1。同时两边求mod p,即有 ax = 1(mod p),即此时的x就是乘法逆元,通过这种方法就可以求出其乘法逆元。

​ 在写代码时,我通过递归的方法实现了欧几里得算法的编写,其实算法的实现原理就是,有两个整数a,b,每次一个数字r = a % b,然后把b放到a的位置,把r放到b的位置,递归调用实现。结束条件是当 a%b == 0的时候停止。受到编写欧几里得算法时的启发,我发现扩展欧几里得的算法或许可以通过递归的方式求解,大概在纸上写了基础逻辑之后,我就用C++通过递归的方法进到最里层确定x,y的值,从逐步到外层计算出x,y的值。

​ 求解线性方程时,由于 ax+by=c有解 => c=k*gcd(a,b)=kd,我们先考虑求解 ax+by=d,由欧几里得算法,d=bx’+(a mod b)y’=bx’+(a-[a/b]b)y’=ay’+b(x’-[a/b])y’ ,则由上述式子,我们可以得出 x=y’ ,y=x’-[a/b]y’,即可得到这对解。

​ 求解同余方程组时我是采用合并的方式实现的。例如我们观察两个同余方程
x≡a1(modm1)x≡a1(modm1) x≡a1(modm1)

x≡a2(modm2)x≡a2(modm2) x≡a2(modm2)

其实这个可以写成以下形式
x−y1∗m1=a1x−y1∗m1=a1 x−y1∗m1=a1

x−y2∗m2=a2x−y2∗m2=a2 x−y2∗m2=a2

两个式子相减可以得到
y1∗m1−y2∗m2=a2−a1y1∗m1−y2∗m2=a2−a1 y1∗m1−y2∗m2=a2−a1
然后这里m1,m2,(a2−a1)都是已知的,所以可以当一个不定方程来解,这样的话就可以解出一个y1,带入原式就可以得到一个可能的x0,x0仅仅满足下面这个式子x=x0+k∗lcm(m1,m2)
这个又可以看成一个新的同余方程
x≡x0(mod[m1,m2])x≡x0(mod[m1,m2]) x≡x0(mod[m1,m2])
然后如果满足这个方程就可以满足那两个方程了,就成功地将两个方程合为一个,一直合下去就可以得到一个唯一的不定方程,求解即可。

初学信息安全,可能存在错误之处,还请各位不吝赐教。

受于文本原因,本文相关算法实现工程无法展示出来,现已将资源上传,可自行点击下方链接下载。

扩展Euclidean算法求乘法逆原理详解与算法实现工程文件

扩展Euclidean算法求乘法逆原理详解与算法实现相关推荐

  1. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  2. Hector SLAM 原理详解、算法解析

    目录 1.原理详解 2.算法解析 1.原理详解 Hector整体算法很直接,就是将激光点与已有的地图"对齐",即扫描匹配.扫描匹配就是使用当前帧与已经有的地图数据构建误差函数,使用 ...

  3. Nacos如何实现Raft算法与Raft协议原理详解

    前言 大名鼎鼎的Paxos算法可能不少人都听说过,几乎垄断了一致性算法领域,在Raft协议诞生之前,Paxos几乎成了一致性协议的代名词.但是对于大多数人来说,Paxos算法太难以理解了,而且难以实现 ...

  4. 多目标遗传算法NSGA-II原理详解及算法实现

    在接触学习多目标优化的问题上,经常会被提及到多目标遗传算法NSGA-II,网上也看到了很多人对该算法的总结,但真正讲解明白的以及配套用算法实现的文章很少,这里也对该算法进行一次详解与总结.会有侧重点的 ...

  5. RSA密码原理详解及算法实现(六步即可掌握)

    一.RSA算法概述 rsa算法是一种非对称加密算法,其安全性是建立在大素数难以分解的基础上的,即将两个大素数相乘十分容易,但想对其乘积进行分解却很困难,所以可以将其乘积公开作为加密密钥 二.RSA算法 ...

  6. 强化学习之原理详解、算法流程及Python代码

    开头先附上强化学习(reinforcement learning)的学习视频:https://morvanzhou.github.io/tutorials/machine-learning/reinf ...

  7. TEB算法1-teb原理详解

    1.TEB概述 1.1论文 TEB local planner 原论文:Trajectory modification considering dynamic constraints of auton ...

  8. 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  9. 激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解

    相关文章 梯度下降算法.随机梯度下降算法.动量随机梯度下降算法.AdaGrad算法.RMSProp算法.Adam算法详细介绍及其原理详解 反向传播算法和计算图详细介绍及其原理详解 激活函数.Sigmo ...

最新文章

  1. Mac-远程连接Mac
  2. CycleGAN非配对图像生成,定制你的卡通照
  3. eventbus使用_Android EventBus框架的使用介绍
  4. JMetro版本11.6和8.6发布
  5. Elasticsearch(六) java代码操作Es进行高级查询match、match_all
  6. phash图像识别应用
  7. 2017 开源软件排行_2017年开源大会精选
  8. CCF201409-1 相邻数对
  9. Coinlist将在4月1日到3日举行Rally(RLY)代币销售
  10. 由于连接方在一段时间后没有正确答复或连接的主机_新风换气机使用效果不佳,为何?掌握正确使用方法就好了...
  11. 活动推荐 | 首届“中新人工智能高峰论坛”,与周志华、李德毅等大咖对话未来...
  12. c语言程序设计火车站售票系统,C语言程序-火车站售票系统程序
  13. php 版onvif 客户端,onvif协议网络摄像机(IPC)客户端程序
  14. 一个在线QQ客服代码分析
  15. 清洁机器人--屏幕显示LCD方案之MCU SPI 接口驱动ST7789 LCD显示
  16. 面试题,微信红包为啥不能撤回?
  17. python抓取网站访客手机号_网站获取访客QQ系统
  18. 树莓派系统安装和环境配置
  19. 浏览器显示“您与此网站之间建立的连接不安全”的解决方案
  20. jquery打印html页面自动分页,jQuery打印指定区域Html页面并自动分页

热门文章

  1. scratch二次开发(一)
  2. 电脑软件打开出现闪退的问题
  3. 数据分析从零到精通第三课 python自动化和BI数据可视化实战
  4. 利用 python numpy +matplotlib 绘制股票k线图
  5. 项目管理-5大过程组-10大知识领域-47过程
  6. 联想ThinkServer RS260服务器静音降噪改造及CentOS拷机测试
  7. CPU的构架之ARM和Intel的区别(x86/x64/ARM64/ARM)
  8. 深度学习模型评价标准
  9. 2021年全球圆锥破碎机收入大约1357.4百万美元,预计2028年达到1665.6百万美元
  10. IBL(二) IBL中Specular 和Diffuse的计算(ReflectProbe 和 LightProbe)