Skip to content

Instantly share code, notes, and snippets.

@naohaq

naohaq/Comb.hs Secret

Last active October 7, 2018 08:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save naohaq/281aebb3f29378109bb4f866e5068ef8 to your computer and use it in GitHub Desktop.
Save naohaq/281aebb3f29378109bb4f866e5068ef8 to your computer and use it in GitHub Desktop.
Combinational probability
import Debug.Trace
import System.Environment
qnr :: Integer -> Integer -> Double -> Double
qnr n r 0 = 0
qnr n r p
| n < r = 0
| n == r = q
| otherwise = q + (n' - r')*(log(1-p)) + (foldl (+) 0 (map (log) [n'-r'+1..n'])) - (foldl (+) 0 (map log [2..r']))
where n' = fromIntegral n
r' = fromIntegral r
q = r' * (log p)
exp_qnr :: Integer -> Integer -> Double -> Double
exp_qnr n r p = exp (qnr n r p)
pnr :: Integer -> Integer -> Double -> Double
pnr n r 0 = 0
pnr n r p
| n < r = 0
| n == r = exp q
| otherwise = pnr (n-1) r p + p * exp_qnr (n-1) (r-1) p
where q = fromIntegral r * (log p)
main = do
args <- getArgs
(n,r,p) <- case args of
n':r':p':_ -> (,,) <$> readIO n' <*> readIO r' <*> readIO p'
_ -> return (6400, 64, 0.8)
-- putStrLn $ "qnr " ++ show n ++ " " ++ show r ++ " " ++ show p ++ " = " ++ show (exp_qnr n r p)
putStrLn $ "pnr " ++ show n ++ " " ++ show r ++ " " ++ show p ++ " = " ++ show (pnr n r p)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment