如何用实数模数计算pow()?

时间:2016-04-01 23:18:32

标签: python vb.net pow

我想结合模数执行动力操作。我在使用实数执行此pow()函数时遇到问题。

这适用于整数:

pow(2,6000,400) = 176

但是,这会返回实数的错误:

pow(1.4142, 6000, 400)

我也尝试了math.pow()功能,但它没有 工作要么......我怎么能用真实数字来处理这个?

1 个答案:

答案 0 :(得分:2)

python函数pow()接受2或3个参数。在您的情况下,pow(x,y,z)执行x次幂y并对结果应用模z。但是documentation是明确的:

  

如果第二个参数为负数,则第三个参数必须为   省略。如果存在z,则x和y必须是整数类型,并且y必须   是非消极的。

所以:

  • 您的第一个电话可以正常工作,因为参数符合要求。请注意,尽管pow(2,6000)是一个巨大的数字,但通过使用modular exponentiation整数上的属性,可以轻松计算组合模运算的结果而不会溢出。

  • 第二次调用因错误而失败,因为第一个参数不是整数。解决方法是将您的操作分解为pow(1.4142,6000) % 400,因为modulo是针对实数定义的。
    不幸的是,pow(1.4142,6000)太大而导致溢出错误。这是因为与C浮点编码范围无关的python整数相反,real numbers are limited

P.S。:我认为这是关于python而不是VB,因为VB's pow()只接受2个参数。

编辑:提示解决方法

这里有一个小的解决方法,它利用了这样一个事实,即从技术上讲,浮点数不是无限精度的数学实数,而是有理数。然后我们可以使用分子和分母并使用整数运算来掌握大数字:

n=pow(14142,6000)         # take the first argument multiplied by a 10 exponent to make it an integer
d=pow(10000,6000)         # keep track of this 10 exponent
i=n//d                    # integer division to compute the integral value
r=n-d*i                   # remainder of the integer division 
precision=6               # precision 
f=r*pow(10,precision)//d  # keep the 6 most significant digits 
result=(i%400)+(f/pow(10,precision)) 

结果是271.048181到第6位。我让你作为练习写一个以较少手工方式执行此功能的功能。