Skip to content

Instantly share code, notes, and snippets.

@uduki
Created June 11, 2014 08:00
Show Gist options
  • Save uduki/dccb02bf64a5946cfe00 to your computer and use it in GitHub Desktop.
Save uduki/dccb02bf64a5946cfe00 to your computer and use it in GitHub Desktop.
とある事の期待値の計算
{-# LANGUAGE ViewPatterns #-}
import Control.Applicative
import Data.List (find, genericIndex)
fixExpectation :: (Double, Integer) -> (Double, Integer) -> Integer -> Double
fixExpectation (sprob, sv) (fprob, fv) p = go 0 0
where
patterns = let f m n = (fac <!!> m) `div` ( (fac <!!> n) * (fac <!!> (m-n)) ) in map (fromIntegral . f p) [0..p]
go m i | i <= p = let m' = m + fromIntegral (sv * i + fv * (p-i)) * sprob^i * fprob^(p-i) * (patterns <!!> i) in go m' (i+1)
| otherwise = m
(<!!>) :: Integral i => [a] -> i -> a
(<!!>) = genericIndex
-- 階乗の計算
fac :: [Integer]
fac = 1 : [ n * fac !! fromIntegral (n-1) | n <- [1..] ]
brokenPoint :: (Double, Integer) -> (Double, Integer) -> Integer -> Maybe Integer
brokenPoint s f (fromIntegral -> p) = fst <$> find ((p <=) . abs . snd) [ ( n, b * fromIntegral n ) | n <- [1..] ]
where
b = fixExpectation s f 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment