web-dev-qa-db-ja.com

Elixirで数値を累乗するにはどうすればよいですか?

Elixirで指数を使用して数値を計算するにはどうすればよいですか?

たとえば、23 8を返します。

61
Nathan Long

Erlang:math module を使用します

:math.pow(2,3) #=> 8.0

整数が必要な場合:

:math.pow(2,3) |> round #=> 8
69
Nathan Long

アーランの: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...
59
Paweł Obrok

以下は、パワー関数の末尾呼び出し最適化実装です。

def  pow(n, k), do: pow(n, k, 1)        
defp pow(_, 0, acc), do: acc
defp pow(n, k, acc), do: pow(n, k - 1, n * acc)
12
markusheilig