繰り返し2乗法

はじめに

Atcoderの解説を見ていて繰り返し2乗法と言う言葉を聞いて知らなかったので調べてみた

簡単に言うと

  • 210などの計算を楽にする
  • O(log n)で計算できる

    理論

    210といった数を計算すると

[tex:
\begin{align}
 2^{10} &= 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2\\
&= 4 \times 4 \times 4 \times 4 \times 4 \\
&= 16 \times 16 \times 4 \\
&= 16 \times 64 
\end{align}
]

350の時以下の様に掛ける数を2の累乗にして計算回数を減らすことができる。

[tex:
\begin{align}
50 &= 2^5 + 2^4 + 2^1 \\
3^{50} &= 3^{2^{2^{2^{2^{2}}}}} \times 3^{2^{2^{2^{2}}}} \times 3^2
\end{align}
]

以上の様に表すことが可能であるためO(log n)で計算することが可能.

プログラム

def pow(x, n):
    ans = 1
    while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
    return ans

pythonではpow()が繰り返し2乗法で動作しているため自分で組む必要はないらしい