Ten pseudokod (Python) działa (zwraca x
do potęgi n
):
def pow(x, n):
if n == 1:
return x
else:
if n % 3 == 0:
k = pow(x, n // 3)
return k * k * k
else:
return x * pow(x, n - 1)
Teraz, Zobacz tutaj (exponentiation by squaring): https://en.wikipedia.org/wiki/Exponentiation_by_squaring#Basic_method
Też potęguje, i Porównaj do Twojego algorytmu:
jeśli x mod 3 == 0
zwróć; F(x, n div 3) * F(x, n div 3) * F(x, n div 3)
jeśli nie, to zwróć: x * x ^(n - 1) = x^n
.
Czyli, jak trafi na liczbę podzielną przez 3
to zwróci iloczyn trzech wywołań, a jak nie to będzie pomniejszać n
(aż będzie podzielne przez 3) i tak dalej; w każdym razie będzie to potęgowanie. Złożoność na pewno jest większa niż O(logn)
.
EDIT: Takich algorytków Możesz tworzyć więcej, weźmy 5
:
def pow(x, n):
if n == 1:
return x
else:
if n % 5 == 0:
k = pow(x, n // 5)
return k * k * k * k * k
else:
return x * pow(x, n - 1)
print(pow(2, 3)) # -> 8...