Herramientas de usuario

Herramientas del sitio


algoritmos-oia:enteros:elevar-rapidamente

Tabla de Contenidos

Enunciado

Calcular el resto de $a^b$ en la división por $m$. Acá, el número $b$ puede ser muy grande, y sin embargo la respuesta no, ya que calculamos el resto en la división por $m$.

Idea

La idea es aprovechar el hecho de que $a^b = (a^2)^{b/2}$. Vamos a implemente una función recursiva que eleve al cuadrado la base (haciendo simplemente la cuentita) y divida por dos el exponente. El único cuidado que hay que tener es que si $b$ es impar, al hacer $b/2$ estamos agarrando la parte entera de esa división, entonces tenemos que multiplicar por un $a$ más.

Código

int my_pow(int a, int b, int m){
    if(b==0){
        return 1;
    }else{
        if(b%2==0){
            return my_pow(a*a%m, b/2, m)%m;
        }else{
            return (a*my_pow(a*a%m, b/2, m))%m;
        }
    }
}

Si $m$ es grande, tanto como para que $a*a$ se pueda pasar del valor máximo de int, se recomienda usar long long int en esta función, o tener sumo cuidado (se pueden hacer cosas como 1LL*..., es decir, convertir a long long en el momento de un producto y luego al hacer $\%m$ el número vuelve a entrar en int).

algoritmos-oia/enteros/elevar-rapidamente.txt · Última modificación: 2017/11/23 08:41 por sebach