在RSA算法中用到的大数运算

两个大数的加法运算

得到两个大数的列表。类似加法运算考虑进位。新建一个结果列表,列表长度比较长的那个列表长度加1。把两个大数的列表反转,从第一位开始对应位相加,把加的和放到结果列表的对应位。若加的和大于9,则产生进位,把加的和减10放到结果列表的对应位,然后在结果列表的对应位的下一位加1。遍历整个列表得到相加和。把存储结果的列表反转即得到相加的结果。

两个大数的减法运算

得到两个大数的列表。类似减法运算考虑借位。新建一个结果列表,列表长度和较长的那个列表长度一样。从第末尾位开始对应位相减,把减的结果放到结果列表的对应位。若被减数小于减数,则产生借位,把被减数加10之后再减,把被减数的前一位对应的数减1。遍历整个列表得到相减差。存储结果的列表即为相减的结果。最终结果需要去除首端的0.如果所有位都是0,则返回0。

两个大数的乘法运算

将两个大数放到两个列表中,把整个列表翻转,此时列表的低位就是两个大数的低位。然后用两层循环,外层为第二个乘数,对应的位数用i表示,内层为第一个乘数,对应的位数用j表示。然后让外层的每一位分别乘内层的所有位。把乘得的结果放到一个新的列表中,所在的i+j位上。如果这个结果大于9,那么第i+j位放的数为结果求余10,然后再在第i+j+1位放入这个结果整除10所得到的数。最后把新得到的列表反转然后转换为字符串输出即为两个大数相乘的结果。

大数的幂模运算

对于取模运算有:

(a*b)%c=(a%c)*(b%c)%c

这个是成立的:所以由此可以实现快速的大数的运算。

核心思想在于将大数的幂运算拆解成了相对应的乘法运算,利用上面的式子,始终将我们的运算的数据量控制在c的范围以下,将计算的数据量压缩了很大一部分,当指数非常大的时候也能快速计算。

代码实现

#大数加法运算
def sumab(array1,array2):array1 =[int(i) for i in array1 ]array2=[int(i) for i in array2 ]#反转两个列表array1=array1[::-1]array2=array2[::-1]if  len(array1)<= len(array2):#两种情况,第一种:1的长度小于2的长度,第二种情况反过来。##新建立一个与较长长度一致的全为0的列表ans = [0 for x in range(len(array2)+1)]#把较短的列表后面全添加上0使长度与较长的列表一致for i in range(len(array2)-len(array1)):array1.append(int(0))else:ans = [0 for x in range(len(array1)+1)]for i in range(len(array1)-len(array2)):array2.append(int(0))#让对应的位相加for i in range(len(ans)-1):ans[i] += array1[i] + array2[i]if ans[i] >= 10:#如果和大于10,则保留个位数值,并进位ans[i] -=  10ans[i+1] += 1#把结果列表反转ans=ans[::-1]i=0while ans[i]==0:i+=1ans1=""for j in ans[i:]:ans1+=str(j)#ans1=str(ans)return ans1
#大数减法运算
def solution(line,line1):a = [int(i) for i in line ]b = [int(i) for i in line1 ]#先比较哪个数大if len(a)<len(b) or (len(a)==len(b) and a[0]<b[0]):s=aa=bb=sres = ''#从末尾开始相减for i in range(len(b)):flag_a = len(a)-1-iflag_b = len(b)-1-iif a[flag_a]>= b[flag_b]:res = str(a[flag_a]-b[flag_b])+reselse:res = str(10+a[flag_a]-b[flag_b])+reswhile a[flag_a-1]==0:a[flag_a-1]=9flag_a -= 1a[flag_a-1] -= 1for j in range(len(a)-1-i-1,-1,-1):res = str(a[j])+reszero_flag=0for i in range(len(res)):if res[i]!='0':zero_flag=1breakif zero_flag==0:return 0return res[i:]
#大数乘法运算
def multi(line,line1):a = [int(i) for i in line ]b = [int(i) for i in line1 ]#建立一个列表长度为a+b长度的和,并反转a,b列表c=[0]*(len(a)+len(b))a=a[::-1]b=b[::-1]#print(a,b)#用双重循环让两数的对应位依次相乘,结果放到c的i+j位for i in range(len(b)):for j in range(len(a)):c[i+j]+=a[j]*b[i]#print(c[i+j],a[j],b[i])#如果结果大于9则产生进位if c[i+j]>9:c[i+j+1]+=c[i+j]//10c[i+j]=c[i+j]%10#反转结果列表输出结果c=c[::-1]#print(c)res=""i =0while c[i]==0:i+=1for j in c[i:]:res+=str(j)return res
#大数幂模运算
def mimo(a,b):#a(data)为底数,b(data1)为指数,c(input)为模数print("底数:",a)print("指数:",b)global cc= int(input("输入模数:"))a=a%c#对于取模运算有(a*b)%c=(a%c)*(b%c)%cans=1while b!=0:if b&1:ans=(ans*a)%cb>>=1#移位a=(a*a)%creturn ans
#测试用例
def main():fo=open("data.txt","r")data=fo.read()data=str(data)print("data:为:",data)a=int(data)fo.close()fo1=open("data1.txt","r")data1=fo1.read()data1=str(data1)print("data1:为:", data1)b=int(data1)fo1.close()array1 = [int(i) for i in data ]array2 = [int(i) for i in data1 ]sum=sumab(array1, array2)print("两个大数相加的结果是:",sum)s=solution(array1,array2)print("两个大数相减的结果是:",s)mult=multi(array1,array2)print("两个大数相乘的结果是:",mult)ans=mimo(a,b)#输出底数的指数次方的结果对模数求模的结果为print("data的dat1次方对{}求模的结果为:{}".format(c,ans))
if __name__ == '__main__':main()

