Life Goes On

まあまあだけど楽しんでる方です

71問目

http://projecteuler.net/index.php?section=problems&id=71
分母が 1,000,000 以下の既約分数を値の小さいものから順に並べたとき、 3/7 の左に来るものの分子は何か求める。
1,000,000 以下の分母について、 3/7 "未満"で最大となるような分子を求めるのですが、div で計算すると 3/7 "以下"になってしまうので、 4/7 "より大きく"て最小となるような分子(4/7 "以下"で最大となるような分子に1を足したもの)を求めて、分母との差をとっています。
最適化オプションをつけてコンパイルしないと stack overflow 。どこでそんなにスタックを?
あと、Euler problems/Problem 71 - HaskellWiki にとてもシンプルな解法が載っているのだけど、全く理解できていない。→結局、間違った解法のようです。詳細はコメントに。

import Data.Ratio

main = print $ euler071 (3 % 7) 1000000

euler071 :: Rational -> Int -> Integer
euler071 m n = numerator $ maximum $ take n $ ratios m

ratios :: Rational -> [Rational]
ratios m = [ n % d | d <- [1..],
    let dm = denominator m,
    let nm = numerator m,
    let n = d - (div (d * (dm - nm)) dm) - 1]