GVKun编程网logo

如何用python计算大数?(python 大数计算)

22

在本文中,我们将为您详细介绍如何用python计算大数?的相关知识,并且为您解答关于python大数计算的疑问,此外,我们还会提供一些关于python–计算大数的二项式概率、python计算大文件的m

在本文中,我们将为您详细介绍如何用python计算大数?的相关知识,并且为您解答关于python 大数计算的疑问,此外,我们还会提供一些关于python – 计算大数的二项式概率、python计算大文件的md5、sha1值、Python计算大文件行数方法及性能比较、[零基础学python]用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 – 计算大数的二项式概率

python – 计算大数的二项式概率

我想在 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值

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计算大文件行数方法及性能比较

如何使用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计算

[零基础学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计算的相关信息,请在本站寻找。

本文标签: