我需要重复评估形式
的多项式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的任何实现。
答案 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
的中间值。