我如何在Elixir中求幂数?


71

如何在Elixir中计算具有指数的数字?

例如,2 3将返回8。

Answers:



65

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...

15

这是幂函数的尾部优化实现:

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)

1
非常好!将其替换:math.pow为Erlang的当前实现会很好。github.com/erlang/otp
内森·朗

3

如果以2为底并且幂是整数,则可以使用函数进行左移Bitwise.bsl。例如,可以使用以下公式计算2 3

> Bitwise.bsl(1, 3)
8

-1

Tis可以工作-当我学到足够多的知识以确切知道它为什么工作时,这将是很棒的-可能与eval在幕后有关:

defmodule Example do
  require Integer

  def do_it(list) do
    list
    |> Enum.reject(&Integer.is_odd(&1))
    |> Enum.map(&(:math.pow(&1,3)))
  end

end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.