扩展欧几里德算法与数论倒数

取模运算总结 - 数论 - 编程竞赛有相当一部分题目的结果过于庞大,整数类型无法存储,往往只要求输出取模的结果。 - 例如(a+b)%p,若a+b的结果我们存储不了,再去取模,结果显然不对,我们为了防止溢出,可以先分别对a取模,b取模,再求和,输出的结果相同。 - a mod b表示a除以b的余数。有下面的公式: - (a + b) % p = (a%p + b%p) %p - **(a - b) % p = ((a%p - b%p) 阅读详情


欧几里德算法是一个很古老但很有效的计算最大公约数的算法。这个算法很简单,用C++代码来表示就是:

int gcd(int a, int b)
{
    while(b != 0)
    {
        int c = a;
        a = b;
        b = c % b;
    }
    return a;
}


可以证明,对于给定的任意两个整数a和b,总是存在整数s和t,使得他们的最大公约数gcd(a, b)满足以下等式:

as+bt=gcd(a,b)

欧几里得算法只是单纯地求出gcd(a, b),而扩展欧几里得算法还可以求出等式中的整数s和t。
那求出的s和t有什么作用呢?
我们知道,密码学中经常会碰到需要求某个数a在模b下的数论倒数。也就是求满足下列等式的整数s
as+bt=1

实际上如果a和b互质,则gcd(a, b)=1,那么as+bt=gcd(a,b)可以转换为上式。
也就是说,扩展欧几里得算法可以用来计算数论倒数。

扩展欧几里德算法有递归跟非递归两种实现,这里我们介绍非递归形式的实现。

要以迭代的形式实现扩展欧几里德算法,关键是写出s和t的递推式。下面为了方便起见,我们假设a总是大于b的。
在欧几里德算法的迭代实现中,倒数第二次循环后我们就可以得到b = gcd(a, b)(最后一次循环是把b的值赋给a,返回a作为最终结果)。假设我们在每一次的循环中,都可以把b表示为

bi=a0si+b0ti,a0跟b0是指变量a和b的初始值
的形式,那么在倒数第二次循环后,我们就可以得到满足下式的s和t
gcd(a0,b0)=a0s+b0t

下面我们先直接给出b的递推公式:

bi=bi−2−⌊ai−1/bi−1⌋bi−1

为了方便表示,我们令 qi−1=⌊ai−1/bi−1⌋,则式子为
bi=bi−2−qi−1bi−1

要把这条公式改写成关于s和t的递推式,只要把
bi−1=a0si−1+b0ti−1
bi−2=a0si−2+b0sti−2

代入式中,即得:
bi=(si−2−qi−1si−1)a0+(ti−2−qi−1ti−1)b0

最终我们得到了s和t的递推式
si=si−2−qi−1si−1(i>1),s0=1,s1=0
ti=ti−2−qi−1ti−1(i>1),t0=0,t1=1

下面是利用扩展欧几里德算法求方程80∗s+46∗t=gcd(80,46)的解。

      


表格中倒数第二行中的-4跟7就是我们需要的结果。也就是−4×80+7×46=2=gcd(80,46)

在RSA算法中,扩展欧几里德算法用来求e在模φ(n)下的数论倒数,也就是求方程

de+kϕ(n)=gcd(e,ϕ(n))=1
中d的值,也就是上面递推式中的t。
利用上面推导出的递推公式,可以很容易地写出完整的代码。

下面是求数论倒数的C++实现:

int invert(int e, int f)
{
	int a = f, b = e, t1 = 0, t2 = 1;
	
	while(b != 0)
	{
		int t = a;
		a = b;
		int q = t / b;
		b = t % b;
		
		t = t1 - q * t2;
		t1 = t2;
		t2 = t;
	}
	
	if(t1 < 0)  //扩展欧几里得算法得到的结果可能为负数,所以需要把它“掰正”
		t1 += f;
	return t1;
}


下面是基于GMP实现的支持大整数运算的代码:

void invert(mpz_t rop, mpz_t e, mpz_t f)
{
	mpz_t a, b, t1, t2, t, q;
	mpz_init_set(a, f);  //a = f
	mpz_init_set(b, e);  //b = e
	mpz_init(t1);            //t1 = 0
	mpz_init_set_ui(t2, 1);  //t2 = 1
	mpz_init(t);
	mpz_init(q);

	while(mpz_cmp_ui(b, 0) != 0) //b != 0
	{
		mpz_set(t, a);  //t = a
		mpz_set(a, b);  // a = b
		mpz_fdiv_qr(q, b, t, b); 
		//q = t / b, b = t % b
		
		mpz_mul(t, q, t2);
		mpz_sub(t, t1, t);  //t = t1 - q * t2
		
		mpz_set(t1, t2); //t1 = t2
		mpz_set(t2, t);  //t2 = t
	}
	if(mpz_cmp_ui(t1, 0) < 0)
		mpz_add(t1, t1, f);
	mpz_set(rop, t1);	
}


欧几里得算法以及求倒数c源码 加密解密关于欧几里德算法以及欧几里德扩展算法(求倒数)的c源码 立即下载

相关推荐

RSA扩展欧几里德算法算例

RSA扩展欧几里德算法算例,说明RSA密钥计算过程.

中国剩余定理与拓展欧几里得算法

首先来看中国剩余定理:        中国剩余定理是古代求解一阶线性同余式的方法,如以下这个同余方程组求解x。                                                        中国剩余定理说明:假设整数m1,m2, ... ,mn两两互质,则对任意的整数:a1,a2, ... ,an,方程组 有解,并且通解可以用如下方式构造得到: 设 M...

yuzhixiaobo的博客 515

Anolis OS 23实战:5分钟搞定AI环境配置(含NVIDIA驱动一键安装)

本文详细介绍了如何在Anolis OS 23上快速配置AI开发环境,包括NVIDIA驱动的一键安装和TensorFlow、PyTorch等AI框架的部署。通过智能硬件适配引擎和优化后的二进制包,用户可在5分钟内完成传统需要数小时的配置工作,显著提升AI项目开发效率。

weixin_30335575的博客 536

数论倒数(逆元)——数论

数论倒数(又称逆元): 先来引入求余概念 : (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%p - b%p) %p (对) (a * b) % p = (a%p * b%p) %p (对) (a / b) % p = (a%p / b%p) %p (错) 除法的是错误的,举一个例子就可以明白了:(6/2)%4=...

学而不思则忘 5515

《数据结构》知识点汇总+算法代码总结【全】

写在前面:本文写于吴签时期,在家备考时刷完数据结构王道书之后想着把书中重点梳理汇总一下。本文内容包括但不局限于王道数据结构每章的知识点及其课后习题所涵盖的知识点。本人曾在大三期间打过一些程序设计类比赛,所以本文所涉及到的代码不一定局限于王道书,但思想都一样。 期末复习和备考408均可使用第一章:绪论(不在考研大纲但很重要)第二章:线性表第三章:栈和队列第四章:串第五章:树与二叉树第六章:图第七章:查找 第一章:绪论(不在考研大纲但很重要) 数据结构三要素:逻辑结构、存储结构、数据的运算;其中逻辑结构包括线

qq_44622401的博客 17万+

从理论到波形:NE555多谐振荡器设计与示波器实战验证

本文详细介绍了NE555多谐振荡器的设计原理与实战验证方法。从基础理论到电路参数计算,再到面包板搭建与示波器测量,全面解析如何利用NE555芯片实现稳定的方波输出。通过实际案例演示了频率调整、占空比优化等技巧,并提供了常见问题排查指南,帮助电子爱好者快速掌握这一经典电路设计。

weixin_29159613的博客 281

基本算法-欧几里德算法(辗转相除法)

本文介绍一种求解最大公约数常用的算法——欧几里德算法,以下是本篇文章正文内容,包括算法简介、原理及证明和C++代码实现。

翟天保的博客 2万+

AI 算力基础设施深度系列(一):从容器到 Kubernetes——算力底座的诞生

1. 容器 = Namespace(视图隔离) + Cgroup(资源限制) + Union FS(镜像分层)└── 不是虚拟机!共享内核,接近零开销2. K8S 三大设计哲学:└── 声明式 API + 控制循环 + 可扩展架构3. K8S 架构:└── 控制面 (API Server / etcd / Scheduler / Controller Manager)

warm3snow的博客 534

扩展欧几里得算法

一:欧几里得算法(辗转相除法)                        基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。 证明:        a可以表示成a = kb + r,则r = a mod b   假设d是a,b的一个公约数,则有   d|a, d|b,而r = a - kb,因此d|r

小囧子的博客 1439

【Unity人物动画】SALSA With RandomEyes (语音生成嘴型/人物说话) 使用

SALSA使用探索 之前做项目时想做人物说话的嘴部动作,因为我们的语音是AI合成的,语音片段很多,如果能根据语音生成嘴部动画,那将极大便利我们的工作。后面是找到了SALSA的这款插件,并摸索出使用方法。 1 插件介绍 官方网站:https://crazyminnowstudio.com/ 一个能做2D纸片人和3D人物模型嘴部和眼睛动画的插件,由两人组成的独立工作室(疯狂米诺工作室)开发。 插件全名为SALSA With RandomEyes,2014年上架Asset Store,目前是已下架,替换为新版本

里约热内驴的博客 1万+

AI翻译工具自动翻译日语视频生成srt中文字幕,支持离线轻松生成任意日语视频字幕!可选择支持显卡模式和cpu模式低显存也能用

【AI离线字幕神器:日语视频一键转中文字幕】推荐一款基于Faster-Whisper的本地化字幕工具,可离线生成日语视频的中文字幕(.srt格式),支持CPU/GPU加速处理。实测1小时视频最快4-5分钟完成翻译,无需联网保护隐私。操作简单只需拖拽文件,支持批量处理音频(mp3/wav)和视频(mp4/mkv)文件,还能自定义输出格式和参数调整。特别适合需要观看无字幕日语资料的用户,堪称技术宅必备神器。下载地址附后,包含详细使用教程和参数配置说明。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

欧几里德算法及其扩展欧几里德算法

欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数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

SMCwwh 1509

把 SAP OData 查询模式讲透:从 $select 到 $expand 的设计、实现与性能边界

摘要:本文深入探讨SAP生态中OData查询模式的核心设计与实现要点。文章指出,OData不仅是接口协议,更是HTTP、REST与数据模型的统一语言,其性能关键取决于查询选项($select、$filter等)的设计与实现质量。重点分析了$select的投影优化、$orderby的排序语义、$filter的数据库下推策略,以及$count的高效计数方法。通过具体示例和最佳实践,强调应将查询逻辑尽量下推至数据库层,避免在ABAP应用层处理大数据集,从而提升服务性能、降低资源消耗,实现Clean Core架构理

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 650

【数论】——逆元

转自:http://www.cnblogs.com/linyujun/p/5194184.html 数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真 先来引入求余概念 (a + b) % p = (a%p + b%p) %p (对) (a - b...

aaf76097的博客 146

# YOLOv11改进系列 | 引入仓库自研C3k2_EIEM模块,Sobel边缘分支增强检测细节表达

文章摘要: YOLOv11-seg改进中提出的C3k2_EIEM模块通过引入边缘信息增强机制,显著提升了模型对轮廓和纹理的感知能力。该模块在保持原有C3k2结构的基础上,创新性地结合了Sobel边缘检测分支与常规卷积分支的双路特征融合。核心改进包括:(1)固定Sobel算子提供稳定的梯度响应;(2)并行处理边缘与纹理特征;(3)通过1x1卷积实现特征融合。实验显示,改进后模型参数量增加14.16%,计算量提升12.5%,但显著增强了在复杂边界场景下的分割精度。这种设计特别适用于需要精细轮廓识别的任务,如商品

qq_44224801的博客 95

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

I - A/B

要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。 Input 数据的第一行是一个T,表示有T组数据。  每组数据有两个数n(0 &lt;= n &lt; 9973)和B(1 &lt;= B &lt;= 10^9)。 Output 对应每组数据输出(A/B)%9973。 Sample Input 2 ...

lihuanz的博客 237

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

acm数论之旅(转载) -- 逆元

ACM数论之旅6---数论倒数,又称逆元(我整个人都倒了( ̄﹏ ̄)) 数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真 先来引入求余概念 (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%...

denglianna3224的博客 150

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基础数论(逆元,费马小定理,扩展欧几里得,中国剩余定理)(模板)

  整理自:https://www.cnblogs.com/linyujun/category/784324.html 首先,引入同余定理: (a +  b) % p = (a%p +  b%p) %p  (对) (a  -  b) % p = (a%p  -  b%p) %p  (对) (a  *  b) % p = (a%p *  b%p) %p  (对) (a  /  b) % ...

September_的博客 669

数论 51Nod1079 中国剩余定理

1079 中国剩余定理 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K。例如,K % 2 = 1, K % 3 = 2, K % 5 = 3。符合条件的最小的K = 23。 Input 第1行:1个数N表示后面输入的质数及模的数量。(2 &lt;= N &lt;= 10) 第2 - N + 1...

OtterVのrecorder 291

ACM数论倒数(逆元)详解

ACM数论倒数(逆元)详解 此篇文章转载自:https://www.cnblogs.com/linyujun/p/5194184.html 欢迎给大佬捧场(ง •_•)ง 数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真 先来引入求余概念 (a + b) % p = (a%p + b%p) %p ...

画船听雨眠 1126

数论倒数(逆元)

ACM数论之旅6---数论倒数,又称逆元(我整个人都倒了( ̄﹏ ̄)) 转载:http://www.cnblogs.com/linyujun/p/5194184.html 数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真 先来引入求余概念 (a + b) % p =...

aboc43983的博客 112

第二十八章 数论——扩展欧几里德算法与线性同余方程

详细讲解欧几里得算法的证明和代码,同时详细介绍如何利用欧几里得算法解决线性同余方程。

Turing_Sheep的博客 1640

数论倒数——逆元

数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真   先来引入求余概念   (a +  b) % p = (a%p +  b%p) %p  (对) (a  -  b) % p = (a%p  -  b%p) %p  (对) (a  *  b) % p = (a%p *  b%p) %p  (对) (a

cross_yan的博客 1294

数论倒数--逆元详解

数论倒数,又称逆元 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真 inv(a*b) = inv(a) * inv(b) 先来引入求余概念 (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%p - b%p) %p (对) (a * b) % p =...

ZLR_142857_TREE3的博客 2634

逆元(数论倒数)

今天听师哥讲逆元,感觉有点难啊,不过,初中生都这么厉害了吗! 数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真   先来引入求余概念   (a +  b) % p = (a%p +  b%p) %p  (对) (a  -  b) % p = (a%p  -  b%p) %p  (对) ...

G-Howe的博客 372

逆元(数论中的倒数)

满足求余的运算 (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%p - b%p) %p (对) (a * b) % p = (a%p * b%p) %p (对) (a / b) % p = (a%p / b%p) %p (错) 除法不满足求余取模运算 a*x = 1 (mod p)...

wcxyky的博客 1767
上一篇: Unix高级编程学习笔记——行缓存与全缓存
下一篇: 米勒-拉宾素性检测算法
qmickecs
博客等级 码龄12年 136粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值