名にし負はば逢坂山のさねかづら人に知られで来るよしもがな
Advent Calendar 2022 74日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
**
がありました。
Elixir 1.13 or laterです。
1.13から追加されています。
**
の意味はもちろんべき乗の計算です。
Power operatorです。
base ** e
は、
$base^e$
です。
実行
iex> 2 ** 3
8
iex> 2 ** 0
1
内部実装
base
、exponent
ともに整数である場合の実装を抜き出してみます。
def base ** exponent when is_integer(base) and is_integer(exponent) and exponent >= 0 do
integer_pow(base, 1, exponent)
end
# https://en.wikipedia.org/wiki/Exponentiation_by_squaring
defp integer_pow(_, _, 0),
do: 1
defp integer_pow(b, a, 1),
do: b * a
defp integer_pow(b, a, e) when :erlang.band(e, 1) == 0,
do: integer_pow(b * b, a, :erlang.bsr(e, 1))
defp integer_pow(b, a, e),
do: integer_pow(b * b, a * b, :erlang.bsr(e, 1))
詳しい説明は省きます。
- Exponentiation by squaringに従っているようです
- ビット演算を巧みにつかって計算量を減らしています
-
:erlang.band
は、Bitwise AND です -
:erlang.bsr
は、Bitshift rightです
$2^3$と$2^2$を紙に書いてどう実行されるのかを書き出してみると、なんとなくみえてくるとおもいます。
ちなみに、2 ** 4.0
といったように整数以外を含んで使用した場合は、 :math.pow/2 が呼び出されています。
Wrapping up
この記事は、Elixir 1.13で追加された**
(Power operator)について説明をしました。
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
以上です。
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!