"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment calculer efficacement (a^b)%MOD avec de grands exposants ?

Comment calculer efficacement (a^b)%MOD avec de grands exposants ?

Publié le 2024-11-12
Parcourir:172

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

Calcul (a^b)%MOD avec de grands exposants

Dans ce défi de codage, la tâche consiste à calculer la valeur de pow( a, b)%MOD, où l'exposant b peut être extrêmement grand. Bien que la méthode conventionnelle de complexité temporelle log(b) soit adaptée aux valeurs plus petites, elle devient peu pratique lorsque b dépasse la capacité des types de données long long en C .

Cependant, une approche plus efficace implique d'exploiter la fonction totient d'Euler, (MOD). Le théorème d'Euler stipule que a^φ(MOD)≡1(mod MOD). Cela signifie que la puissance de a peut être considérablement réduite à a^(b % φ(MOD)).

Le calcul de φ(MOD) est en soi une tâche non triviale, mais peut être réalisé à l'aide de méthodes de factorisation entières. . Une fois calculé, l'exposant b peut être remplacé par b % φ(MOD) pour réduire considérablement le temps de calcul.

Autres raffinements

En 2008, Schramm a démontré que φ (b) peut être obtenu à partir de la transformée de Fourier discrète de pgcd(b, i), pour i allant de 1 à b. Cela élimine le besoin d'une factorisation explicite.

De plus, la fonction de Carmichael, λ(MOD), peut être utilisée pour obtenir la bonne réponse, en particulier lorsque a et MOD partagent des facteurs communs.

Implémentation du code

L'extrait de code suivant sert d'exemple en C :

#include 
#include 

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 
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3