Algoritmo de potencia rápida-python

Después de leer la explicación del maestro, aquí está la teoría: Fast Power Algorithm (la guía más detallada en toda la red para guiarlo a optimizar paso a paso desde cero) - Blog CSDN

Ejemplo: Encuentre la potencia entera elevada por la base entera y exponencie el número entero num_mod.

El código de Python es el siguiente:

import time


def normalPower(base, power, num_mod):
    res = 1
    for i in range(int(power)):
        res = res * base % num_mod
    return res


def fastPower(base, power, num_mod):
    res = 1
    while power > 0:
        if power & 1:  # 优化掉: power % 2 == 1
            res = res * base % num_mod
        power >>= 1  # 优化掉: power = power // 2
        # base = (base * base) % num_mod
        temp_base = base % num_mod
        base = temp_base * temp_base % num_mod

    return res


if __name__ == '__main__':
    time1 = time.time()
    print(fastPower(2, int(1e8), 1000))
    print("fastPower Time:", round((time.time() - time1) * 1000, 5), 'ms')
    time2 = time.time()
    print(normalPower(2, int(1e8), 1000))
    print("normalPower Time:", round((time.time() - time2) * 1000, 5), 'ms')

El resultado es el siguiente

Hagamos el número un poco más grande :

print(fastPower(int(1e200), int(1e100), 1000))

El tiempo necesario sigue siendo 0,0 ms.

Analicémoslo :

1. El primero es la exponenciación rápida matricial: en comparación con los métodos tradicionales, el efecto de aceleración es directamente al nivel de milisegundos.

2. "Operación de bits" optimiza la operación de dividir por 2
potencia >>= 1 # Optimizar: potencia = potencia // 2

3. La "operación Y" optimiza el juicio de números pares
si potencia y 1: # Optimizar: potencia % 2 == 1

4. Aquí está mi optimización personal, considerando que el valor de la base puede ser muy grande.

        # Las siguientes dos líneas optimizan base = (base * base) % num_mod
        temp_base = base % num_mod
        base = temp_base * temp_base % num_mod

Después de la optimización general, es básicamente imposible encontrar un caso con un tiempo superior a 0,0 ms.

Supongo que te gusta

Origin blog.csdn.net/m0_37738114/article/details/133412639
Recomendado
Clasificación