2016-04-04 28 views
0

^(K-1)MOD P kは整数である評価多項式

は、pは大きな素数およびc(0)、...、C(p)は1とpの間です。 私のアプリケーションでは、k = 10、pは1000より大きい必要があります。

これはPythonでできるだけ早く行うことをお勧めします。私はこれを効率的に実装するためにPythonのモジュロ算術について十分に分かりません(例えば、メルセンヌの素数p = 2^q-1を使うことができるようにするにはどうすればよいでしょうか?その乗算はレジスタシフトです。異なる大きさの整数、...)。

動機:K-独立したハッシュ、https://en.wikipedia.org/wiki/K-independent_hashingを参照してください。これは非常に一般的な学問のようですが、私はk> 2の実装を見つけることができませんでした。一般的に

+0

これについては、math.stackexchange.com/ またはmathematica.stackexchange.comで質問してください。stackoveflow –

+2

https://docs.python.org/2/library/functions.html#powは便利です。二乗法で累乗を使ってx ** y%zを計算します。 –

答えて

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)。

ループを巻き戻して、われわれが持っているものが(((1) * x + 2) * x + 3)(各カッコのレベルはループを通した1回の反復)であることを見て、ポリノームの例(x^2 + 2x + 3)が正しく計算されることを示すことができます。 1 * x * x + 2 * x + 3に単純化されます。これは明らかに期待される多項式です。

これを使用することにより、我々はp * xよりも大きな中間値で終わることはありません。

+1

インデックスは必要ありません。係数を直接反復するだけです:逆関数(coeff in reverse(poly):v = v * x + coff')。 – chepner

+1

また、これは[Hornerの方法](https://en.wikipedia.org/wiki/Horner%27s_method)と呼ばれています。 – chepner

+1

ありがとうございます。これはHorner方式と呼ばれていると思います。しかし、私はまだ1つがさらに最適化できるはずだと信じています。例えば、GF(2^n)上の有限体算術で十分です(pはメルセンヌ素数です)。 – fact