【问题标题】:How to calculate pow() with modulo for real numbers? [closed]如何用模数计算 pow() 实数? [关闭]
【发布时间】:2016-04-01 23:18:32
【问题描述】:

我想执行结合模数的幂运算。我无法使用实数执行此 pow() 函数。

这适用于整数:

pow(2,6000,400) = 176

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

pow(1.4142, 6000, 400)

我也尝试过math.pow() 函数,但它没有 也可以工作......我怎样才能让它与实数一起工作?

【问题讨论】:

  • 你使用什么编程语言?
  • 我只使用 VB 和 Python

标签: python vb.net pow


【解决方案1】:

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

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

所以:

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

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

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 位。我让您作为练习编写一个以不那么手工的方式执行此操作的函数。

【讨论】:

  • 这很有帮助!!!!谢谢!!! :) 将对此进行试验。
  • Christophe,您能告诉我您认为“271.04”的返回值有多准确吗?会不会很精确?
  • 根据rules of error propagation,它是 +/- 0.4243,因此确切的值应该是 btw 270.62 和 271.48
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多