blechmusikの日記

いろいろなことを書いています。

AutoHotkey 用冪乗を計算する関数

単純な実装方法のため、大きな数を扱うことは出来ないが、見出しの通りの関数を書いてみた。昨日書いた関数*1を一部で使用している。

;;; a decimal number in binary format
;;; n >= 1
to_binary_notation(n, m="")
{
    if (n = 0)
        return m
    else
        return to_binary_notation( n // 2, mod(n, 2) . m )
}

;;; JavaScriptで巨大整数演算 - faireal.net
;;; http://deztec.jp/x/05/faireal/25-index.html

power(n, m)
{
    m_digit := to_binary_notation(m)
    max := StrLen(m_digit)
    
    ;; powerを2進展開する
    Loop, %max%
    {
        StringRight, OutputVar, m_digit, 1
        StringTrimRight, m_digit, m_digit, 1

        m_digit_%A_Index% := OutputVar
    }

    ;; // n の2^m 乗を計算する
    Loop, %max%
    {
        prev_A_Index := A_Index - 1

        n_%A_Index%   := (A_Index = 1) ? n
                      :  (A_Index = 2) ? n ** 2
                      :                  n_%prev_A_Index% ** 2
    }

    Ret := 1

    Loop, %max%
    {
        if (m_digit_%A_Index%)
            Ret *= n_%A_index%
    }

    return Ret
}

この関数は power(3, 20) のように使用する。これで、 3^20、つまり 3 を 20 回掛け合わせる。power(3, 20) の実行結果は以下の通りである。

msgbox, % power(3, 20)
; 3 486 784 401