大数运算python编程实现相关推荐

  1. python编程规则_python编程规则

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 只有写一个完整的不依赖系统命令(如,复杂的程序)的情况下才有必要用到python ...

  2. 【PAT甲级 大数运算】1065 A+B and C (64bit) (20 分) Python 全部AC

    题目 初学python,第一次用python刷oj,挑了个简单题试试手. 在大数运算方面,python没有数的大小限制,简直开挂. total = int(input()) for i in rang ...

  3. python编程中的运算_Python编程中的四大运算法则

    接触过编程的人都知道,编程中的数学知识无处不在,通过数学建模能够解决我们实际生活中的很多问题.当然这并不是说必须要成为一名数学大神才能学编程,但掌握数学知识在编程中的表达方法却是很有必要的,今天南京小 ...

  4. python编程加减法_python编程题之二进制加减法运算的案例分析

    python编程题之二进制加减法运算的案例分析 发布时间:2020-10-27 09:24:11 来源:亿速云 阅读:62 作者:小新 小编给大家分享一下python编程题之二进制加减法运算的案例分析 ...

  5. 2018年全国高校教师“Python编程、应用及华为大数据”培训班

    关于举办2018年全国中高等院校教师 "Python编程.应用及华为大数据"培训班通知 全国各中高等院校计算机.软件等相关院(系): Python是一门免费.开源的跨平台高级动态编 ...

  6. 2018年全国中高等院校教师“Python编程、应用及华为大数据” 、“网络空间安全”、“区块链”培训班...

    关于举办2018年全国中高等院校教师"Python编程.应用及华为大数据" ."网络空间安全"."区块链"培训班通知 全国各中高等院校计算机 ...

  7. 马斯克如何颠覆航天? 1/5385成本,c++和python编程!

    马斯克如何颠覆航天? 1/5385成本,c++和python编程! 5月31日,经历了重重困难,马斯克的SpaceX载人飞船成功发射,这是美国自2011年以来首次发射载人航天飞船,也是美国进入由商业主 ...

  8. Python编程规范及性能优化

    为什么80%的码农都做不了架构师?>>>    Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器 ...

  9. 独家 | 在Python编程面试前需要学会的10个算法(附代码)

    作者:AnBento 翻译:陈超 校对:陈丹 本文长度为3300字,建议阅读10+分钟 本文为大家介绍了最近在Python编程面试中反复出现的10个基础算法问题,并且给出了相应的解答过程. Photo ...

  10. python重复元素判定编程_从零开始学Python编程四:条件判断与循环

    前面已经介绍了不少Python基础知识,大家不要觉得不耐烦,想要学好Python,做好Python开发,一定要打牢基础.大家也发现了,Python中很多基础知识和数学算法是一样的,比如今天要教给大家的 ...

最新文章

  1. react antd Table 选中某一行,其它行也被选中了
  2. CV公开课报名 | 快速搭建基于Python的车辆信息识别系统
  3. 首届中国IT架构大师高峰论坛(十年架构之路汇成一句话!)
  4. java if and_关于java:if语句中可以有两个条件吗
  5. h3c怎么创建虚拟服务器,h3c 设置虚拟服务器
  6. 网摘--2014年5月12日
  7. 根据实例说数据库设计(一)—— 人员管理
  8. JavaScript学习总结(四)——逻辑OR运算符详解
  9. 【牛客 - 551F】CSL 的神奇序列(推公式,猜结论,母函数)
  10. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 24丨不同国家的天气类型【难度简单】​
  11. 楼梯计算机公式,各种楼梯面积的计算公式汇总
  12. 11.13 模10计数器设计
  13. Hadoop 系列之 HDFS
  14. matlab传函零极点形式,2013实验一 MATLAB 中控制系统模型的建立与仿真
  15. HealthKit教程 Swift版:锻炼信息
  16. 创业公司的个人“可伸缩性”方案
  17. html自动弹出公告代码,网页html弹窗公告代码
  18. android手机密码忘了哪个电话打开,如果手机锁屏密码忘记了怎么办_安卓手机锁屏密码忘了的处理办法-系统城...
  19. perl下载与环境安装
  20. python项目-Python 的练手项目有哪些值得推荐?

热门文章

  1. 一文读懂声纹采集、声纹识别、声纹数据库系统等声纹识别技术在公安业务领域的应用场景
  2. MovieLens官网数据集解释
  3. Android Layout
  4. YYtext简单使用
  5. web-UI设计(设计思路篇)
  6. mappedby 详解
  7. 全网首发PHP版留言系统源码
  8. UCOS操作系统——系统内部任务(六)
  9. Java八大基本数据类型
  10. html调用矢量小图标的方法,Web 前端矢量小图标的使用方法