Problem 246

246 Tangents to an ellipse
Problem 246 - Project Euler
格子点を数える簡単なお仕事?(そう思っていた時期が(ry
直線と楕円の方程式と三角関数の加法定理を知っていて,二次方程式が解ければ出来る問題ではあるが…
数式計算が大変.この一言に尽きる.
あとは,本当に数えるだけ.

main :: IO ()
main = print.p246 7500 $ sqrt 5 * 2500

hight :: Double -> Double -> Double -> Integer
hight a b x = floor.sqrt $ 2 * sqrt ( (b^2 - a^2) * x^2 + 2 * a^4 ) - x^2 + b^2 + 3 * a^2

ground :: Double -> Double -> Double -> Integer
ground a b x | a <= x    = 0
             | otherwise = floor $ b * sqrt ( 1 - (x / a)^2 )

inner :: Double -> Double -> Integer
inner a b = sum.map (count.fromInteger) $ [1..hight b a 0]
    where count x = hight a b x - ground a b x

p246 :: Double -> Double -> Integer
p246 a b = 4 * inner a b + 2 * (hight b a 0 - floor a) + 2 * (hight a b 0 - floor b)