fast-arithmetic 0.2.0.1 → 0.2.1.0
raw patch · 9 files changed
+41/−84 lines, 9 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Numeric.Combinatorics: factorial :: Int -> IO Integer
- Numeric.Pure: hsDerangement :: Int -> Integer
- Numeric.Pure: hsFactorial :: (Integral a) => a -> a
+ Numeric.Pure: derangement :: (Integral a) => Int -> a
+ Numeric.Pure: factorial :: (Integral a) => Int -> a
- Numeric.Pure: hsChoose :: (Integral a) => a -> a -> a
+ Numeric.Pure: hsChoose :: (Integral a) => a -> Int -> a
Files
- ats-src/combinatorics-ffi.dats +0/−7
- bench/Bench.hs +1/−5
- cbits/combinatorics.c +10/−46
- cbits/number-theory.c +1/−1
- cbits/numerics.c +1/−1
- fast-arithmetic.cabal +1/−1
- src/Numeric/Combinatorics.hs +1/−6
- src/Numeric/Pure.hs +19/−13
- test/Spec.hs +7/−4
ats-src/combinatorics-ffi.dats view
@@ -21,10 +21,6 @@ fun double_factorial_ats {n : nat} : int(n) -> Intinf = "mac#" -extern-fun factorial_ats {n : nat} : int(n) -> Intinf =- "mac#"- implement choose_ats (n, k) = choose(n, k) @@ -33,6 +29,3 @@ implement double_factorial_ats (m) = dfact(m)--implement factorial_ats (m) =- fact(m)
bench/Bench.hs view
@@ -28,16 +28,12 @@ [ bench "isPerfect" $ nf isPerfect 318 , bench "hsIsPerfect" $ nf hsIsPerfect (318 :: Int) ]- , bgroup "factorial"- [ bench "factorial" $ nfIO (factorial 1000)- , bench "hsFactorial" $ nf hsFactorial (1000 :: Integer)- ] , bgroup "doubleFactorial" [ bench "doubleFactorial" $ nfIO (doubleFactorial 79) , bench "hsDoubleFactorial" $ nf hsDoubleFactorial (79 :: Integer) ] , bgroup "choose" [ bench "choose" $ nfIO (choose 322 16)- , bench "hsChoose" $ nf (hsChoose 322) (16 :: Integer)+ , bench "hsChoose" $ nf (hsChoose 322 :: Int -> Integer) 16 ] ]
cbits/combinatorics.c view
@@ -1,7 +1,7 @@ /* ** ** The C code is generated by [ATS/Postiats-0-3-8]-** The starting compilation time is: 2018-1-9: 17h: 0m+** The starting compilation time is: 2018-1-9: 18h:50m ** */ @@ -640,12 +640,6 @@ double_factorial_ats(atstkind_t0ype(atstype_int)) ; #endif // end of [QUALIFIED] -#if(0)-ATSextern()-atstkind_type(atstype_ptrk)-factorial_ats(atstkind_t0ype(atstype_int)) ;-#endif // end of [QUALIFIED]- /* /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics.dats: 280(line=10, offs=4) -- 980(line=34, offs=6) */@@ -4011,7 +4005,7 @@ } /* end of [ATSCNTRB_056_HX_056_intinf_vt__intinf_free__12__3] */ /*-/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 597(line=28, offs=22) -- 620(line=29, offs=15)+/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 531(line=24, offs=22) -- 554(line=25, offs=15) */ /* local: choose_44$0(level=0)@@ -4028,11 +4022,11 @@ /* tmpvardeclst(end) */ ATSfunbody_beg() /*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 586(line=28, offs=11) -- 620(line=29, offs=15)+emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 520(line=24, offs=11) -- 554(line=25, offs=15) */ ATSINSflab(__patsflab_choose_ats): /*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 608(line=29, offs=3) -- 620(line=29, offs=15)+emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 542(line=25, offs=3) -- 554(line=25, offs=15) */ ATSINSmove(tmpret131, choose_44(arg0, arg1)) ; @@ -4041,7 +4035,7 @@ } /* end of [choose_ats] */ /*-/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 649(line=31, offs=28) -- 672(line=32, offs=15)+/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 583(line=27, offs=28) -- 606(line=28, offs=15) */ /* local: choose_44$0(level=0)@@ -4058,11 +4052,11 @@ /* tmpvardeclst(end) */ ATSfunbody_beg() /*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 632(line=31, offs=11) -- 672(line=32, offs=15)+emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 566(line=27, offs=11) -- 606(line=28, offs=15) */ ATSINSflab(__patsflab_permutations_ats): /*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 660(line=32, offs=3) -- 672(line=32, offs=15)+emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 594(line=28, offs=3) -- 606(line=28, offs=15) */ ATSINSmove(tmpret132, choose_44(arg0, arg1)) ; @@ -4071,7 +4065,7 @@ } /* end of [permutations_ats] */ /*-/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 705(line=34, offs=32) -- 720(line=35, offs=10)+/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 639(line=30, offs=32) -- 654(line=31, offs=10) */ /* local: dfact_34$0(level=0)@@ -4088,47 +4082,17 @@ /* tmpvardeclst(end) */ ATSfunbody_beg() /*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 684(line=34, offs=11) -- 721(line=35, offs=11)+emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 618(line=30, offs=11) -- 655(line=31, offs=11) */ ATSINSflab(__patsflab_double_factorial_ats): /*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 713(line=35, offs=3) -- 720(line=35, offs=10)+emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 647(line=31, offs=3) -- 654(line=31, offs=10) */ ATSINSmove(tmpret133, dfact_34(arg0)) ; ATSfunbody_end() ATSreturn(tmpret133) ; } /* end of [double_factorial_ats] */--/*-/home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 747(line=37, offs=25) -- 761(line=38, offs=9)-*/-/*-local: fact_28$0(level=0)-global: fact_28$0(level=0), factorial_ats$61$0(level=0)-local: -global: -*/-ATSextern()-atstkind_type(atstype_ptrk)-factorial_ats(atstkind_t0ype(atstype_int) arg0)-{-/* tmpvardeclst(beg) */-ATStmpdec(tmpret134, atstkind_type(atstype_ptrk)) ;-/* tmpvardeclst(end) */-ATSfunbody_beg()-/*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 733(line=37, offs=11) -- 762(line=38, offs=10)-*/-ATSINSflab(__patsflab_factorial_ats):-/*-emit_instr: loc0 = /home/vanessa/programming/haskell/done/fast-arithmetic/ats-src/combinatorics-ffi.dats: 755(line=38, offs=3) -- 761(line=38, offs=9)-*/-ATSINSmove(tmpret134, fact_28(arg0)) ;--ATSfunbody_end()-ATSreturn(tmpret134) ;-} /* end of [factorial_ats] */ /* ** for initialization(dynloading)
cbits/number-theory.c view
@@ -1,7 +1,7 @@ /* ** ** The C code is generated by [ATS/Postiats-0-3-8]-** The starting compilation time is: 2018-1-9: 15h:48m+** The starting compilation time is: 2018-1-9: 18h:50m ** */
cbits/numerics.c view
@@ -1,7 +1,7 @@ /* ** ** The C code is generated by [ATS/Postiats-0-3-8]-** The starting compilation time is: 2018-1-9: 15h:48m+** The starting compilation time is: 2018-1-9: 18h:50m ** */
fast-arithmetic.cabal view
@@ -1,5 +1,5 @@ name: fast-arithmetic-version: 0.2.0.1+version: 0.2.1.0 synopsis: Fast functions on integers. description: Fast functions for number theory and combinatorics with a high level of safety guaranteed by [ATS](http://www.ats-lang.org/). This package also provides a 'Storable' instance for GMP's @mpz@ type.
src/Numeric/Combinatorics.hs view
@@ -6,8 +6,7 @@ functions. -} -module Numeric.Combinatorics ( factorial- , choose+module Numeric.Combinatorics ( choose , doubleFactorial ) where @@ -17,7 +16,6 @@ import Foreign.Ptr import Foreign.Storable -foreign import ccall unsafe factorial_ats :: CInt -> Ptr GMPInt foreign import ccall unsafe double_factorial_ats :: CInt -> Ptr GMPInt foreign import ccall unsafe choose_ats :: CInt -> CInt -> Ptr GMPInt @@ -28,6 +26,3 @@ -- | See [here](http://mathworld.wolfram.com/DoubleFactorial.html). doubleFactorial :: Int -> IO Integer doubleFactorial = conjugateGMP double_factorial_ats--factorial :: Int -> IO Integer-factorial = conjugateGMP factorial_ats
src/Numeric/Pure.hs view
@@ -1,9 +1,11 @@ {-# LANGUAGE CPP #-} --- | Pure Haskell functions for testing and benchmarking. Specialized for--- 'Int's.-module Numeric.Pure ( hsIsPrime- , hsFactorial+-- | Pure Haskell functions for testing and benchmarking.+module Numeric.Pure ( -- * Useful functions+ derangement+ , factorial+ -- * Functions exported for testing and benchmarking+ , hsIsPrime , hsDoubleFactorial , hsChoose , hsTotient@@ -12,25 +14,26 @@ , hsLittleOmega , hsIsPerfect , hsSumDivisors- , hsDerangement ) where #if __GLASGOW_HASKELL__ <= 784 import Control.Applicative #endif +{-# SPECIALIZE factorial :: Int -> Integer #-}+{-# SPECIALIZE derangement :: Int -> Integer #-} {-# SPECIALIZE hsLittleOmega :: Int -> Int #-}-{-# SPECIALIZE hsFactorial :: Int -> Int #-} {-# SPECIALIZE hsTau :: Int -> Int #-} {-# SPECIALIZE hsTotient :: Int -> Int #-} {-# SPECIALIZE hsIsPrime :: Int -> Bool #-} {-# SPECIALIZE hsChoose :: Int -> Int -> Int #-} {-# SPECIALIZE hsDoubleFactorial :: Int -> Int #-} -hsDerangement :: Int -> Integer-hsDerangement n = derangements !! n+-- | See [here](http://mathworld.wolfram.com/Derangement.html).+derangement :: (Integral a) => Int -> a+derangement n = derangements !! n -derangements :: [Integer]+derangements :: (Integral a) => [a] derangements = fmap snd g where g = (0, 1) : (1, 0) : zipWith (\(_, n) (i, m) -> (i + 1, i * (n + m))) g (tail g) @@ -62,9 +65,12 @@ hsIsPrime x = all ((/=0) . (x `mod`)) [2..m] where m = floor (sqrt (fromIntegral x :: Float)) -hsFactorial :: (Integral a) => a -> a-hsFactorial n = product [1..n]+factorials :: (Integral a) => [a]+factorials = 1 : 1 : zipWith (*) [2..] (tail factorials) +factorial :: (Integral a) => Int -> a+factorial = (factorials !!)+ hsDoubleFactorial :: (Integral a) => a -> a hsDoubleFactorial 0 = 1 hsDoubleFactorial 1 = 1@@ -74,5 +80,5 @@ | odd n = product [1, 3 .. n] | otherwise = 1 -hsChoose :: (Integral a) => a -> a -> a-hsChoose n k = product [ n + 1 - i | i <- [1..k] ] `div` hsFactorial k+hsChoose :: (Integral a) => a -> Int -> a+hsChoose n k = product [ n + 1 - i | i <- [1..(fromIntegral k)] ] `div` factorial k
test/Spec.hs view
@@ -46,13 +46,16 @@ describe "totient" $ prop "should be equal to m-1 for m prime" $ \m -> m < 1 || not (isPrime m) || totient m == m - 1+ describe "derangement" $+ prop "should be equal to [n!/e]" $+ \n -> n < 1 || n > 18 || (derangement n :: Integer) == floor ((fromIntegral (factorial n :: Integer) :: Double) / exp 1 + 0.5) describe "totient" $ prop "should satisfy Fermat's little theorem" $ \a m -> a < 1 || m < 2 || gcd a m /= 1 || tooBig a m || (a ^ totient m) `mod` m == 1 -- TODO property test w/ recurrence relations? sequence_ $ zipWith4 check- ["factorial", "choose 101", "doubleFactorial"]- [factorial, choose 101, doubleFactorial]- [hsFactorial, hsChoose 101, hsDoubleFactorial]- [3141, 16, 79]+ ["choose 101", "doubleFactorial"]+ [choose 101, doubleFactorial]+ [hsChoose 101 . fromIntegral, hsDoubleFactorial]+ [16, 79]