Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengira dengan Cekap (a^b)%MOD dengan Eksponen Besar?

Bagaimana untuk Mengira dengan Cekap (a^b)%MOD dengan Eksponen Besar?

DDD
Lepaskan: 2024-10-28 18:57:29
asal
583 orang telah melayarinya

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

Mengira (a^b)%MOD dengan Eksponen Besar

Dalam cabaran pengekodan ini, tugasnya adalah untuk mengira nilai pow( a, b)%MOD, di mana eksponen b boleh menjadi sangat besar. Walaupun kaedah kerumitan masa log(b) konvensional sesuai untuk nilai yang lebih kecil, ia menjadi tidak praktikal apabila b melebihi kapasiti jenis data yang panjang dalam C .

Walau bagaimanapun, pendekatan yang lebih cekap melibatkan memanfaatkan fungsi totien Euler, φ(MOD). Teorem Euler menyatakan bahawa a^φ(MOD)≡1(mod MOD). Ini bermakna kuasa a boleh dikurangkan dengan ketara kepada a^(b % φ(MOD)).

Mengira φ(MOD) itu sendiri adalah tugas yang tidak remeh, tetapi boleh dicapai menggunakan kaedah pemfaktoran integer . Setelah dikira, eksponen b boleh digantikan dengan b % φ(MOD) untuk mengurangkan masa pengiraan secara mendadak.

Pemurnian Lanjut

Pada tahun 2008, Schramm menunjukkan bahawa φ (b) boleh didapati daripada penjelmaan Fourier diskret bagi gcd(b, i), untuk i antara 1 hingga b. Ini menghapuskan keperluan untuk pemfaktoran eksplisit.

Selain itu, fungsi Carmichael, λ(MOD), boleh digunakan untuk mendapatkan jawapan yang betul, terutamanya apabila a dan MOD berkongsi faktor sepunya.

Pelaksanaan Kod

Coretan kod berikut berfungsi sebagai contoh dalam 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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengira dengan Cekap (a^b)%MOD dengan Eksponen Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan