ハミングの問題

ハンミング数に挑戦して失敗した - みずぴー日記からですが、元は2^i * 3^j * 5^k なる整数 DouKaku? です。 これはハミングの問題として知られているようで、C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー) (単行本) に Hamming の問題として出ています。 ここでは、このアルゴリズムを用います。

#! /usr/bin/gawk -f
# hamming.awk
# Ref: 「C言語による最新アルゴリズム事典」(ISBN-10: 4874084141) P.361

BEGIN {
    j2 = j3 = j5 = 0;
    x2 = x3 = x5 = 1;

    for (i = 0; i < 100; i++) {
        min = x2;
        if (x3 < min) {
            min = x3;
        }
        if (x5 < min) {
            min = x5;
        }

        hamming[i] = min;

        while (x2 <= min) {
            x2 = 2 * hamming[j2++];
        }
        while (x3 <= min) {
            x3 = 3 * hamming[j3++];
        }
        while (x5 <= min) {
            x5 = 5 * hamming[j5++];
        }
    }

    for (i = 0; i < 100; i++) {
        print hamming[i];
    }
}

実行してみましょう。

$ gawk -f hamming.awk
1
2
3
4
5
6
8
9
10
12
<snip>

2^i * 3^j * 5^k なる整数 DouKaku? でも同様のアルゴリズムで解いている解答が多いようです。

最初、素因数分解を用いて解けると思ったのですが、専用のアルゴリズムの方がはるかに高速です。(そもそも 0, 1 は素数でないので素因数分解では解けません)

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png