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 >    = 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 個と思うわけですよ.