N高速O(N)よりも^のモジュロを計算します

ナイル川の洪水:

私は計算する必要があります(a^n) mod b私は、このJavaコードを使用するが、それは十分に速くするときではありませんn大きすぎます。

for (long i = 0; i < n; i++) {
    ans = (ans * a) % b;
}

あなたは上記のコードで見ることができるように、nであるlong。このアルゴリズムは十分な速さではないので数。あなたは、任意のより高速なアルゴリズムを提案しますか?これは、この問題が、少し違うように思えることがあります。計算するための高速道のn!mが素数であるモッズメートル?

Kadul:

剰余演算の性質を活用

(x × y) modulo b == ((x modulo b) × (y modulo b)) modulo b

乗算ルールの上に使用することにより

(a^n) modulo b
= (a × a × a × a ... × a) modulo b 
= ((a modulo b) × (a modulo b) × (a modulo b) ... × (a modulo b)) modulo b

分割統治アプローチにより結果を計算します。漸化式は次のようになります。

f(x, n) = 0                     if n == 0

f(x, n) = (f(x, n / 2))^2       if n is even
f(x, n) = (f(x, n / 2))^2 * x   if n is odd

ここではC ++の実装は次のとおりです。

int powerUtil(int base, int exp, int mod) {
    if(exp == 0) return 1;
    int ret = powerUtil(base, exp / 2, mod) % mod;
    ret = 1LL * ret * ret % mod;
    if(exp & 1) {
        ret = 1LL * ret * base % mod;
    }
    return ret;
}

double power(int base, int exp, int mod) {
    if(exp < 0) {
        if(base == 0) return DBL_MAX; // undefined
        return 1 / (double) powerUtil(base, -exp, mod);
    }
    return powerUtil(base, exp, mod);
}

時間の複雑さがありますO(logn)

ここに私のオリジナルの答えがありますそれが役に立てば幸い!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188769&siteId=1