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 $ ((,101/10),(7/5,-48/5))
where next (s,t) = Just (s,(t,nextPoint s t))
out (x,y) = y >  && abs x <= 0.01
main = print p144

reflectionの結果も代入して、手計算で式を簡約すればもっと短くなるが

今のままでも十分な時間なので、もういいや。