RSA简介(四)——求逆算法
- 版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址
- http://www.cnblogs.com/Colin-Cai/p/7354682.html
- 作者:窗户
- QQ:6679072
- E-mail:6679072@qq.com
此处所谓求逆运算,是指在模乘群里求逆。
第一节里提到互质的两个定义:
(1)p,q两整数互质指p,q的最大公约数为1。
(2)p.q两整数互质指存在整数a,b,使得ap+bq=1。
只要明白了欧几里得算法,很容易就可以求出两整数的最大公约数,而这是一个小学时候就学习到的算法。这个算法有个可能让我们更熟悉的名字,叫辗转相除法。
我经常搞不清楚被除数和除数,不知道会不会有人和我一样。所以我要先在这里写明一下,防止混淆,一个除法,除号前的叫被除数,除号后的脚除数。
单次除法,X=m*Y+n,X为被除数,Y为除数,m为商,n为余数,X和Y的最大公约数等于Y和n的最大公约数。辗转相除法的每一轮除法,求最大公约数都是由求被除数、除数的最大公约数转变为被除数和玉树的最大公约数,最大公约数不变,数变小了。直到余数为0,求得最大公约数就是最一个除法下的除数。
顺便说一下,整数环具有这种相除法的结构,但不是所有的环都具有此种结构,可以做相除法的环叫欧几里得整环(Euclidean domain),给个其他的例子,比如复系数多项式环、实系数多项式环、整数系数多项式环……跑题了,就此打住。
互质的第二个定义里,如果对于互质的两个正整数p,q,p<q,我再加一个条件,要求0<a<q,那么a和b存在且唯一。这个时候,a就是q的以p为模的模乘逆元了。
可以用辗转相除法伴随逆元的生成,原理大致如下:
如果b0、b1开始做辗转相除法,步骤如下:
b0 = a0*b1 + b2
b1 = a1*b2 + b3
b2 = a2*b3 + b4
...
bn-2 = an-2*bn-1 + bn
bn-1 = an-1*bn + bn+1
bn = an*bn+1
最后一步余数为0,也就是最大公约数是bn+1,除了最后一个式子其他式子移象,余数写在左边
(1) b2 = b0 - a0*b1
(2) b3 = b1 - a1*b2
(3) b4 = b2 - a2*b3
...
(n-1) bn=bn-2 - an-2*bn-1
(n) bn+1 = bn-1 - an-1*bn
我们开始分析, (1)式可以看成是把b2表示为b0和b1的线性组合,
如果把(1)式带入(2)式,则得到把b3表示为b0和b1的线性组合,姑且称为(2.1),为了方便,把(1)给个一样的表示(1.1),
把(1.1)和(2.1)带入(3),则得到把b4表示为b0和b1的线性组合,称为(3.1),
把(2,1)和(3.1)带入(4),则得到把b5表示为b0和b1的线性组合,称为(4.1),
...
直到把bn+1表示为b0和b1的线性组合
我们这里是求逆元,如果b0和b1互质,那么bn+1应为1。
bn+1表示为b0和b1的线性组合,b1前的系数就是b1在b0模乘下的逆元了,当然该系数还要除以b0取个余数。
同样,还是写个bc程序来表示一下这个算法。
- #!/usr/bin/bc -q
- define inv(b0, b1)
- {
- m=b0;
- x0 = 1;
- y0 = 0;
- x1 = 0;
- y1 = 1;
- while(1) {
- a = b0/b1;
- b = b0%b1;
- if(b==0) {
- if(b1==1) {
- y1 = y1 % m;
- if(y1<0) {
- y1+=m;
- }
- return y1;
- } else {
- return -1;
- }
- }
- /*
- tmp <= (x1,y1)
- (x1,y1) <= (x0,y0)-a(x1,y1)
- (x0,y0) <= tmp
- */
- tmpx = x1;
- tmpy = y1;
- x1 = x0-a*x1;
- y1 = y0-a*y1;
- x0 = tmpx;
- y0 = tmpy;
- b0 = b1;
- b1 = b;
- }
- }
- b0 = read();
- b1 = read();
- c1 = inv(b0,b1)
- print "c1 = ",inv(b0,b1),"\n"
- quit
当然,算法中x0,x1是记录b0的系数,其实对于计算b1的逆元无用,所以可以省略。整个算法的平均时间复杂度为线性(忽略除法的时间复杂度,这里只考虑除法的个数,当然,其实除法的时间复杂度本不可忽略,至少为O(n),最多为O(n2),而整体的真正时间复杂度应该是除法时间复杂度在0~n上积分)。
另外,此求逆算法在RSA中的应用不只在于求私钥的指数,也可用于优化模幂算法。
RSA简介(四)——求逆算法的更多相关文章
- BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)
题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...
- RSA简介(二)——模幂算法
RSA最终加密.解密都要用到模乘的幂运算,简称模幂运算. 回忆一下RSA,从明文A到B B=Ae1%N 对B解密,就是 A=Be2%N 其中,一般来说,加密公钥中的e1一般会比较小,取65537居多, ...
- 求逆序对常用的两种算法 ----归并排 & 树状数组
网上看了一些归并排求逆序对的文章,又看了一些树状数组的,觉得自己也写一篇试试看吧,然后本文大体也就讲个思路(没有例题),但是还是会有个程序框架的 好了下面是正文 归并排求逆序对 树状数组求逆序对 一. ...
- 算法笔记_065:分治法求逆序对(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序) 1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...
- 315. Count of Smaller Numbers After Self(二分或者算法导论中的归并求逆序数对)
You are given an integer array nums and you have to return a new counts array. The counts array has ...
- 求逆序对 ----归并排 & 树状数组
网上看了一些归并排求逆序对的文章,又看了一些树状数组的,觉得自己也写一篇试试看吧,然后本文大体也就讲个思路(没有例题),但是还是会有个程序框架的 好了下面是正文 归并排求逆序对 树状数组求逆序对 一. ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- SIGAI机器学习第二十四集 聚类算法1
讲授聚类算法的基本概念,算法的分类,层次聚类,K均值算法,EM算法,DBSCAN算法,OPTICS算法,mean shift算法,谱聚类算法,实际应用. 大纲: 聚类问题简介聚类算法的分类层次聚类算法 ...
- 归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对
面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出 ...
随机推荐
- css中的层叠性及权重的比较
假如同一个标签被多个选择器选中,每个选择器都设置了相同的样式,浏览器中加载时这个样式听谁的? 不同选择器设置的同一个样式,只会选择一个进行加载,不会叠加. 为了解决听谁的问题,引入层叠性的概念. 层叠 ...
- HDU 2955 Robberies(DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题目: Problem Description The aspiring Roy the Rob ...
- springMVC项目国际化(i18n)实现方法
SpringMVC项目国际化(i18n)实现方法 按照作息规律,每周五晚必须是分享知识的时间\(^o^)/~,这周讲点儿啥呢,项目需要逼格,咱们国际化吧(* ̄rǒ ̄)~,项目中碰到这类需求的童鞋可能并 ...
- Hive笔记——技术点汇总
目录 · 概况 · 手工安装 · 引言 · 创建HDFS目录 · 创建元数据库 · 配置文件 · 测试 · 原理 · 架构 · 与关系型数据库对比 · API · WordCount · 命令 · 数 ...
- Android异步处理技术
前言: 在移动端开发中,我们必须正确处理好主线程和子线程之间的关系,耗时操作必须在子线程中完成,避免阻塞主线程,导致ANR.异步处理技术是提高引用性能,解决主线程和子线程之间通信问题的关键. 通常在如 ...
- 分布式web架构中对session同步的常用处理方法以及优缺点
写在前面 最近在读一本来自淘宝技术团队大牛的书,名字叫<大型网站系统与Java中间件实践>.开篇的章节详细地介绍了一个网站架构由小变大不断演进的过程,其中从单机架构升级到集群架构的过程中着 ...
- 机器学习实战 logistic回归 python代码
# -*- coding: utf-8 -*- """ Created on Sun Aug 06 15:57:18 2017 @author: mdz "&q ...
- 谈一谈EasyUI的TreeGrid的过滤功能
写在最前面 这个星期一直在纠结easyui的treegrid的过滤功能,原因呢,自然是项目中一个莫名奇妙的需求. easyui虽说是后端程序员的前端框架,但是说句实话,除去api,让我直接写里面的节点 ...
- (5)UIView常见属性
此时打印的所有子控件会把使用自动布局的控件也打印出来,不准确,所以得去掉这两个选项,再进行打印 使用实例如下: viewWithTag的注意点,当有多个相同的Tag值时,它是先找到第一个Tag值,而不 ...
- CentOS编译PHP过程中常见错误信息的解决方法
原文链接:http://www.linuxidc.com/Linux/2014-05/102327.htm ********************************************** ...