Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python计算庞大的数字?_Python_Numpy - Fatal编程技术网

如何使用python计算庞大的数字?

如何使用python计算庞大的数字?,python,numpy,Python,Numpy,我现在正试图找到x的值 x = (math.log(X) - math.log(math.fabs(p))/math.log(g)) 与: X = 5371069520432351350933773390902156254735074084502832319522559205976243595529711059184801987805085342558198156406469299602427971864057728168175792354180619772886253426831023586

我现在正试图找到x的值

x = (math.log(X) - math.log(math.fabs(p))/math.log(g))
与:

X = 53710695204323513509337733909021562547350740845028323195225592059762435955297110591848019878050853425581981564064692996024279718640577281681757923541806197728862534268310235863990001242041406600195234734872865710114622767319497082014412908147635982838670976889326329911714511434374891326542317244606912177994106645736126820796903212224

p = 79293686916250308867562846577205340336400039290615139607865873515636529820700152685808430350565795397930362488139681935988728405965018046160143856932183271822052154707966219579166490625165957544852172686883789422725879425460374250873493847078682057057098206096021890926255094441718327491846721928463078710174998090939469826268390010887

g = 73114111352295288774462814798129374078459933691513097211327217058892903294045760490674069858786617415857709128629468431860886481058309114786300536376329001946020422132220459480052973446624920516819751293995944131953830388015948998083956038870701901293308432733590605162069671909743966331031815478333541613484527212362582446507824584241
不幸的是,python无法处理如此大的数字

有人知道解决这个问题的方法吗

谢谢你的帮助


编辑

因为很多时候你都想知道我想做什么:

为了能够以安全的方式进行通信,Alice和Bob进行了Diffie-Hellman密钥交换。为此,他们使用质数p:

p = 79293686916250308867562846577205340336400039290615139607865873515636529820700152685808430350565795397930362488139681935988728405965018046160143856932183271822052154707966219579166490625165957544852172686883789422725879425460374250873493847078682057057098206096021890926255094441718327491846721928463078710174998090939469826268390010887
整数g:

g = 73114111352295288774462814798129374078459933691513097211327217058892903294045760490674069858786617415857709128629468431860886481058309114786300536376329001946020422132220459480052973446624920516819751293995944131953830388015948998083956038870701901293308432733590605162069671909743966331031815478333541613484527212362582446507824584241
Alice选择密码x,她计算x=g^x mod p,并通过一个不安全的通道将x发送给Bob。 Bob选择密码y,计算y=g^y mod p,并通过相同的不安全通道将y发送给Alice。 两者都可以计算值Z=X^y=y^X=g^xy mod p

通过监视通道,Charlie检索X和Y的值:

X = 53710695204323513509337733909021562547350740845028323195225592059762435955297110591848019878050853425581981564064692996024279718640577281681757923541806197728862534268310235863990001242041406600195234734872865710114622767319497082014412908147635982838670976889326329911714511434374891326542317244606912177994106645736126820796903212224

Y = 17548462742338155551984429588008385864428920973169847389730563268852776421819130212521059041463390276608317951678117988955994615505741640680466539914477079796678963391138192241654905635203691784507184457129586853997459084075350611422541722123509121359133932497700621300814065254996649070135358792927275914472632707420292830992294921992

此练习的关键是Z值的MD5和。您可以使用十进制库执行此操作:

from decimal import Decimal

X = 53710695204323513509337733909021562547350740845028323195225592059762435955297110591848019878050853425581981564064692996024279718640577281681757923541806197728862534268310235863990001242041406600195234734872865710114622767319497082014412908147635982838670976889326329911714511434374891326542317244606912177994106645736126820796903212224
p = 79293686916250308867562846577205340336400039290615139607865873515636529820700152685808430350565795397930362488139681935988728405965018046160143856932183271822052154707966219579166490625165957544852172686883789422725879425460374250873493847078682057057098206096021890926255094441718327491846721928463078710174998090939469826268390010887
g = 73114111352295288774462814798129374078459933691513097211327217058892903294045760490674069858786617415857709128629468431860886481058309114786300536376329001946020422132220459480052973446624920516819751293995944131953830388015948998083956038870701901293308432733590605162069671909743966331031815478333541613484527212362582446507824584241
X=Decimal(X)
p=Decimal(p)
g=Decimal(g)

print X.ln() - abs(p).ln()/g.ln()
给予

你可能会感兴趣。您可以进行符号简化并调整要使用的精度(使用
mpmath
):

结果是:

    769.744342885511619935129482917192487900343653888850271462255718268257261969359878869753342583593581927254506121925469662801405523964742213571689617098
