クイック&高速電力剰余乗算剰余

高速電力モジュロ

即ち、MOD Cの値の高速(A ^ B)を得ました。非常に大きなbの値は、直接オーバーフローや非効率的を引き起こす可能性があり、^ Bを見つけたときからです。

考え

原理に基づいている\(* Bが\%C =((\%のC)*(B用の\%のC))\%C \) \(A ^ Bの\%C =(\%のC)^ B \%Cは\)式。

高速電力を解きます:

Bのようにバイナリ形式で表現されたインデックス\(B =(1-N-B_N B_ {...} b_2b_1b_0)_2 \)

\(B = B_0 + B_1 * 2 ^ 1 + B_2 * 2 ^ 2 + ... + B_ {N-1} * 2 ^ {N-1} + B_N * 2 ^ n個の\)

\(^ B = A ^ {B_0 B_1 * ^ 2 2 ^ 1 + B_2 * 2 + ... + B_ {N-1} * 2 ^ {N-1} + B_N * 2 ^ N} = A ^ {B0} * A ^ {B_1 * 2 ^ 1} * A ^ {B_2 * 2 ^ 2} * ... * A ^ {B_ {N-1} * 2 ^ {N-1}} * A ^ {B_N * 2 ^ N} \)

\(A ^ Bの\の%C = A ^ {B0} * A ^ {B_1 * 2 ^ 1} * A ^ {B_2 * 2 ^ 2} * ... * A ^ {B_ {N-1} * 2 ^ {N-1}} * A ^ {B_N * 2 ^ N} \%Cは\)

セット\(K_n =(A ^ {N- B_N * 2 ^})\%C \) 場合BN = 0のKN =、Knの単語を求める。1、BN = 1 \(Knを=(A ^ {2 ^ N- })\%C \) このように算出した後考える\((A ^ ^ {N-2})\%C \)

\((^ {2 ^ N})\%C = [(^ {2 ^ {N-1}} \%のC)*(^ {2 ^ {N-1}} \%のC)] \%Cは\)ので、再帰的。

コード

パイソン

def quick_powmod(a, b, c):
    a = a % c
    ans = 1 # 存放结果
    while b != 0:
        if b & 1: # 二进制与
            ans = (ans * a) % c
        a = (a * a) % c # 取模是防止溢出
        b >>= 1 # 二进制向右移动一位
    return ans

例えば、A = 2、B = 10、C = 3、bは1010のバイナリ表現です。

\(^ 2 ^ {10} = {2 * 0+。1. 1 + 0 * 2 ^ 2 ^ 2 + 2 ^ * 3 1} \)、Bは、右から左に取らビットは、0であり、乗算その、1である、結果は疲れたのANS年かかる乗算されます。

迅速な乗算剰余

2進加算器を使用して乗算を変換します。

考え

高速べき乗剰余演算などは、乗算器の計算に変換します。

例えば、\(20 * 20 * 14 = 1110 2×2 ^ 20 = 0 * 0 * 2 ^ 20 + 1 + 20 * 1 * 1 * 2 ^ 2 + 2 ^ 20 * 3 * 1 \)

コード

パイソン

def quick_mulmod(a, b, c):
    ans = 0
    a = a % c
    while b != 0:
        if b & 1 :
            ans = (ans + a) % c
        a = (2*a) % c
        b >>= 1
    return ans

理解することはまだ非常に難しい一見すると、たとえば理解するために、再度導き出します。

おすすめ

転載: www.cnblogs.com/KRDecad3/p/11603873.html