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.