在模算术中评估多项式
Evaluating polynomials in modulo arithmetic
我需要重复计算
形式的多项式
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 中的 modulo 算术知之甚少,无法有效地实现这一点(例如,如何利用我们可以使用梅森素数 p=2^q-1 在这种情况下应该使用该乘法是寄存器移位,通过将不同数量级的整数相加来避免麻烦,...)。
动机:k 独立散列,参见 https://en.wikipedia.org/wiki/K-independent_hashing。这似乎是一个非常受欢迎的学术主题,但我找不到 k>2 的任何实现。
通常,您可以使用以下构造计算多项式的值:
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
为了评估这个模 a 值,我们可以简单地将内部循环更改为 v = v * x + poly[ix] % p
(并将我们的模作为参数 p 传递)。
我们可以通过展开循环来证明示例多项式 (x^2 + 2x + 3) 的计算是正确的,并且可以看到我们得到的是 (((1) * x + 2) * x + 3)
(每个括号级别是循环中的一次迭代), 这可以简化为 1 * x * x + 2 * x + 3,这显然是预期的多项式。
通过使用它,我们永远不会得到大于 p * x
的中间值。
我需要重复计算
形式的多项式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 中的 modulo 算术知之甚少,无法有效地实现这一点(例如,如何利用我们可以使用梅森素数 p=2^q-1 在这种情况下应该使用该乘法是寄存器移位,通过将不同数量级的整数相加来避免麻烦,...)。
动机:k 独立散列,参见 https://en.wikipedia.org/wiki/K-independent_hashing。这似乎是一个非常受欢迎的学术主题,但我找不到 k>2 的任何实现。
通常,您可以使用以下构造计算多项式的值:
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
为了评估这个模 a 值,我们可以简单地将内部循环更改为 v = v * x + poly[ix] % p
(并将我们的模作为参数 p 传递)。
我们可以通过展开循环来证明示例多项式 (x^2 + 2x + 3) 的计算是正确的,并且可以看到我们得到的是 (((1) * x + 2) * x + 3)
(每个括号级别是循环中的一次迭代), 这可以简化为 1 * x * x + 2 * x + 3,这显然是预期的多项式。
通过使用它,我们永远不会得到大于 p * x
的中间值。