のてすきあ − 完全独習非プログラマー −

Haskell で Project Euler を解く素人遊び

Problem 9

a < b < c
a2 + b2 = c2
a + b + c = 1000
を満たす唯一の整数の組 (a,b,c) を見つけ、その積 abc を求める

これはリスト内包表記のもとにズバッと一刀両断で終了。


ズバッ…っと

ズバッ…と?

計算が終わらない。落ち着いて考えたらこれだとO(n3)あるのではないか。もっと軽くしなくては。

数学の知識を使って調べる(a,b,c)の組を減らす。

a2 + b2 = c2 を満たす整数(a,b,c)は別の整数(u,v)を用いて
a = 2uv
b = u2 - v2
c = u2 + v2
と表すことができる。

これで計算量をぐんと減らせる。注意として、a + b + c = 1000であることから、c < 1000 なので、b > 0 であることとあわせて、1000 > u2 > v2 である。ここから 32 > u,v と分かる。なぜならば 322 = 1024 > 1000 なので。

以上を踏まえると、非常にスピーディーにこの問題が解ける。


知らなきゃ出せない技で済ませた敗北感が…★