在本文中,我们将为您详细介绍如何用python计算大数?的相关知识,并且为您解答关于python大数计算的疑问,此外,我们还会提供一些关于python–计算大数的二项式概率、python计算大文件的m
在本文中,我们将为您详细介绍如何用python计算大数?的相关知识,并且为您解答关于python 大数计算的疑问,此外,我们还会提供一些关于python – 计算大数的二项式概率、python计算大文件的md5、sha1值、Python计算大文件行数方法及性能比较、[零基础学python]用Python计算的有用信息。
本文目录一览:- 如何用python计算大数?(python 大数计算)
- python – 计算大数的二项式概率
- python计算大文件的md5、sha1值
- Python计算大文件行数方法及性能比较
- [零基础学python]用Python计算
如何用python计算大数?(python 大数计算)
我目前正在尝试查找x的值,
x = (math.log(X) - math.log(math.fabs(p))/math.log(g))
与:
X = 53710695204323513509337733909021562547350740845028323195225592059762435955297110591848019878050853425581981564064692996024279718640577281681757923541806197728862534268310235863990001242041406600195234734872865710114622767319497082014412908147635982838670976889326329911714511434374891326542317244606912177994106645736126820796903212224p = 79293686916250308867562846577205340336400039290615139607865873515636529820700152685808430350565795397930362488139681935988728405965018046160143856932183271822052154707966219579166490625165957544852172686883789422725879425460374250873493847078682057057098206096021890926255094441718327491846721928463078710174998090939469826268390010887g = 73114111352295288774462814798129374078459933691513097211327217058892903294045760490674069858786617415857709128629468431860886481058309114786300536376329001946020422132220459480052973446624920516819751293995944131953830388015948998083956038870701901293308432733590605162069671909743966331031815478333541613484527212362582446507824584241
不幸的是,python本身无法处理这么大的数字。
有人知道解决这个问题的方法吗?
感谢您的帮助。
编辑
由于很多您想知道我正在尝试做什么:
为了能够以安全的方式进行通信,Alice和Bob进行了Diffie-Hellman密钥交换。为此,他们使用质数p:
p = 79293686916250308867562846577205340336400039290615139607865873515636529820700152685808430350565795397930362488139681935988728405965018046160143856932183271822052154707966219579166490625165957544852172686883789422725879425460374250873493847078682057057098206096021890926255094441718327491846721928463078710174998090939469826268390010887
和整数g:
g = 73114111352295288774462814798129374078459933691513097211327217058892903294045760490674069858786617415857709128629468431860886481058309114786300536376329001946020422132220459480052973446624920516819751293995944131953830388015948998083956038870701901293308432733590605162069671909743966331031815478333541613484527212362582446507824584241
爱丽丝选择了秘密数字x,她计算出X = g ^ x mod p并通过一个不安全的信道将X发送给鲍勃。鲍勃选择了秘密编号y,他计算出Y = g ^ y mod
p,并通过同一不安全的通道将Y发送给爱丽丝。两者都可以计算出值Z = X ^ y = Y ^ x = g ^ xy mod p
通过监视频道,查理检索X和Y的值:
X = 53710695204323513509337733909021562547350740845028323195225592059762435955297110591848019878050853425581981564064692996024279718640577281681757923541806197728862534268310235863990001242041406600195234734872865710114622767319497082014412908147635982838670976889326329911714511434374891326542317244606912177994106645736126820796903212224Y = 17548462742338155551984429588008385864428920973169847389730563268852776421819130212521059041463390276608317951678117988955994615505741640680466539914477079796678963391138192241654905635203691784507184457129586853997459084075350611422541722123509121359133932497700621300814065254996649070135358792927275914472632707420292830992294921992
此练习的关键是Z值的md5sum
答案1
小编典典您可以使用Decimal库执行此操作:
from decimal import DecimalX = 53710695204323513509337733909021562547350740845028323195225592059762435955297110591848019878050853425581981564064692996024279718640577281681757923541806197728862534268310235863990001242041406600195234734872865710114622767319497082014412908147635982838670976889326329911714511434374891326542317244606912177994106645736126820796903212224p = 79293686916250308867562846577205340336400039290615139607865873515636529820700152685808430350565795397930362488139681935988728405965018046160143856932183271822052154707966219579166490625165957544852172686883789422725879425460374250873493847078682057057098206096021890926255094441718327491846721928463078710174998090939469826268390010887g = 73114111352295288774462814798129374078459933691513097211327217058892903294045760490674069858786617415857709128629468431860886481058309114786300536376329001946020422132220459480052973446624920516819751293995944131953830388015948998083956038870701901293308432733590605162069671909743966331031815478333541613484527212362582446507824584241X=Decimal(X)p=Decimal(p)g=Decimal(g)print X.ln() - abs(p).ln()/g.ln()
给
769.7443428855116199351294830
python – 计算大数的二项式概率
probability = scipy.misc.comb(n,k)*(P**k)*((1-p)**(n-k))
我得到的一些概率是无限的.我检查了一些p = inf的值.对于其中一个,n = 450,000,k = 17.该值必须大于1e302,这是浮点数处理的最大值.
然后我尝试使用sum(np.random.binomial(n,p,numberOfTrials)== valueOfInterest)/ numberOfTrials
这将绘制numberOfTrials样本并计算绘制valueOfInterest值的平均次数.
这不会带来任何无限的价值.但是,这是一种有效的方法吗?为什么这种方式不会提高任何无限值,而计算概率呢?
解决方法
像这样的东西:
combination_num = range(k+1,n+1) combination_den = range(1,n-k+1) combination_log = np.log(combination_num).sum() - np.log(combination_den).sum() p_k_log = k * np.log(p) neg_p_K_log = (n - k) * np.log(1 - p) p_log = combination_log + p_k_log + neg_p_K_log probability = np.exp(p_log)
由于数字较大,删除了数字下溢/溢出.在n = 450000且p = 0.5,k = 17的示例中,它返回p_log = -311728.4,i.例如,最终概率的对数非常小,因此在获取np.exp时会发生下溢.但是,您仍然可以使用日志概率.
python计算大文件的md5、sha1值
版权声明:本文系作者原创。未经许可,不得转载。
大文件如果一次性读入计算,会占用大量内存,可以分块读取、分块计算,效果与一次读取计算相同。代码如下:
import hashlib
import base64
''''''
sha1 file with filename (SHA1)
''''''
def SHA1FileWithName(fineName, block_size=64 * 1024):
with open(fineName, ''rb'') as f:
sha1 = hashlib.sha1()
while True:
data = f.read(block_size)
if not data:
break
sha1.update(data)
retsha1 = base64.b64encode(sha1.digest())
return retsha1
''''''
md5 file with filename (MD5)
''''''
def MD5FileWithName(fineName, block_size=64 * 1024):
with open(fineName, ''rb'') as f:
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
retmd5 = base64.b64encode(md5.digest())
return retmd5
Python计算大文件行数方法及性能比较
如何使用Python快速高效地统计出大文件的总行数, 下面是一些实现方法和性能的比较。
- 1.readline读所有行 使用
readlines
方法读取所有行:
def readline_count(file_name):
return len(open(file_name).readlines())
- 2.依次读取每行 依次读取文件每行内容进行计数:
def simple_count(file_name):
lines = 0
for _ in open(file_name):
lines += 1
return lines
- 3.sum计数 使用
sum
函数计数:
def sum_count(file_name):
return sum(1 for _ in open(file_name))
- 4.enumerate枚举计数:
def enumerate_count(file_name):
with open(file_name) as f:
for count, _ in enumerate(f, 1):
pass
return count
- 5.buff count 每次读取固定大小,然后统计行数:
def buff_count(file_name):
with open(file_name, ''rb'') as f:
count = 0
buf_size = 1024 * 1024
buf = f.read(buf_size)
while buf:
count += buf.count(b''\n'')
buf = f.read(buf_size)
return count
- 6.wc count 调用使用
wc
命令计算行:
def wc_count(file_name):
import subprocess
out = subprocess.getoutput("wc -l %s" % file_name)
return int(out.split()[0])
- 7.partial count 在buff_count基础上引入
partial
:
def partial_count(file_name):
from functools import partial
buffer = 1024 * 1024
with open(file_name) as f:
return sum(x.count(''\n'') for x in iter(partial(f.read, buffer), ''''))
- 8.iter count 在buff_count基础上引入
itertools
模块 :
def iter_count(file_name):
from itertools import (takewhile, repeat)
buffer = 1024 * 1024
with open(file_name) as f:
buf_gen = takewhile(lambda x: x, (f.read(buffer) for _ in repeat(None)))
return sum(buf.count(''\n'') for buf in buf_gen)
下面是在我本机 4c8g python3.6的环境下,分别测试100m、500m、1g、10g大小文件运行的时间,单位秒:
方法 | 100M | 500M | 1G | 10G |
---|---|---|---|---|
readline_count | 0.25 | 1.82 | 3.27 | 45.04 |
simple_count | 0.13 | 0.85 | 1.58 | 13.53 |
sum_count | 0.15 | 0.77 | 1.59 | 14.07 |
enumerate_count | 0.15 | 0.80 | 1.60 | 13.37 |
buff_count | 0.13 | 0.62 | 1.18 | 10.21 |
wc_count | 0.09 | 0.53 | 0.99 | 9.47 |
partial_count | 0.12 | 0.55 | 1.11 | 8.92 |
iter_count | 0.08 | 0.42 | 0.83 | 8.33 |
[零基础学python]用Python计算
一提到计算机,当然现在更多人把她叫做电脑,这两个词都是指computer。不管什么,只要提到她,普遍都会想到她能够比较快地做加减乘除,甚至乘方开方等。乃至于,有的人在口语中区分不开计算机和计算器。
那么,做为零基础学习这,也就从计算小学数学题目开始吧。因为从这里开始,数学的基础知识列为肯定过关了。
复习
还是先来重温一下伟大时刻,打印hello world.
打开电脑,让python idle运行起来,然后输入:
>>> print ''Hello, World''
Hello, World
细心的看官,是否注意到,我在这里用的是单引号,上次用的是双引号。两者效果一样,也就是在这种情况下,单引号和双引号是一样的效果,一定要是成对出现的,不能一半是单引号,另外一半是双引号。
四则运算
按照下面要求,在ide中运行,看看得到的结果和用小学数学知识运算之后得到的结果是否一致
>>> 2+5
7
>>> 5-2
3
>>> 10/2
5
>>> 5*2
10
>>> 10/5+1
3
>>> 2*3-4
2
上面的运算中,分别涉及到了四个运算符号:加(+)、减(-)、乘(*)、除(/)
另外,我相信看官已经发现了一个重要的公理:
在计算机中,四则运算和小学数学中学习过的四则运算规则是一样的
要不说人是高等动物呢,自己发明的东西,一定要继承自己已经掌握的知识,别跟自己的历史过不去。伟大的科学家们,在当初设计计算机的时候就想到列为现在学习的需要了,一定不能让后世子孙再学新的运算规则,就用小学数学里面的好了。感谢那些科学家先驱者,泽被后世。
下面计算三个算术题,看看结果是什么
- 4 + 2
- 4.0 + 2
- 4.0 + 2.0
看官可能愤怒了,这么简单的题目,就不要劳驾计算机了,太浪费了。
别着急,还是要在ide中运算一下,然后看看结果,有没有不一样?要仔细观察哦。
>>> 4+2
6
>>> 4.0+2
6.0
>>> 4.0+2.0
6.0
不一样的地方是:第一个式子结果是6,后面两个是6.0。
现在我们就要引入两个数据类型:整数和浮点数
对这两个的定义,不用死记硬背,google一下。记住爱因斯坦说的那句话:书上有的我都不记忆(是这么的说?好像是,大概意思,反正我也不记忆)。后半句他没说,我补充一下:忘了就google。
定义1:类似4、-2、129486655、-988654、0这样形式的数,称之为整数
定义2:类似4.0、-2.0、2344.123、3.1415926这样形式的数,称之为浮点数
比较好理解,整数,就是小学学过的整数;浮点数,就是小数。如果整数写成小数形式,比如4写成4.0,也就变成了浮点数。
爱学习,就要有探索精神。看官在网上google一下整数,会发现还有另外一个词:长整数(型)。顾名思义,就是比较长的整数啦。在有的语言中,把这个做为单独一类区分开,但是,在python中,我们不用管这个了。只要是整数,就只是整数,不用区分长短(以前版本区分),因为区分没有什么意思,而且跟小学学过的数学知识不协调。
还有一个问题,需要向看官交代一下,眼前可能用不到,但是会总有一些人用这个来忽悠你,当他忽悠你的时候,下面的知识就用到了。
整数溢出问题
这里有一篇专门讨论这个问题的文章,推荐阅读:整数溢出
对于其它语言,整数溢出是必须正视的,但是,在python里面,看官就无忧愁了,原因就是python为我们解决了这个问题,请阅读拙文:大整数相乘
ok!看官可以在IDE中实验一下大整数相乘。
>>> 123456789870987654321122343445567678890098876*1233455667789990099876543332387665443345566
152278477193527562870044352587576277277562328362032444339019158937017801601677976183816L
看官是幸运的,python解忧愁,所以,选择学习python就是珍惜光阴了。
上面计算结果的数字最后有一个L,就表示这个数是一个长整数,不过,看官不用管这点,反正是python为我们搞定了。
在结束本节之前,有两个符号需要看官牢记(不记住也没关系,可以随时google,只不过记住后使用更方便)
- 整数,用int表示,来自单词:integer
- 浮点数,用float表示,就是单词:float
可以用一个命令:type(object)来检测一个数是什么类型。
>>> type(4)
<type ''int''> #4是int,整数
>>> type(5.0)
<type ''float''> #5.0是float,浮点数
type(988776544222112233445566778899887766554433221133344455566677788998776543222344556678)
<type ''long''> #是长整数,也是一个整数
总结
- python里的加减乘除按照小学数学规则执行
- 不用担心大整数问题,python会自动处理
- type(object)是一个有用的东西
关于如何用python计算大数?和python 大数计算的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于python – 计算大数的二项式概率、python计算大文件的md5、sha1值、Python计算大文件行数方法及性能比较、[零基础学python]用Python计算的相关信息,请在本站寻找。
本文标签: