Heim >Backend-Entwicklung >C++ >Wie kann man (a^b)%MOD mit großen Exponenten effizient berechnen?

Wie kann man (a^b)%MOD mit großen Exponenten effizient berechnen?

DDD
DDDOriginal
2024-10-28 18:57:29521Durchsuche

How to Efficiently Calculate (a^b)%MOD with Large Exponents?

Berechnung von (a^b)%MOD mit großen Exponenten

Bei dieser Codierungsherausforderung besteht die Aufgabe darin, den Wert von pow( zu berechnen a, b)%MOD, wobei der Exponent b extrem groß sein kann. Während die herkömmliche log(b)-Zeitkomplexitätsmethode für kleinere Werte geeignet ist, wird sie unpraktisch, wenn b die Kapazität von Long-Long-Datentypen in C überschreitet.

Ein effizienterer Ansatz beinhaltet jedoch die Nutzung der Totient-Funktion von Euler. φ(MOD). Der Satz von Euler besagt, dass a^φ(MOD)≡1(mod MOD). Dies bedeutet, dass die Potenz von a deutlich auf a^(b % φ(MOD)) reduziert werden kann.

Die Berechnung von φ(MOD) ist an sich keine triviale Aufgabe, kann aber mit ganzzahligen Faktorisierungsmethoden gelöst werden . Nach der Berechnung kann der Exponent b durch b % φ(MOD) ersetzt werden, um die Rechenzeit drastisch zu verkürzen.

Weitere Verfeinerungen

Im Jahr 2008 zeigte Schramm, dass φ (b) kann aus der diskreten Fourier-Transformation von gcd(b, i) erhalten werden, wobei i im Bereich von 1 bis b liegt. Dadurch entfällt die Notwendigkeit einer expliziten Faktorisierung.

Zusätzlich kann die Carmichael-Funktion λ(MOD) verwendet werden, um die richtige Antwort zu erhalten, insbesondere wenn a und MOD gemeinsame Faktoren haben.

Code-Implementierung

Der folgende Codeausschnitt dient als Beispiel in C:

<code class="cpp">#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

ll gcd(ll a, ll b) { return (b == 0) ? a : gcd(b, a % b); }

ll pmod(ll a, ll b, ll mod) {
    if (b == 0) return 1;
    if (b % 2 == 1) {
        return (a * pmod(a, b - 1, mod)) % mod;
    } else {
        ll tmp = pmod(a, b / 2, mod);
        return (tmp * tmp) % mod;
    }
}

int main() {
    ll a, b, mod;
    cin >> a >> b >> mod;
    cout << pmod(a, b % phi(mod), mod) << endl;
    return 0;
}</code>

Das obige ist der detaillierte Inhalt vonWie kann man (a^b)%MOD mit großen Exponenten effizient berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn