"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo calcular eficientemente (a^b)%MOD con exponentes grandes?

¿Cómo calcular eficientemente (a^b)%MOD con exponentes grandes?

Publicado el 2024-11-12
Navegar:724

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

Calcular (a^b)%MOD con exponentes grandes

En este desafío de codificación, la tarea es calcular el valor de pow( a, b)%MOD, donde el exponente b puede ser extremadamente grande. Si bien el método convencional de complejidad temporal log(b) es adecuado para valores más pequeños, resulta poco práctico cuando b excede la capacidad de tipos de datos largos en C.

Sin embargo, un enfoque más eficiente implica aprovechar la función totient de Euler, φ(MOD). El teorema de Euler establece que a^φ(MOD)≡1(mod MOD). Esto significa que la potencia de a se puede reducir significativamente a a^(b % φ(MOD)).

Calcular φ(MOD) no es en sí mismo una tarea trivial, pero se puede lograr utilizando métodos de factorización de enteros. . Una vez calculado, el exponente b se puede reemplazar con b % φ(MOD) para reducir drásticamente el tiempo de cálculo.

Más refinamientos

En 2008, Schramm demostró que φ (b) se puede obtener a partir de la transformada discreta de Fourier de mcd(b, i), para i que va de 1 a b. Esto elimina la necesidad de una factorización explícita.

Además, la función de Carmichael, λ(MOD), se puede utilizar para obtener la respuesta correcta, especialmente cuando a y MOD comparten factores comunes.

Implementación de código

El siguiente fragmento de código sirve como ejemplo 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 
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3