Erlang :math.pow имеет некоторые ограничения, например, он не позволит действительно высоким целым степеням:
iex(10)> :math.pow(2, 10000)
** (ArithmeticError) bad argument in arithmetic expression
Вы можете легко переопределить быстрый алгоритм вычисления полномочий, который будет работать с произвольно большими целыми числами, предоставляемыми средой выполнения:
defmodule Pow do
require Integer
def pow(_, 0), do: 1
def pow(x, n) when Integer.is_odd(n), do: x * pow(x, n - 1)
def pow(x, n) do
result = pow(x, div(n, 2))
result * result
end
end
iex(9)> Pow.pow(2, 10000)
19950631168807583848837421626835850838234968318861924548520089498529438830...
Ответ 3
Вот оптимизированная реализация функции мощности для хвостового вызова: