ピタゴラス数を求める


元は Project Euler からですが、id:mzp さんのを見て awk でやってみようと思ったのでした。

#! /usr/bin/gawk -f
# pythag.awk - ピタゴラス数を求める
#   URL: http://odz.sakura.ne.jp/projecteuler/index.php?Problem%209

BEGIN {

    for (a = 1; a < 1000; a++) {
        # b の範囲も a, c で変更
        for (b = 1; b < 1000 - a - c; b++) {
            # c を従属変数にして 3 重ループを避ける
            c = sqrt(a ^ 2 + b ^ 2);
            # a < b を条件に加えないと解が 2 つ存在する
            if (c % 1 == 0 && a + b + c == 1000 && a < b) {
                print a, b, c, a * b * c;
                # 解は 1 つなので、以下の exit を有効にしても OK
                ##exit;
            }
        }
    }

時間がかかると思っていたけど、意外にすぐに見つかりました。
b, c を従属変数にして、整数かどうかを '%' 演算子で求めていますが、2 つめのループは危険ですね。せめて c ではなく int(c) かな。(w

$ time gawk -f pythag.awk
200 375 425 31875000
gawk -f pythag.awk  0.38s user 0.01s system 93% cpu 0.419 total

Celeron 600 MHz だとこんなもんかな。