** (Elixir)
このたびはぬさも取りあへずたむけ山もみぢのにしき神のまにまに(菅公)
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
内部実装
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!
Author And Source
この問題について(** (Elixir)), 我々は、より多くの情報をここで見つけました https://qiita.com/torifukukaiou/items/9d42a8635397896dae7b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .