密码学-模逆运算

article/2025/10/14 8:24:10

扩展欧几里得算法

        给予二整数 a 与 b, 必存在有整数 x 与 y 使得  ax + by = gcd(a,b)  

       有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去,可以得到ax+by=gcd(a,b)的整数解。

1、算法原理

        给定整数a、b,若gcd(a,b)=1。则存在c,满足ac=1 mod b,c即为a模b的乘法逆元。

       利用扩展的欧几里得算法求得满足条件的c:先做辗转相除,当a、b互素时,最后一步得到的余数为1,再从1出发,对前面得到的所有除法算式进行变形,将余数用除数和被除数表示,最终便可将1表示为a与b的一种线性组合,即

ax+by=1

       从而x就是a模b的乘法逆元。因此寻找乘法逆元的过程就是求x和y的过程。 

       这里我们先看一下人工计算的过程:

       具体实现时使用三组变量:x1,x2,x3;y1,y2,y3;t1,t2,t3。初始化时,给x1,x2,x3别赋值1、0、a,则有

1 × a + 0 × b = a

       类似地,给y1,y2,y3分别赋值0、1、b,有

0 × a + 1 × b = b

       接下来开始迭代,保证在每次迭代中,有

a × t1 + b × t2 = t3

成立。为此只需在每一步中为 ti 分别赋值 x_{i}-q \, y_{i} (i=1,2,3) ,其中q为x3除以y3的商。

       当最后t3迭代至计算结果为1时,相应的 t1 就是 a模b的乘法速元,而 t2 是b模a的乘法逆元。

2、代码部分

