Problem 235

235 An Arithmetic Geometric sequence
Problem 235 - Project Euler
パラメトリックな数列の値について,
パラメータを探す.
基本的には 関数f が与えられ,f (x) = 0 なる x を探す問題.
今回は f が 単調なので,単純な二分探索を行った.

s :: Double -> Double
s r = (+2e11).sum.map u $ [1..5000]
    where u k= (300 - fromIntegral k) * r ^ (k-1)

bsearch :: (Double -> Double) -> Double -> Double -> Double -> Double
bsearch f e p q | r - p < e = r
                | f r > 0   = bsearch f e r q
                | otherwise = bsearch f e p r
    where r = ( p + q ) / 2

main :: IO ()
main = print $ bsearch s (1e-12) 1 2

この問題,実は結構,苦労した.どういうわけか,6*10^11ではなく,6*10^12だと思い込み,
答えがあわなくて,右往左往した.
丁寧にカンマが打ってあるのに,間違えるという,ファインプレー.
いや,でもさ,カンマ+ピリオド=4個,つまり,0は 4*3 = 12 個と思うわけですよ.