精华内容
下载资源
问答
  • 模逆算法
    2022-07-18 20:39:40

    python:实现求模逆算法

    def gcd(a: int, b: int) -> int:
        while a != 0:
            a, b = b % a, a
        
    更多相关内容
  • 在本文中,我们探索了快速模逆算法及其实现。 我们首次提出了基数为8的模数算法来加快SM2公钥密码算法中的点乘法,该算法是由中国国家密码管理局于2010年12月发布的,被确立为中国商业应用的ECC标准。我们的SM2硬件...
  • 有限域的运算是密码学的基础,而...提出了一种同时支持素域和二进制域两种有限域的模逆算法,通过对算法的优化和对硬件结构的设计,使得256位的模逆运算电路的时钟频率达到167 MHz,电路面积和其他电路相比较也有明显优势。
  • (论文)模拟算法的分析、改进及测试 作者:谭丽娟、陈运(成都电子科技大学通信与信息工程学校) 电子科技大学学报2004-8期
  • The basic arithmetic operations in modular arithmetic where the modulo is prime are a natural and inseparable part of cryptographic algorithms
  • SM2公钥密码在智能卡领域有广泛的应用,其运算中难以避免模逆运算,而模逆算法因为其具有幂指数级别的运算复杂度,成为制约SM2算法性能的一个重要瓶颈。以SM2算法公钥引擎为基础,巧妙地利用了已有的蒙哥马利乘法器...
  • 实验三:求模逆算法 一、实验目的 理解、掌握求模逆算法的基本过程。 二、实验内容 熟悉扩展欧几里德算法。 利用扩展欧几里德算法求模逆,要求:任意输入两个整数a,m;输出a-1mod m;当模逆不存在时,输出出错...

    实验求模逆算法

    一、实验目的

    理解、掌握求模逆算法的基本过程。

    二、实验内容

    1. 熟悉扩展欧几里德算法。
    2. 利用扩展欧几里德算法求模逆,要求:任意输入两个整数a,m;输出a-1mod m;当模逆不存在时,输出出错提示。

    三、求模逆算法基本原理

    四、实验过程

            1、使用扩展欧几里得算法的关键代码

    套用公式即可

     

            2、使用费马小定理的快速幂算法的关键代码

    使用快速幂计算出即可

     

    五、实验结果

    分别输入 a和m计算出a模m的逆元

     

    左侧是欧几里得算法得到的结果,右侧是费马小定理计算出来的结果。

    费马小定理只能适用于m为质数的情况,适用范围比欧几里得算法小,是a和m互质的一种特殊情况。欧几里得算法只需要a和m互质就可以求出模逆。

     

     

     

    展开全文
  • 在公钥密码应用中,求模逆元是一个常用的操作,通常使用扩展欧拉算法,但它的...该文根据实际应用的情况,提出了一个适合实际应用的求模逆算法,其满足嵌入式环境下的内存需求,且速度也比扩展欧拉算法快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的一种线性组合,即

    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>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 的赋值表达式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 的作用。

    展开全文
  • 欧几里得(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:05
    c/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,...
  • 1、在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中有许多可以求乘法逆元的函数...在大数库中,xgcd的计算公式是:On exit z=gcd(x,y)=x.xd+y.yd我一直百思不得其解,为什么这个函数可以用来计算模逆,直到发现了:拓展的欧几里得算法:欧几里得算法是什么?...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼有三种算法:1,欧几里得辗转相除法。2,开方算法。3,求素数的埃拉托塞尼筛法。其中3,已经解决,参见百度百科:素数普遍公式。其中2: 开立方公式:设A = X^3,求X.称为...
  • 利用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
  • 欧几里得算法也称碾转相除法,是目前已知求最大公约数得最快通用方法,具有代码复杂度低、易理解、用途广众多优点。
  • 设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:18
    Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法
  • 算法描述:给定两个正整数m和n,求他们的最大公因子,即能够同时整除m和n的最大正整数。 算法步骤: 若m&lt;n,那么m↔n,为了确保m&gt;n。 求m除以n得到的余数r。 若r为0,算法结束,n为答案。 若r不...
  • 目前,求解模逆运算的方法主要包括模幂算法、扩展欧几里得算法、二进制扩展欧几里得算法等。模幂算法以费马小定理为基础,将模逆运算转换成模幂运算,但是模幂算法无法确定模逆结果是否存在。采...
  •  只要明白了欧几里得算法,很容易就可以求出两整数的最大公约数,而这是一个小学时候就学习到的算法。这个算法有个可能让我们更熟悉的名字,叫辗转相除法。  我经常搞不清楚被除数和除数,不知道会不会有人和我...
  • 文章目录简介算法原理算法实现效果展示 简介   在前面RSA大数运算实现(1024位n)的第一篇中,求逆元的方法是使用欧几里得除法,本质上是基于除法。在第三篇中,使用Knuth的除法提高了除法的效率,即便这样,除法...
  • Gauss-Jacques 算法得到矩阵的模逆。 该算法既不使用行列式,也不使用伴随矩阵,对于任何大小的矩阵都非常有用。 例子: n = 10; % 矩阵的大小K = 兰迪 (100,n,n); % 生成一个大小为“n”的随机矩阵米 = 89; % ...
  • MULINV(X,P) 是在 P 阶有限(伽罗瓦)域上找到向量 X 的模逆的函数,即如果 Y = MULINV(X,P) 然后 (X... Bruce,应用密码学:C 语言的协议、算法和源代码,第 2 版,John Wiley and Sons, Inc.,美国-加拿大,1996 年。
  • C++ Fermat's little theorem费马小定理寻找模逆实现算法C++ Fermat's little theorem费马小定理寻找模逆实现算法完整源码(定义,实现,main函数测试) C++ Fermat’s little theorem费马小定理寻找模逆实现算法...
  • RSA:RSA-1024加密算法

    2021-05-23 07:27:47
    gcd.h:最大公因子及模逆算法实现 mrTest.h:Miller-Rabin检测的实现 power.h:模幂运算的实现 random.h:随机整数的生成库 main.cpp:测试程序,输入一个字符串,生成一对秘钥并保存(公钥名为pubkey.txt,私钥名为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 561
精华内容 224
关键字:

模逆算法