-
2022-07-18 20:39:40
python:实现求模逆算法
def gcd(a: int, b: int) -> int: while a != 0: a, b = b % a, a
更多相关内容 -
基于快速模逆算法的SM2的高速实现
2021-03-27 14:18:36在本文中,我们探索了快速模逆算法及其实现。 我们首次提出了基数为8的模数算法来加快SM2公钥密码算法中的点乘法,该算法是由中国国家密码管理局于2010年12月发布的,被确立为中国商业应用的ECC标准。我们的SM2硬件... -
同时支持两种有限域的模逆算法及其硬件实现 (2007年)
2021-05-20 14:07:00有限域的运算是密码学的基础,而...提出了一种同时支持素域和二进制域两种有限域的模逆算法,通过对算法的优化和对硬件结构的设计,使得256位的模逆运算电路的时钟频率达到167 MHz,电路面积和其他电路相比较也有明显优势。 -
(论文)模逆算法的分析、改进及测试
2009-03-14 10:26:10(论文)模拟算法的分析、改进及测试 作者:谭丽娟、陈运(成都电子科技大学通信与信息工程学校) 电子科技大学学报2004-8期 -
蒙哥马利求模逆详细过程
2017-09-29 15:31:47The basic arithmetic operations in modular arithmetic where the modulo is prime are a natural and inseparable part of cryptographic algorithms -
SM2算法模逆加速器的设计
2020-10-17 06:41:23SM2公钥密码在智能卡领域有广泛的应用,其运算中难以避免模逆运算,而模逆算法因为其具有幂指数级别的运算复杂度,成为制约SM2算法性能的一个重要瓶颈。以SM2算法公钥引擎为基础,巧妙地利用了已有的蒙哥马利乘法器... -
信息安全实验三:求模逆算法 2019.04.18
2020-05-03 00:30:44实验三:求模逆算法 一、实验目的 理解、掌握求模逆算法的基本过程。 二、实验内容 熟悉扩展欧几里德算法。 利用扩展欧几里德算法求模逆,要求:任意输入两个整数a,m;输出a-1mod m;当模逆不存在时,输出出错...实验三:求模逆算法
一、实验目的
理解、掌握求模逆算法的基本过程。
二、实验内容
- 熟悉扩展欧几里德算法。
- 利用扩展欧几里德算法求模逆,要求:任意输入两个整数a,m;输出a-1mod m;当模逆不存在时,输出出错提示。
三、求模逆算法基本原理
四、实验过程
1、使用扩展欧几里得算法的关键代码
套用公式即可
2、使用费马小定理的快速幂算法的关键代码
使用快速幂计算出即可
五、实验结果
分别输入 a和m计算出a模m的逆元
(左侧是欧几里得算法得到的结果,右侧是费马小定理计算出来的结果。)
费马小定理只能适用于m为质数的情况,适用范围比欧几里得算法小,是a和m互质的一种特殊情况。欧几里得算法只需要a和m互质就可以求出模逆。
-
一种快速适合嵌入式环境的求模逆元算法 (2006年)
2021-05-22 04:36:00在公钥密码应用中,求模逆元是一个常用的操作,通常使用扩展欧拉算法,但它的...该文根据实际应用的情况,提出了一个适合实际应用的求模逆元算法,其满足嵌入式环境下的内存需求,且速度也比扩展欧拉算法快5倍左右。 -
密码学-模逆运算
2022-05-13 23:00:13扩展欧几里得算法 给予二整数 a 与 b, 必存在有整数 x 与 y 使得 ax + by = gcd(a,b)。 有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去...扩展欧几里得算法
给予二整数 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的一种线性组合,即
从而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 分别赋值
(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>b swap = 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 的赋值表达式
,先看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 的作用。
-
欧几里得(Euclid)算法的Python实现
2020-06-24 17:20:24欧几里得(Euclid)算法的Python实现欧几里得算法说明
欧几里得(Euclid)算法是用来求两个整数的最大公约数。
详细数学描述参考:
http://www.360doc.com/content/19/0314/18/53810907_821492777.shtml代码示例
# calculate the gcd(a,b) using euclid algorithm def gcd_euclid(*p): (a,b) = p if isinstance(a,int) == False or isinstance(b,int) == False: print("Integer input error occured...") return False print((a,b)) if b == 0: return a else: return gcd_euclid(b, divmod(a,b)[1])
运行效果
print(gcd_euclid(*(15,12)))
得到结果:
(15, 12) (12, 3) (3, 0) 3
print(gcd_euclid(*(15.1,12)))
得到结果:
Integer input error occured... False
总结
1、用递归算法可以非常简洁的描述推导过程;
2、考虑到递归的返回参数问题,使用tupple,进行传参和解析;
3、python不支持三元计算符?:,只能用if else 来表示逻辑;
4、divmod(a,b)会返回一个tupple,要做处理,否则递归时参数有问题。
5、a>b -
c/c++实现模逆运算
2020-03-06 10:50:05c/c++实现模逆运算 最终结果: 实验原理: 代码实践: #include <iostream> using namespace std; int main(int age, char * argv[]){ int temp, q, t1, t2, t3; int a, b, swap=0; int x1, x2, x3, y1,... -
扩展欧几里得算法(求逆元)总结
2021-03-13 16:05:331、在RSA算法生成私钥的过程中涉及到了扩展欧几里得算法(简称exgcd),用来求解模的逆元。2、首先引入逆元的概念:逆元是模运算中的一个概念,我们通常说 A 是 B 模 C 的逆元,实际上是指 A * B = 1 mod C,也就是说 ... -
模逆运算(C语言)
2020-03-06 13:04:26使用扩展欧几里得算法 代码实现 #include <stdio.h> int main() { int temp,q,t1,t2,t3,i=1; int a,b,swap=0; int x1,x2,x3,y1,y2,y3; /**欢迎**/ printf("--------欢迎使用模逆运算-----------\n")... -
Python——实现密码学中的模逆运算
2020-06-19 18:45:57用python搞密码学求模逆 -
miracl库的使用之——大数模逆运算
2021-03-14 16:54:55miracl中有许多可以求乘法逆元的函数...在大数库中,xgcd的计算公式是:On exit z=gcd(x,y)=x.xd+y.yd我一直百思不得其解,为什么这个函数可以用来计算模逆,直到发现了:拓展的欧几里得算法:欧几里得算法是什么?... -
辗转相除法或Euclid算法
2021-05-20 09:52:00该楼层疑似违规已被系统折叠隐藏此楼查看此楼有三种算法:1,欧几里得辗转相除法。2,开方算法。3,求素数的埃拉托塞尼筛法。其中3,已经解决,参见百度百科:素数普遍公式。其中2: 开立方公式:设A = X^3,求X.称为... -
利用Euclid算法求解两个数的最大公约数及逆 matlab
2022-04-09 22:15:00利用Euclid算法,求两个正整数a , N的最大公因数,如果两个数互质,求出从1到N的正整数中a的逆。 -
python实现模逆运算
2018-01-01 22:45:55模逆的定义:要定义这个运算,需要三个整数。a的模逆元素(对n取模)为b,意味着a*b mod m=1,则称a关于m的模逆为b ...def findModReverse(a,m):#这个扩展欧几里得算法求模逆 if gcd(a,m)!=1: return None u1,u2,u3 -
模逆(1.欧几里得算法)
2022-07-09 15:06:41欧几里得算法也称碾转相除法,是目前已知求最大公约数得最快通用方法,具有代码复杂度低、易理解、用途广众多优点。 -
欧几里得算法求乘法逆元 python代码
2021-04-13 11:27:51设x∈Zn,gcd(x,y)=1x\in \mathbb{Z}_n,gcd(x,y)=1x∈Zn,gcd(x,y)=1则xxx在Zn\mathbb{Z}_nZn上有乘法逆元。 对xxx若存在yyy使x×y≡1modZnx\times y\equiv 1 \mathrm{mod}\mathbb{Z}_nx×y≡1modZn则yyy为xxx的... -
模逆(5.Stein算法)
2022-07-11 22:02:18Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法。 -
欧几里得算法(辗转相除法)描述,证明和python实现
2018-08-12 10:57:59算法描述:给定两个正整数m和n,求他们的最大公因子,即能够同时整除m和n的最大正整数。 算法步骤: 若m<n,那么m↔n,为了确保m>n。 求m除以n得到的余数r。 若r为0,算法结束,n为答案。 若r不... -
一种模逆运算方法及运算器与流程
2021-03-14 16:54:59目前,求解模逆运算的方法主要包括模幂算法、扩展欧几里得算法、二进制扩展欧几里得算法等。模幂算法以费马小定理为基础,将模逆运算转换成模幂运算,但是模幂算法无法确定模逆结果是否存在。采... -
RSA简介(四)——求逆算法
2017-08-26 14:23:00只要明白了欧几里得算法,很容易就可以求出两整数的最大公约数,而这是一个小学时候就学习到的算法。这个算法有个可能让我们更熟悉的名字,叫辗转相除法。 我经常搞不清楚被除数和除数,不知道会不会有人和我... -
RSA大数运算实现(1024位n)(4)快速求逆元算法
2019-02-08 20:11:42文章目录简介算法原理算法实现效果展示 简介 在前面RSA大数运算实现(1024位n)的第一篇中,求逆元的方法是使用欧几里得除法,本质上是基于除法。在第三篇中,使用Knuth的除法提高了除法的效率,即便这样,除法... -
Gauss-Jacques 方法:使用大小为 nxn 的 Gauss-Jacques 算法计算模逆矩阵,以用于数值分析。-matlab开发
2021-05-29 08:24:36Gauss-Jacques 算法得到矩阵的模逆。 该算法既不使用行列式,也不使用伴随矩阵,对于任何大小的矩阵都非常有用。 例子: n = 10; % 矩阵的大小K = 兰迪 (100,n,n); % 生成一个大小为“n”的随机矩阵米 = 89; % ... -
模逆:在有限(伽罗瓦)域上求模逆。-matlab开发
2021-06-01 18:44:44MULINV(X,P) 是在 P 阶有限(伽罗瓦)域上找到向量 X 的模逆的函数,即如果 Y = MULINV(X,P) 然后 (X... Bruce,应用密码学:C 语言的协议、算法和源代码,第 2 版,John Wiley and Sons, Inc.,美国-加拿大,1996 年。 -
C++ Fermat‘s little theorem费马小定理寻找模逆实现算法(附完整源码)
2021-03-18 10:31:48C++ Fermat's little theorem费马小定理寻找模逆实现算法C++ Fermat's little theorem费马小定理寻找模逆实现算法完整源码(定义,实现,main函数测试) C++ Fermat’s little theorem费马小定理寻找模逆实现算法... -
RSA:RSA-1024加密算法
2021-05-23 07:27:47gcd.h:最大公因子及模逆算法实现 mrTest.h:Miller-Rabin检测的实现 power.h:模幂运算的实现 random.h:随机整数的生成库 main.cpp:测试程序,输入一个字符串,生成一对秘钥并保存(公钥名为pubkey.txt,私钥名为...