Problem 144

http://projecteuler.net/index.php?section=problems&id=144
一次方程式と二次方程式を解くだけの簡単なお仕事。
だが、計算ミスしそうだったので、慎重にやった。
答えあわない…
とおもったら、終了条件を1つ見逃していた。
まったく、これだから英語は。

import Data.List

reflection :: Double -> Double -> Double
reflection n i = (i*(n^2-1)+2*n) / ((1-n^2)+2*n*i)

crossPoint :: (Double,Double) -> Double -> (Double,Double)
crossPoint (u,v) k = let x = ( (k^2-4)*u-2*k*v) / (k^2+4)
                         y = (-8*k*u-(k^2-4)*v) / (k^2+4)
                     in (x,y)

nextPoint (s,t) (u,v) = crossPoint (u,v). reflection (v/(4*u))$ (t-v) / (s-u)

p144 = findIndex out.tail.unfoldr next $ ((0,101/10),(7/5,-48/5))
    where next (s,t) = Just (s,(t,nextPoint s t))
          out (x,y) = y > 0 && abs x <= 0.01

main = print p144

reflectionの結果も代入して、手計算で式を簡約すればもっと短くなるが
今のままでも十分な時間なので、もういいや。