最近在做密码学问题的时候遇到一个问题,在N是一个大数的情况下,python会报出如下错误

这还是用高精度计算库NumPy的情况下,解决这个问题能直接想到的路子都走没了。

其实原理很简单,错误产生的原因就是浮点数表示精度不够,因为这是一个无理数,当然再高的精度也不能完全表示出来,所以要做的其实就是控制精度,规定算到什么精度为止就可以,在C语言里,这个似乎比较好控制,但是C语言表示不了这么大的数,还是得从python来。

这个问题显然自己写程序似乎也行,在打算自己写程序解决问题之前,查到网上对这个问题建议用Decimal解决,关于Decimal的介绍,请看Python decimal模块使用方法详解 - 知乎

我主要说说在用这个库的时候踩的坑

首先我们要解决的问题的关键在于getcontext().prec的设置,即设置有效位数

getcontext().prec=10

随后要将要加入计算的值全都转换成Decimal对应的类型才能计算

from sage.all import *
from decimal import *
from Crypto.Util.number import long_to_bytes
N = 13367670444925386618905223565692697563689631389303743687492359191402391260600730439405490714192972098573434775460998205253916458352811443281794120884443350761110998310107218960962090106111493577560733300479867086534004744662905430466853607319019574189236207649723355120428748904154996334238439378225948825471696133014526916271571079124860875535547589534137963358979271533826711557564027354044540179240792458470012156358009222056019336768724635455141469136507226943393438529258740962422284944707173450924655852142786364481599848670569897058613531306471923509253496337211410628937717247265029394768222946099440101570177
e = 11653632677999721030650155940286395154925158270422466895426930684647637485443513557719403995677286760266312240787075513305218560581601833597223812894258611308036080944769637757141970758911813890740442661722613622138368542115703509048235646994905836183678409361687923524001471969329130396794932374026526180035834948266916667959426578217649776887212620561611541948916730467398892874983623210990405269391381880914421480984066827383720803374788598794244588383887352297107931254486755419142502328701594505903998529213148550509532724460553088473042726546100813511698175756178251455288207195300485405253775501348832249772033
c = 898169947958272959311234653151196294553971916583827796326206121536891504608262635516866864653823429792660446456826492856047110387472467066355065441286833389855973007582988199819750013923959235125240762208249342831567988624064258050077329114616551466268718617404919729705524692124466327499157921704908743948118757024214514852496561857177983088656664297313246927527805376317265600180996213156718577629150365439478848074461885465671804089173008186923898369649583501485368126374896960876791254082254179393460261630873650426387783109345808488780052378580290975706752869882743774274815495055165457356826245685422896944650
getcontext().prec=10
beta = 0.34
delta = 0.02
amplification = 2048
import gmpy2
X = int(pow(Decimal(N),Decimal(beta)))
Y = int(pow(Decimal(N),Decimal(beta+delta)))

如果计算的值中有浮点数的最好还要用Decimal.from_float来传值

比如,改进后的(虽然在我这个问题中,结果是一样的)

getcontext().prec=10
beta = Decimal.from_float(0.34)
delta = Decimal.from_float(0.02)

最后就可以得到大整数的小数次方的值啦。

