人気ブログランキング | 話題のタグを見る

ピタゴラス数

直角三角形の斜辺を c その他の辺を a, b とすると a^2 + b^2 = c^2 だが、そういう整数(ピタゴラス数)を集めてみた。

1辺の長さが10以下の直角三角形のピタゴラス数はつぎのようになる。

Prelude> [(a,b,c) | a <- [1..10], b <- [1..10], c <- [1..10], a^2 + b^2 == c^2]
[(3,4,5),(4,3,5),(6,8,10),(8,6,10)]

これでは、(3,4,5) と (4,3,5) のように順番が異なるが同じものを拾ってしまうので、a < b < c となるものだけを集めてみる。

Prelude> [(a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]
[(3,4,5),(6,8,10)]

(3,4,5) と (6,8,10) ではすべての辺が2倍になっているだけだから、(6,8,10) のようなものを除外して既約分数になるものだけを拾う。

Prelude> [(a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, foldr1 gcd [a,b,c] == 1]
[(3,4,5)]

上手くいったようなので数の範囲を100まで広げてみる。

Prelude> [(a,b,c) | c <- [1..100], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, foldr1 gcd [a,b,c] == 1]
[(3,4,5),(5,12,13),(8,15,17),(7,24,25),(20,21,29),(12,35,37),(9,40,41),(28,45,53),(11,60,61),(33,56,65),(16,63,65),(48,55,73),(36,77,85),(13,84,85),(39,80,89),(65,72,97)]

(3,4,5) や (5,12,13) など見慣れたものもあるが他の数は知らなかった。蛇足だが検算してみた。

Prelude> 36^2 + 77^2
7225
Prelude> 85^2
7225

ここで計算したピタゴラス数の数列に規則性はないようだが、小さい数のひとつは奇数で、もうひとつは偶数だ。また、最大の数は必ず奇数になる。理由はクイズにする。

ピタゴラス数の計算はプログラムとも言えないものだろうが、こういうちょっとした物が、さしてデバックもせずに、リアルタイムに結果が得られるのがうれしい。
by tnomura9 | 2012-12-02 10:41 | Haskell | Comments(0)
<< バイオ燃料に新たな可能性 畑村創造工学研究所 >>