#include <stdio.h>
int main(int argc, char *argv[])
{int temp,q,t1,t2,t3;int a,b,swap=0;int x1,x2,x3,y1,y2,y3;printf("Input two integers: ");scanf("%d",&a);scanf("%d",&b);if (a<b) {   //保证a>bswap = 1;temp = a;a = b;b = temp;		}x1=1;	x2=0;	x3=a;    // 初始y1=0;	y2=1;	y3=b;while (y3!=0){q=x3/y3; //商t1=x1-q*y1;	t2=x2-q*y2;	t3=x3-q*y3;x1=y1;		x2=y2;		x3=y3;y1=t1;		y2=t2;		y3=t3;printf("\nt1,t2,t3\t%d\t%d\t%d ;",t1,t2,t3);	}printf("\n");if(x3 == 1)   // 这里使用x3,组后一轮循环中,x3保存了上一步中值为1的t3{if(swap==1){printf("\ninverse of %d mod %d is:%d",b,a,x2);printf("\ninverse of %d mod %d is:%d",a,b,x1);		}else{printf("\ninverse of %d mod %d is:%d",a,b,x2);printf("\ninverse of %d mod %d is:%d",b,a,x1);	}			}else  printf("no inverse");printf("\n\n\n");return 0;
}

注释:

       关于判断条件是  x3==1,而不是 t3==1 的问题,while循环中本质使用的是辗转相除法,对于 ti 的赋值表达式x_{i}-q \, y_{i},先看t3,t3=x3-q*y3 ,q=x3/y3 ,我理解的是 t3 就是 x3除以y3的余数,加上开始时,给 x3=a,y3=b ,所以对t3的迭代可以看成对 (a,b)做辗转相除法。

      再看 t1 和 t2,为了保持线性关系ax + by = gcd(a,b),相应的x和y的值也需要变化,这就是 t1 和 t2 的作用。


http://chatgpt.dhexx.cn/article/iVpnQKsD.shtml

相关文章

什么是长轮询

短轮询 vs 长轮询短轮询长轮询 长轮询的原理demotomcat线程池AsyncContext源码分析 短轮询 vs 长轮询 在看apollo和nacos等配置中心的源码的时候发现&#xff0c;配置更新的实时感知都是采用的长轮询的方式。那么什么是长轮询的呢&#xff1f;在讲解长轮询之前我们先了解一下什…

js轮询

一、案例效果 使得数据实时变化&#xff0c;可以随时暂停和播放 二、代码案例 html <button id"button">暂停</button>js let timerId 1 // 模拟计时器id&#xff0c;唯一性let timerObj {} // 计时器存储器function getData() {return new Promi…

php实现异步轮询

文章目录 一、前言二、工欲善其事1、curl是伪异步请求2、鸟哥推荐的方法中有curl 三、异步轮询&#xff08;fsockopen&#xff09;1、模拟异步轮询的demo2、响应页面代码3、测试结果4、fsockopen(): unable to connect to 错误 四、问题以及反思1、无法调试返回2、占用进程3、最…

java 轮询请求_使用RxJava来实现网络请求轮询功能

原标题:使用RxJava来实现网络请求轮询功能 近日有媒体报道称,腾讯重金入股永辉超市旗下生鲜超市超级物种,目前交易已经完成。受此刺激,永辉超市股价迅速涨停,午后临时停牌。若此举成行,超级物种将更有底气对垒阿里巴巴的盒马鲜生,生鲜商超的新零售市场将展开激烈争战。 …

android轮询

目录 轮询实现方案&#xff1a; Timer Handler RxJava 1.Interval 2.repeatWhen 轮询实现方案&#xff1a; 方案一&#xff1a; Timer Thread 实现思路&#xff1a;使用timer定时执行TimerTask 缺点&#xff1a;如果有异步任务&#xff0c;下次任务开始执行时需要判断…

nginx轮询

创建容器1&#xff1a; docker create -it --name zyr1 centos:7 /bin/bash docker start zyr1 进入容器&#xff1a; docker exec -it zyr1 /bin/bash 安装ipconfig命令 yum provides ifconfig 安装nginx依赖 yum -y install openssl openssl-devel prce-devel zlib z…

python 轮询mysql_python 轮询

1. 轮询 三天之后,小钱才拿到这个快递 总结 快递不能及时的传达 小钱儿 - 卒 客户端浪费极大资源 老程头儿 -痴呆 资源浪费也很严重 HTTP无法跟踪定义客户端 无状态 2. 长轮询 缺陷: 消息实时性不高 传达室茶室的资源有限 占用资源 客户端线程资源占用 3. 长连接 总结 占用的空…

java 轮询http_HTTP轮询模型

HTTP轮询模型 长短轮询 http协议是一种client-server模型的应用层协议&#xff0c;这种c-s的模式虽然大多数情况都能满足需求&#xff0c;但是某些场景也需要服务端能够将一些信息实时的推送到客户端&#xff0c;即实现服务器向客户端推消息的功能。 比如&#xff1a; 配置管理…

七种轮询介绍(后附实践链接)

我有一个朋友&#xff5e; 做了一个小破站&#xff0c;现在要实现一个站内信web消息推送的功能&#xff0c;对&#xff0c;就是下图这个小红点&#xff0c;一个很常用的功能。 不过他还没想好用什么方式做&#xff0c;这里我帮他整理了一下几种方案&#xff0c;并简单做了实现…

linux cgroup 死循环,Linux CGroup 基础

CGroup V1 1. CGroup 概念Task: 任务&#xff0c;也就是进程&#xff0c;但这里的进程和我们通常意义上的 OS 进程有些区别&#xff0c;在后面会提到。 CGroup: 控制组&#xff0c;一个 CGroup 就是一组按照某种标准划分的Tasks。这里的标准就是 Subsystem 配置。换句话说&…

linux cgroup 原理,Cgroup框架的实现

CGoup核心主要创建一系列sysfs文件&#xff0c;用户空间可以通过这些节点控制CGroup各子系统行为&#xff0c;以及各子系统模块根据参数。在执行过程中或调度进程到不同CPU上&#xff0c;或控制CPU占用时间&#xff0c;或控制IO带宽等等。另外&#xff0c;在每个系统的proc文件…

CGroup的原理和使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、主要功能二、基本概念三、cgroups子系统介绍四、cgroups 层级结构五、数据结构 前言 Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个…

Linux cgroup介绍

本文参考网上一些资料&#xff0c;结合实际应用&#xff0c;简要介绍一下cgroup。 为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。也就是能完成一组容器的概念&#xff0c;在这个容器中&#xff0c;有分配好的特定比例的cpu时间&#…

漫谈cgroup

什么是cgroup cgroup 是linux内核的一个功能&#xff0c;用来限制、控制与分离一个进程组的资源&#xff08;如CPU、内存、磁盘I/O等&#xff09;。它是由 Google 的两位工程师进行开发的&#xff0c;自 2008 年 1 月正式发布的 Linux 内核 v2.6.24 开始提供此能力。 cgroup …

容器中的Cgroup

文章目录 容器中的CgroupCgroup概念容器化两个关键核心现代容器化带来的优势什么是Cgroup Cgroup的一些测试测试CPU和内存使用情况CPU 周期限制 CPU Core 控制CPU 配额控制参数的混合使用内存限额Block IO 的限制bps 和 iops的限制 容器中的Cgroup Cgroup概念 容器化两个关键…

Cgroup 资源配置

目录 一、Cgroup定义 二、使用stress压力测试工具测试cpu和内存状态 1、创建一个dockerfile文件 2、创建镜像 3、创建容器 ①创建容器 ②、创建容器并产生10个子函数进程 三、CPU 周期 1、实现方案 2、实验 四、CPU Core控制 五、docker build 一、Cgroup定义 cg…

cgroup资源配置

一、cgroup介绍二、利用stress 压力测试工具来测试三、CPU控制1、仅用率控制&#xff08;权重&#xff09;2、周期限制方法一&#xff1a;在命令行里直接设置方法二&#xff1a;创建容器后&#xff0c;关闭容器在文件里直接修改方法三&#xff1a;进入容器查看 3、cpu核心数4、…

【CGroup原理篇】3. CGroup使用指南

写在前面 这里先从整体上概述cgroup的创建,挂载,参数配置和卸载,后面的章节中会一一介绍每个子系统的详细使用方法和使用案例。 一、使用Linux命令管理CGroup 1.1挂载cgroup临时文件系统 mount -t tmpfs cgroup_root /sys/fs/cgroup 1.2 创建挂载层级需要的目录 mkdir /sy…

Linux CGroup 原理

Linux CGroup 原理 1、CGroup简介 cgroups是Linux下控制一个&#xff08;或一组&#xff09;进程的资源限制机制&#xff0c;全称是control groups&#xff0c;可以对cpu、内存等资源做精细化控制。 开发者可以直接基于cgroups来进行进程资源控制&#xff0c;比如8核的机器上…

LINUX CGROUP总结

简介: Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个功能&#xff0c;用来限制&#xff0c;控制与分离一个进程组群的资源&#xff08;如CPU、内存、磁盘输入输出等&#xff09;。这个项目最早是由Google的工程师在2006年发起&#xff08;主要是Paul Men…