[英]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中的模算術了解不足以有效地實現這一點(例如,如何利用我們可以使用Mersenne素數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
要計算此模值,我們可以簡單地將內部循環更改為v = v * x + poly[ix] % p
(並將模數作為參數p傳遞)。
我們可以證明示例示例多項式(x ^ 2 + 2x + 3)是通過展開循環而正確計算的,並且看到我們擁有的是(((1) * x + 2) * x + 3)
(每個括號級別是一個循環),可以簡化為1 * x * x + 2 * x + 3,這顯然是期望的多項式。
通過使用它,我們永遠都不會以大於p * x
的中間值結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.