以模运算

时间:2016-04-04 15:30:18

标签: python hash modulo polynomials

我需要重复评估形式

的多项式

f(x)= c(0)+ c(1)* x + ... + c(k-1)* x ^(k-1)mod p

其中k是整数,p是大素数,c(0),...,c(p)在1和p之间。 对于我的应用程序,k = 10,p应大于1000。

我更愿意在Python中尽快完成此操作。我不太了解Python中的模运算来有效地实现它(例如如何利用我们可以使用Mersenne素数p = 2 ^ q-1,在这种情况下应该使用该乘法是寄存器移位,通过添加避免麻烦不同数量级的整数,......)。

动机:k独立散列,请参阅https://en.wikipedia.org/wiki/K-independent_hashing。这似乎是一个非常受欢迎的学术主题,但我无法找到k> 2的任何实现。

1 个答案:

答案 0 :(得分:1)

通常,您可以使用以下结构计算多项式的值:

def value(poly, x):
  """Evaluates a polynomial POLY for a given x.

  The polynomial is expressed as a list of coefficients, with 
  the coefficient for x ** N at poly[N].

  This means that x ** 2 + 2*x + 3 is expressed as [3, 2, 1].
  """
  v = 0

  # Bit messy, but we're basically generating the indexes of 
  # our polynomial coefficients from highest to lowest
  for coeff in reverse(poly):
    v = v * x + coeff

  return v

要评估此模数值,我们可以简单地将内部循环更改为v = v * x + poly[ix] % p(并将模数作为参数p传递)。

我们可以通过展开循环来证明示例多项式(x ^ 2 + 2x + 3)是正确计算的,并且看到我们所拥有的是(((1) * x + 2) * x + 3)(每个括号级别是循环中的一次迭代),这可以简化为1 * x * x + 2 * x + 3,这显然是预期的多项式。

通过使用它,我们永远不应该得到一个大于p * x的中间值。