Ccmmutty logo
Commutty IT
2 min read

【ピタゴラス】一緒に考えませんか? #Project Euler

https://cdn.magicode.io/media/notebox/DSC_00281_FiR4A9X.jpg

問9

ピタゴラスの定理a2+b2=c2a^2+b^2=c^2を満たす自然数にはa+b+c=1000a + b + c = 1000となる組が1つだけある
積abcを求めよ
Project Euler ※解法の公開は問1~100のみ可

考え方

リスト内包記法で簡単に書けそう
比で探せば計算量は少なくなるはず
solve :: Int
solve = (1000 `div` (x + y + z))^3 * x * y * z where
    (x, y, z) = head [(x, y, z) | z <- [1..], x <- [1..z],y <- [1..z], z^2 == x^2 + y^2, 1000 `mod` (x+y+z) == 0]
x+y+z==1000という条件では無駄がでる可能性があるので1000を割り切るという形で表した
haskell
solve :: Int
solve = (1000 `div` (x + y + z))^3 * x * y * z where
    (x, y, z) = head [(x, y, z) | z <- [1..], x <- [1..z],y <- [1..z], z^2 == x^2 + y^2, 1000 `mod` (x+y+z) == 0]

print solve

31875000

末筆ながら

ご意見求む!!

数学的に条件を狭めていけばもっと効率よくできるはず

Haskellerさんへ

計算量, 見やすさ, 文化的な観点から見て改善点や他回答があればぜひお願いします!

スキル指標

実務1年程度のへっぽこプログラマーなので暖かくも厳しく見守ってください
読んだ本
  • すごいH本
  • 関数プログラミング実践入門
  • 関数プログラミングの楽しみ (途中)
7と10はprimesモジュール必須なのでパス

Discussion

コメントにはログインが必要です。