Problem 226
226 A Scoop of Blancmange
Problem 226 - Project Euler
変な図形の面積を求める.
普通に数値積分する.
ステップ幅などは適当に(収束するか,目的の精度が得られるか試行錯誤).
sawtooth :: Double -> Double sawtooth x = abs $ x - fromIntegral (round x) blancmange :: Int -> Double -> Double blancmange n x = sum.map f $ [0..n] where f m = let pow2 = fromIntegral $ 2^m in sawtooth (pow2 * x) / pow2 lowCurve :: Double -> Double lowCurve x = 0.5 - sqrt (x / 2 - x * x) p226 :: Double -> Int -> Double p226 h n = (h*).sum.map f.takeWhile ( <= 0.5) $ [0,0+h..] where f x = g $ blancmange n x - lowCurve x g x | x > 0 = x | otherwise = 0 main :: IO () main = print $ p226 1.0e-6 32
あんまり賢くないね.