W_t = M_t[i] if 0 <= t <= 15
W_t = ROTL_1(W_(t-3) XOR W_(t-8) XOR W_(t-14) XOR W_(t-16)) if 16 <= t <= 79
これはSHA-1標準からのものです。haskellでは、これを行うための再帰関数を簡単に作成しますが、より効率的にするために、再帰全体を展開したいと思います。インライン化は機能しません。これは、コードの指数関数的な爆発を引き起こす可能性があるためです。私が念頭に置いているのは、THを記述して、までの定数line、などを生成するW_0
ことW_1
です。W_2
W_79
別の例は、ケースのループ展開です。
For t=0 to 79:
{
T = ROTL_5(a) + f_t(b, c, d ) + e + K_t + W_t
e = d
d = c
c = ROTL_30(b)
b = a
a = T
}
再帰的な関数呼び出しを避けるために、このループも展開したいと思います(そして、ghcがこの種の最適化を実行するとは思わない)。
それで、私が行ってこのためのTHを書く前に、これを行うためのより良い方法があるかどうか尋ねたかったのです。ここでは、最適化が非常に重要であると言っても過言ではありません。