更新:正如casevh和David所指出的,在使用Symphy时,应注意使用普通浮点数作为输入,以避免丢失准确性。为了澄清,让我们计算
10**log10(10+1e-30)
,这显然会导致10+1e-30:

import sympy as sy
import numpy as np

xf = 1e-30

# numpy with floats:
np_x1 = np.log10(10+ xf)
np_yf = 10**np_x1

# sympy with no extra benefit
sy1_x1 = sy.log(10 + xf) / sy.log(10)
sy1_ye = 10**sy1_x1
sy1_yf = sy1_ye.evalf(n=33)

# sympy, done right:
x = sy.symbols('x')
sy2_x1 = sy.log(10 + x) / sy.log(10)
sy2_ye = 10**sy2_x1
sy2_yf = sy2_ye.evalf(n=33, subs={x:xf})

print("correct answer: 10.0000000000000000000000000000010")
print("        numpy:  {:.31f}".format(np_yf))
print("  naive sympy:  " + repr(sy1_yf))
print("correct sympy:  " + repr(sy2_yf))
结果是:

correct answer: 10.0000000000000000000000000000010
        numpy:  10.0000000000000000000000000000000
  naive sympy:  10.0000000000000017763568394002504
correct sympy:  10.0000000000000000000000000000010
numpy float64数据类型的“机器ε”约为2.2e-16。这意味着您应该只期望结果中的前16位有效数字是准确的,除非您正在做一些非常棘手的事情(例如滚动您自己的自定义数据类型)

Dietrich建议使用Symphy并设置较高的内部精度,但确认这并不能避免机器epsilon问题

一些Python浮点值作为输入仅精确到15位左右,而其他的(分母为2的幂,如.125=1/4)是精确的


换言之,对与您的数字一样大的数字的计算结果要格外小心,因为只要您使用64位浮点进行计算,只有前16位有效数字才有意义。

使用Numpy而不是Python进行计算。结果和中间值是整数吗?大概不会,但您的输入(特别是
p
)是,您将
fabs
应用于其中一个…期望的答案是什么?NumPy不会比vanilla Python更好地处理这个问题。事实上,由于不同的长->浮点转换处理,它会很快崩溃。如果它们是整数,python会处理如此大的数字。事实上武断的大。如果您需要浮点,您应该尝试使用
Decimal
模块,或者
mpmath
Vanilla python会给出完全相同的结果。Vanilla python会给出相同的结果,并且比Decimal版本快约900倍。在python 2中。7@LucasB--使用Python 2.6.5,“香草”对我来说不起作用。正如抛出的“overflowerrror:long int太大,无法转换为float”。向所有整数添加“.0”以预转换为浮点数不会导致任何异常,但会导致“nan”结果。澄清一下:香草Python 3.3使用
math
模块,而不使用
fabs
,但是
abs
,因为
fabs
对于任何使用术语“香草Python”的人来说都没有意义:如果在任何一种情况下都必须只导入一个标准库模块,那么其中一个模块如何比另一个模块更普通???将精度设置为1000并不能真正为您提供1000位数的精度。真的,任何超过16岁的事情都毫无意义。参考我下面引用Symphy文档的答案。该值实际上是正确的。evalf()的输入值都是整数,因此不会因转换为64位浮点而导致精度损失。Dietrich的答案精确到指定的精度。您引用的句子仅在尝试对已转换为Python浮点的值执行高精度计算时适用。由于evalf()的输入是整数,因此不会丢失精度。
import sympy as sy
import numpy as np

xf = 1e-30

# numpy with floats:
np_x1 = np.log10(10+ xf)
np_yf = 10**np_x1

# sympy with no extra benefit
sy1_x1 = sy.log(10 + xf) / sy.log(10)
sy1_ye = 10**sy1_x1
sy1_yf = sy1_ye.evalf(n=33)

# sympy, done right:
x = sy.symbols('x')
sy2_x1 = sy.log(10 + x) / sy.log(10)
sy2_ye = 10**sy2_x1
sy2_yf = sy2_ye.evalf(n=33, subs={x:xf})

print("correct answer: 10.0000000000000000000000000000010")
print("        numpy:  {:.31f}".format(np_yf))
print("  naive sympy:  " + repr(sy1_yf))
print("correct sympy:  " + repr(sy2_yf))
correct answer: 10.0000000000000000000000000000010
        numpy:  10.0000000000000000000000000000000
  naive sympy:  10.0000000000000017763568394002504
correct sympy:  10.0000000000000000000000000000010