ピタゴラス数

 ある整数aとb(a > b)を選んで、
・2×a×b
・a×a - b×b
・a×a + b×b
で得られる3つの数はピタゴラスの三角形の各辺になっている、

らしい。

とりあえず簡単に作ってみた。

public void Func()
        {
            int a, b;
            int ans1, ans2, ans3;

            a = 2;
            b = 1;

            ans1 = 2 * a * b;
            ans2 = a * a - b * b;
            ans3 = a * a + b * b;

            if (ans3 * ans3 == ans2 * ans2 + ans1 * ans1)
            {
                Debug.WriteLine(string.Format("(a, b) = ({0}, {1})", a, b));
                Debug.WriteLine(string.Format("(ans1, ans2, ans3) = ({0}, {1}, {2})", ans1,ans2,ans3));
                Debug.WriteLine(string.Format("{0} + {1} = {2}", ans1 * ans1, ans2 * ans2, ans3 * ans3));
            }
        }

 2と1でやってみた結果がこれ

(a, b) = (2, 1)
(ans1, ans2, ans3) = (4, 3, 5)
16 + 9 = 25

確かにピタゴラス数になってた。

 計算してみればすぐ分かることで、
f:id:pongeponge:20140223173405j:plain
こんな感じ。

 本には「整数」と書いてあったけど、整数じゃなかったらどうなんだろう。

(a, b) = (2.25, 1.25)
(ans1, ans2, ans3) = (5.625, 3.5, 6.625)
31.640625 + 12.25 = 43.890625

いけるやん。

 aのほうが小さい場合は

(a, b) = (0.9, 1)
(ans1, ans2, ans3) = (1.8, -0.19, 1.81)
3.24 + 0.0361 = 3.2761

辺のひとつがマイナスになるな。
でもマイナスの辺を許容すれば三平方の式は成立してるのか。

追記:
 a, bをdoubleでやってると、(a, b) = (2.1, 1)の場合にdouble関連の誤差が出てうまくいなかい。
回避手段の追加が必要だけど、そこまでやる気は出ない。


ピタゴラスイッチ こたつたこDVDブック (#名称無し)