簡體   English   中英

模運算中的多項式求值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM