"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como calcular eficientemente (a^b)%MOD com grandes expoentes?

Como calcular eficientemente (a^b)%MOD com grandes expoentes?

Publicado em 2024-11-12
Navegar:387

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

Calculando (a^b)%MOD com grandes expoentes

Neste desafio de codificação, a tarefa é calcular o valor de pow( a, b)%MOD, onde o expoente b pode ser extremamente grande. Embora o método convencional de complexidade de tempo log(b) seja adequado para valores menores, torna-se impraticável quando b excede a capacidade de tipos de dados longos em C.

No entanto, uma abordagem mais eficiente envolve aproveitar a função totiente de Euler, φ(MOD). O teorema de Euler afirma que a^φ(MOD)≡1(mod MOD). Isso significa que a potência de a pode ser significativamente reduzida para a^(b % φ(MOD)).

Calcular φ(MOD) é em si uma tarefa não trivial, mas pode ser alcançada usando métodos de fatoração de inteiros . Uma vez calculado, o expoente b pode ser substituído por b % φ(MOD) para reduzir drasticamente o tempo de cálculo.

Refinamentos adicionais

Em 2008, Schramm demonstrou que φ (b) pode ser obtido a partir da transformada discreta de Fourier de mdc(b, i), para i variando de 1 a b. Isso elimina a necessidade de fatoração explícita.

Além disso, a função de Carmichael, λ(MOD), pode ser usada para obter a resposta correta, especialmente quando a e MOD compartilham fatores comuns.

Implementação de código

O seguinte trecho de código serve como exemplo em 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 
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3