扩展Euclidean算法求乘法逆原理详解与算法实现

article/2025/9/18 7:13:27

【利用扩展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) 1 7 − 1 17^{-1} 171 mod 101
(2) 35 7 − 1 357^{-1} 3571 mod 1234
(3)计算 gcd(57,93),并找出整数s和t,使得57s+93t=gcd(57,93)
(4)求解下列同余方程组
X ≡ 12 ( m o d 25 ) X≡12(mod 25) X12(mod25)
X ≡ 9 ( m o d 26 ) X≡9(mod 26) X9(mod26)
X ≡ 23 ( m o d 27 ) X≡23(mod 27) X23(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.

image-20211220010607958

image-20211220010512910


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。

image-20211220013815877


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,通过验算可知,结果正确。

image-20211220021620909


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 ≡ a 1 ( m o d m 1 ) x≡a1(modm1) xa1(modm1)

x ≡ a 2 ( m o d m 2 ) x≡a2(modm2) xa2(modm2)

其实这个可以写成以下形式
x − y 1 ∗ m 1 = a 1 x−y1∗m1=a1 xy1m1=a1

x − y 2 ∗ m 2 = a 2 x−y2∗m2=a2 xy2m2=a2

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

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

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

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


http://chatgpt.dhexx.cn/article/3OoTrs7O.shtml

相关文章

NEO4J-相似度算法04-欧几里得距离算法(euclidean)应用场景简介

说明&#xff1a;使用neo4j算法库时需引入跟neo4j数据库对应的算法库插件或自定义算法库 1.简介 欧几里德距离算法原理是计算n维坐标系中点与点之间地距离&#xff0c;如在三维坐标系中点A(p1,p2,p3),点B(q1,q2,q3),两个点之间得距离则为 &#xff1a;, 如果在n维坐标系中&…

欧几里德算法、拓展欧几里德、中国剩余定理

目录 欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff08;辗转相除法&#xff09;拓展欧几里德算法中国剩余定理作业1&#xff1a;作业2&#xff1a; 欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff08;辗转相除法&#xff09; 欧几里德…

logit回归模型_一文读懂条件Logistic回归

在医学研究中,为了控制一些重要的混杂因素,经常会把病例和对照按年龄,性别等条件进行配对,形成多个匹配组。各匹配组的病例数和对照人数是任意的,比如一个病例和若干个对照匹配即1:1,在医学上称作“1:1病历对照研究”,常见还有1:M(M <=3),即1个病例和1或2或3个对照…

目标检测-定位蒸馏:logit蒸馏与feature蒸馏之争

定位蒸馏 &#xff08;LD, CVPR 2022&#xff09; 先上我们文章和代码&#xff1a; 论文标题&#xff1a; Localization Distillation for Dense Object Detection 论文地址&#xff1a; https://arxiv.org/abs/2102.12252 代码地址1&#xff1a; https://github.com/HikariTJU…

biogeme-nest_logit-cnblog

biogeme-nest_logit 基础数据&#xff1a; optima.dat 变量的描述&#xff1a;出处 OccupStat&#xff1a;职业TimePT&#xff1a;公共交通通行时间TimeCar&#xff1a;小汽车通行时间MarginalCostPT&#xff1a;公共交通总成本CostCarCHF&#xff1a;小汽车的总汽油成本dis…

必看 logit回归分析步骤汇总

Logit回归分析用于研究X对Y的影响&#xff0c;并且对X的数据类型没有要求&#xff0c;X可以为定类数据&#xff08;可以做虚拟变量设置&#xff09;&#xff0c;也可以为定量数据&#xff0c;但要求Y必须为定类数据&#xff0c;并且根据Y的选项数&#xff0c;使用相应的数据分析…

PyTorch logit函数

1.PyTorch vs TensorFlow tensorflow是静态图&#xff0c;需要你把啥都准备好&#xff0c;然后它像个傻子一样执行&#xff0c;tensorflow&#xff0c;目前业界更适合部署&#xff0c;毕竟是静态图&#xff0c;infer的时候速度快。 pytorch&#xff0c;它会在执行的时候&…

logit回归模型_详解 Logit/Probit 模型中的 completely determined 问题

NEW!连享会推文专辑:Stata资源 | 数据处理 | Stata绘图 | Stata程序结果输出 | 回归分析 | 时间序列 | 面板数据 | 离散数据交乘调节 | DID | RDD | 因果推断 | SFA-TFP-DEA文本分析+爬虫 | 空间计量 | 学术论文 | 软件工具 连享会学习群-常见问题解答汇总:👉 WD 主页…

Logit Adjust

Logit Adjust BER 我们在分类问题中常用的误分类函数使得分类器最终学到的分布&#xff1a; P ( y ∣ x ) ∝ P ( y ) P ( x ∣ y ) P(y|x) \propto P(y)P(x|y) P(y∣x)∝P(y)P(x∣y) 假设在一个不平衡猫狗二分类问题中&#xff0c;狗是一个小类&#xff0c;只有整个数据集的…

logit

1.为什么需要logit回归? 线性回归不稳健 异常点对拟合直线的影响很大 so linear不适合做分类问题 2.为什么要sigmoid&#xff1f;sigmoid能做什么&#xff1f; y0&#xff0c;1是离散问题,直接建立方程 函数不连续——损失函数不可导——参数无法用梯度法优化 所以我们由 …

Logit 是怎么算的?

从知乎借几张图来描述&#xff0c;先看看odds 是什么&#xff1f; 然后Logit 就 是 Log of odds&#xff1a;

【计算机网络学习笔记】(汇总目录)

计算机网络学习笔记&#xff08;汇总目录&#xff09; 文章目录 点击以下标题&#xff0c;跳转到对应章节的详细讲解 【计算机网络学习笔记01】计算机网络概述&#xff08;上&#xff09; 【计算机网络学习笔记02】计算机网络概述&#xff08;中&#xff09; 【计算机网络学习…

计算机网络期末总结复习(全)

文章目录 第一章:概述1.1、计算机网络在信息时代的作用我国互联网发展状况1.2、因特网概述1、网络、互连网(互联网)和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成补充:1.3 三种交换方式1、电路交换(Circuit Switching)2、分组交换(Packet Switc…

计算机网络的应用领域有那些,计算机网络应用领域

描述 计算机网络应用领域 一、计算机网络在现代企业中的应用 计算机网络的发展和应用改变了传统企业的管理模式和经营模式。在现代企业中企业信息网络得到了广泛的应用。它是一种专门用于企业内部信息管理的计算机网络,覆盖企业生产经营管理的各个部门,在整个企业范围内提供硬…

《王道计算机网络》学习笔记总目录+思维导图

0.思维导图 本篇文章是对《2021王道计算机网络》所有知识点的笔记总结归档&#xff0c;虽说是2021年的&#xff0c;但是这些都是最核心的底层基础知识&#xff0c;过多少年都不会有很大的变化&#xff0c;核心都差不多。我的武功秘籍&#xff1a;note.bithachi.cn&#xff0c;…

计算机必备学习网站

目录 1 论文代码网站 &#xff08;1&#xff09;Github&#xff1a;www.github.com/ &#xff08;2&#xff09;Papers With Code&#xff1a;https://paperswithcode.com/ &#xff08;3&#xff09;researchcode&#xff1a;Research Code &#xff08;4&#xff09;sema…

内联函数的使用与引用

内联函数的执行过程与带参数宏定义很相似&#xff0c;但参数的处理不同。带参数的宏定义并不对参数进行运算&#xff0c;而是直接替换&#xff1b;内联函数首先是函数&#xff0c;这就意味着函数的很多性质都适用于内联函数&#xff0c;即内联函数先把参数表达式进行运算求值&a…

内联函数的意义和使用

1. 内联函数 在C中我们通常定义以下函数来求两个整数的最大值&#xff1a; 复制代码 代码如下: int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个函数的好处有&#xff1a; ① 阅读和理解函数 max 的调用&#xff0c;要比读一条等价的条件表达…

内联函数和类-初阶

目录 前言 一、内联函数 二、typeid 三、范围for的使用 四、nullptr 五、类 六、class和访问限定符 总结 前言 多多重复&#xff0c;百炼成钢&#xff01;&#xff01;&#xff01; 一、内联函数 用inline修饰的函数叫内联函数-在编译时C编译器会在函数的位置展开&#xff0c;…

内联函数——C++

内敛函数的定义&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率 &#xff08;它是以空间换取时间的方式提高效率&#xff0c;这里的空间指的…