Python大整数的小数次方的计算(Decimal使用)相关推荐

  1. python 匹配整数或者小数(包括正数和负数)(简单易懂,代码可以直接运行)

    python 匹配整数或者小数(包括正数和负数)(简单易懂,代码可以直接运行) *这个实验算是五个正则表达式里面最难的的哪一个了,?是正则表达式里面贪婪与非贪婪的概念,有?则-?可有可无,刚好可以用于 ...

  2. python 大整数的精确计算——除法(/)、整数除法(//)

    ____tz_zs 误差来源 这是因为浮点运算永远只是一个近似值,特别是当你超出了你的CPU能够准确建模的范围(因为浮点运算是在硬件中处理的). 整数除法不需要把整数转换成浮点数,它只需要用整数相除, ...

  3. python 分离整数与小数_Python编程:离不开算术运算符的顺序结构

    今天讲解的是第二篇<离不开算术运算符的顺序结构>.本节主要针对几个不易理解的算术运算符进行介绍,并在了解顺序结构的基础上,学习信息技术学考中顺序结构编程.知识点学习共包括四关. 你准备好了 ...

  4. python浮点数整数、小数分离,整数取整

    Python里面提供了很友好的浮点数整数取整或者是整数.小数部分分离的相关函数,之前这方面我使用的较为频繁地两个方法是ceil和floor,两个方法都是math模块提供的,分别完成的是对给定数字的向上 ...

  5. python输出整数部分和小数_Python 正则表达式:只要整数和小数

    要求用户只能输入数字(包括整数和小数),如何用正则表达式验证用户输入? 以下为简单但不严谨的正则表达式: pat1='\d+(?:\.\d+)?'#整数或小数 #金额数值(小数或整数,整数部分每三位数 ...

  6. 1.13 编程基础之综合应用 47 大整数除法方法 python

    http://noi.openjudge.cn/ch0113/47/ """ 1.13 编程基础之综合应用 47 大整数除法方法一 http://noi.openjudg ...

  7. 判断整数小数_《除数是整数的小数除法》教学设计

    教材分析: <除数是整数的小数除法>是人教版小学数学五年级上册第三单元第一节的内容,它是在学生已经掌握了整数除法的意义和计算方法,小数的意义和性质等基础上进而来引导学生探索除数是整数的小数 ...

  8. 整数平方根:整数开方及大整数开方解决方法

    求整数N的开方,精度在0.001 二分法 若N大于1,则从[1, N]开始,low = 1, high = N, mid = low + (high - low) >> 1开始进行数值逼近 ...

  9. java大整数_java处理大整数

    /* 给两个大整数A和B,计算并输出A + B = ? */ import java.io.*; import java.util.*; import java.math.*; public clas ...

最新文章

  1. python requests_Python爬虫之requests模块
  2. element tree不刷新视图_不懂Linux Device Tree,被新人嘲笑之后,含泪写完
  3. java条码大小_java – 自定义条形码输入中缺少条形码高度
  4. VTK:平面源用法实战
  5. VMware通过vmdk文件创建虚拟机
  6. Redis:06---数据库管理
  7. SPSS统计指南【SPSS 003期】
  8. Ubuntu zip压缩文件夹 和解压文件
  9. 思考: 现有 图像分割算法 的缺陷
  10. 樊登读书搞定读后感_樊登读书人生定位读后感
  11. 化繁为简:Swift剔除数组中重复元素的几种姿势
  12. 百度地图jsApi,地图拖动,中心定位图标不动,准确获取拖动过后中心定位图标所在位置
  13. linux tao环境 安装_菜鸟Linux 编译TAO2.0a的问题,求高手指导
  14. react获取当前路由
  15. 图片查看器插件(带缩略图) - viewer.js
  16. Windows直接拖拽文件复制到虚拟机Ubuntu
  17. 机器学习零基础?手把手教你用TensorFlow搭建图像识别系统
  18. java jtable 复选框_java swing如何在JTable一个单元格添加多个复选框
  19. Mysql数据库的单表查询
  20. GNN金融应用之Classifying and Understanding Financial Data Using Graph Neural Network学习笔记

热门文章

  1. js制作bmi指数计算器代码
  2. 英灵神殿服务器linux,Valheim英灵神殿Linux云服务器如何安装MOD?
  3. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题
  4. ubuntu18.04+GTX2080 部署cuda10.2
  5. 用canvas属性写一个五角星哦
  6. Java制作数字加减法验证码
  7. 正则表达式-匹配各种特殊字符
  8. csdn一个神奇的网站
  9. 元宇宙大火,高通实力领跑,推动XR成为下一代计算平台
  10. shell cut命令