Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Double factorial

Name: Anonymous 2009-02-27 13:02

GHCi, version 6.8.2: http://www.haskell.org/ghc/  :ihbt for help
Loading package base ... linking ... done.
Prelude> let fact n = product [1..n]
Prelude> fact 5
120
Prelude> let doubleFact = fact.fact
Prelude> doubleFact 3
720
Prelude>

Name: Anonymous 2009-02-27 15:16

>>1
import List
import Control.Arrow

primes = 2 : 3 : [k + r | k <- [6, 12..] , r <- [-1, 1], all ((0 /=) . mod (k + r)) $ takeWhile ((<= k + r) . (^ 2)) primes]

factorize n = factorize' n [] $ takeWhile (<= n) primes
    where factorize' n fs []     = n:fs
          factorize' n fs (p:ps) = let (q, r) = divMod n p in if r == 0 then factorize' q (p:fs) (p:ps) else factorize' n fs ps

bitCount 0 = 0
bitCount n = uncurry (+) . (bitCount *** id) $ divMod n 2

primorial l h = product . takeWhile (<= h) $ dropWhile (< l) primes

swing n | n < 33 = genericIndex smallOddSwing n
        | True   = primorial (div n 2 + 1) n * product pList
    where smallOddSwing = [1,1,1,3,3,15,5,35,35,315,63,693,231,3003,429,6435,6435,109395,12155,230945,46189,969969,88179,2028117,676039,16900975,1300075,35102025,5014575,145422675,9694845,300540195,300540195]
          pListA q p prime = let x = div q prime in if x > 0 then if mod x 2 == 1 then pListA x (p * prime) prime else pListA x p prime else if p > 1 then [p] else []
          pListB prime = if mod (div n prime) 2 == 1 then [prime] else []
          pList = (concatMap (pListA n 1) . takeWhile ((<= n) . (^ 2)) $ tail primes) ++ (concatMap pListB . takeWhile (<= div n 3) $ dropWhile ((<= n) . (^ 2) . (-1 +)) primes)

rFact n | n < 2 = 1
        | True  = rFact (div n 2) ^ 2 * swing n

fact n | n < 20 = product [2..n]
       | True   = rFact n * 2 ^ (n - bitCount n)

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List