factory 0.3.2.2 → 0.3.2.3
raw patch · 13 files changed
+114/−38 lines, 13 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- README.markdown +8/−5
- changelog.markdown +3/−0
- factory.cabal +9/−10
- makefile +62/−0
- src-exe/Main.hs +2/−2
- src-lib/Factory/Math/Implementations/Primality.hs +7/−5
- src-lib/Factory/Math/Implementations/PrimeFactorisation.hs +2/−1
- src-lib/Factory/Math/PrimeFactorisation.hs +5/−1
- src-test/Factory/Test/QuickCheck/Factorial.hs +2/−2
- src-test/Factory/Test/QuickCheck/Pi.hs +4/−2
- src-test/Factory/Test/QuickCheck/Probability.hs +2/−2
- src-test/Factory/Test/QuickCheck/SquareRoot.hs +6/−6
- src-test/Factory/Test/QuickCheck/Statistics.hs +2/−2
README.markdown view
@@ -1,6 +1,6 @@ # **Factory** -[](https://travis-ci.org/functionalley/Factory)+[](https://travis-ci.com/functionalley/Factory) [](https://hackage.haskell.org/package/factory) [](https://www.gnu.org/licenses/gpl-3.0) [](https://haskell.org)@@ -9,8 +9,11 @@ ## Installation -It can be built and installed using [Cabal](https://www.haskell.org/cabal/users-guide/installing-packages.html).+It can be built and installed using: +* [Cabal](https://www.haskell.org/cabal/),+* [The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/).+ ## Documentation More information about this library can be found at [Factory](https://functionalley.com/Factory/factory.html).@@ -27,9 +30,9 @@ The test-suite can be run using: - cabal configure --enable-tests;- cabal build;- cabal test --show-details=always;+* "**cabal configure --enable-tests && cabal build && cabal test --show-details=always**",+* "**stack test**",+* "**make test**" issued from the product's installation-directory. ## Author
changelog.markdown view
@@ -173,3 +173,6 @@ ## 0.3.2.2 Updated list of test-compilers.++## 0.3.2.3+Attempt to make tests more reliable.
factory.cabal view
@@ -1,3 +1,5 @@+cabal-version: 2.4+ -- This file is part of Factory. -- -- Factory is free software: you can redistribute it and/or modify@@ -14,10 +16,9 @@ -- along with Factory. If not, see <http://www.gnu.org/licenses/>. Name: factory-Version: 0.3.2.2-Cabal-version: >= 1.10+Version: 0.3.2.3 Copyright: (C) 2011-2015 Dr. Alistair Ward-License: GPL+License: GPL-3.0-or-later License-file: LICENSE Author: Dr. Alistair Ward Stability: stable@@ -25,7 +26,7 @@ Build-type: Simple Description: A library of number-theory functions, for; factorials, square-roots, Pi and primes. Category: Math, Number Theory-Tested-with: GHC == 7.4, GHC == 7.6, GHC == 7.8, GHC == 7.10, GHC == 8.0, GHC == 8.2, GHC == 8.4, GHC == 8.6, GHC == 8.8, GHC == 8.10+Tested-with: GHC == 8.0, GHC == 8.4, GHC == 8.8, GHC == 8.10 Homepage: https://functionalley.com/Factory/factory.html Maintainer: mailto:factory@functionalley.com Bug-reports: mailto:factory@functionalley.com@@ -35,6 +36,7 @@ .ghci changelog.markdown copyright+ makefile README.markdown source-repository head@@ -54,7 +56,8 @@ Library Default-language: Haskell2010- GHC-options: -O2 -Wall -fno-warn-tabs+ GHC-options: -O2 -Wall -fno-warn-tabs -fno-warn-unused-top-binds -Wno-all-missed-specialisations+ Hs-source-dirs: src-lib Exposed-modules:@@ -144,11 +147,7 @@ GHC-options: -O2 -Wall -fno-warn-tabs Hs-source-dirs: src-exe Main-is: Main.hs-- if impl(ghc >= 7.4.1)- GHC-prof-options: -fprof-auto -fprof-cafs- else- GHC-prof-options: -auto-all -caf-all+ Autogen-modules: Paths_factory -- Unexposed modules must be referenced for 'cabal sdist'. Other-modules:
+ makefile view
@@ -0,0 +1,62 @@+# This file is part of Factory.+#+# Factory is free software: you can redistribute it and/or modify+# it under the terms of the GNU General Public License as published by+# the Free Software Foundation, either version 3 of the License, or+# (at your option) any later version.+#+# Factory is distributed in the hope that it will be useful,+# but WITHOUT ANY WARRANTY; without even the implied warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+# GNU General Public License for more details.+#+# You should have received a copy of the GNU General Public License+# along with Factory. If not, see <http://www.gnu.org/licenses/>.++.PHONY: hlint test prof cabalCheck sdist findOmissions haddock graphmod++PACKAGE_NAME = factory+SHELL = /bin/bash+GHC_OPTIONS = --ghc-options='-j'+BIN_DIR = $$HOME/.local/bin/++# Build hlint.+$(BIN_DIR)/hlint:+ @stack install hlint++# Check for lint.+hlint: $(BIN_DIR)/hlint+ @$@ src-*++# Compile & run the test-suite.+test:+ stack '$@' $(GHC_OPTIONS)++# Profile.+prof:+ @stack install --library-profiling --executable-profiling $(GHC_OPTIONS)++# Check the cabal-file.+cabalCheck:+ @cabal check++# Package for upload to Hackage.+sdist:+ @cabal '$@'++# Find source-files missing from the distribution.+findOmissions: sdist+ @diff <(find src-* -type f -name '*.hs' | sed 's!^\./!!' | sort) <(tar -ztf dist*/sdist/$(PACKAGE_NAME)-*.tar.gz | grep '\.hs$$' | grep -v 'Setup.hs' | sed 's!^$(PACKAGE_NAME)-[0-9.]*/!!' | sort)++# Install this product.+$(BIN_DIR)/$(PACKAGE_NAME):+ @stack install $(GHC_OPTIONS)++# Build the source-code documentation.+haddock:+ @stack '$@' --no-$@-deps $(GHC_OPTIONS)++# Show module-dependency graph.+graphmod:+ @$@ --graph-dim='40,24' -i 'src-exe' -i 'src-lib' Main | tred | dot -Tsvg | display+
src-exe/Main.hs view
@@ -27,7 +27,7 @@ module Main(main) where import qualified Data.Default-import qualified Data.Map+import qualified Data.Map.Strict import qualified Data.List import qualified Data.Version import qualified Factory.Math.Hyperoperation as Math.Hyperoperation@@ -183,7 +183,7 @@ distribution :: Math.Probability.DiscreteDistribution Double (n, distribution) = readCommandArg arg in do- System.Random.getStdGen >>= print . Data.Map.toList . Data.Map.map ((/ (fromIntegral n :: Double)) . fromInteger) . Data.Map.fromListWith (+) . (`zip` repeat 1) . (take n :: [Integer] -> [Integer]) . Math.Probability.generateDiscretePopulation distribution+ System.Random.getStdGen >>= print . Data.Map.Strict.toList . Data.Map.Strict.map ((/ (fromIntegral n :: Double)) . fromInteger) . Data.Map.Strict.fromListWith (+) . (`zip` repeat 1) . (take n :: [Integer] -> [Integer]) . Math.Probability.generateDiscretePopulation distribution System.Exit.exitSuccess
src-lib/Factory/Math/Implementations/Primality.hs view
@@ -110,10 +110,12 @@ Math.PrimeFactorisation.Algorithmic factorisationAlgorithm, Show i ) => factorisationAlgorithm -> i -> Bool-isPrimeByAKS factorisationAlgorithm n = and [- not $ Math.PerfectPower.isPerfectPower n, -- Step 1.- Math.Primality.areCoprime n `all` Data.List.delete n [2 .. r], -- Step 3.- and $ Control.Parallel.Strategies.parMap Control.Parallel.Strategies.rdeepseq {-Benefits from '+RTS -H100M', which reduces garbage-collections-} (+isPrimeByAKS factorisationAlgorithm n = not (+ Math.PerfectPower.isPerfectPower n -- Step 1.+ ) && (+ Math.Primality.areCoprime n `all` Data.List.delete n [2 .. r] -- Step 3.+ ) && and (+ Control.Parallel.Strategies.parMap Control.Parallel.Strategies.rdeepseq {-Benefits from '+RTS -H100M', which reduces garbage-collections-} ( \a -> let -- lhs, rhs :: Data.Polynomial.Polynomial i i lhs = Data.Polynomial.raiseModulo (Data.Polynomial.mkLinear 1 a) n {-power-} n {-modulus-}@@ -128,7 +130,7 @@ ) [ 1 .. floor . (* lg) . sqrt $ fromIntegral r ] -- Step 4; (x + a)^n ~ x^n + a mod (x^r - 1, n).- ] where+ ) where lg :: Double lg = logBase 2 $ fromIntegral n
src-lib/Factory/Math/Implementations/PrimeFactorisation.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE LambdaCase #-} {- Copyright (C) 2011-2017 Dr. Alistair Ward @@ -64,7 +65,7 @@ def = TrialDivision instance Math.PrimeFactorisation.Algorithmic Algorithm where- primeFactors algorithm = case algorithm of+ primeFactors = \case DixonsMethod -> factoriseByDixonsMethod FermatsMethod -> Data.PrimeFactors.reduce . factoriseByFermatsMethod TrialDivision -> factoriseByTrialDivision
src-lib/Factory/Math/PrimeFactorisation.hs view
@@ -146,5 +146,9 @@ * <https://en.wikipedia.org/wiki/Square-free_integer>. -} squareFree :: (Algorithmic algorithm, Control.DeepSeq.NFData i, Integral i) => algorithm -> [i]-squareFree algorithm = filter (all (== 1) . map Data.Exponential.getExponent . primeFactors algorithm) [1 ..]+squareFree algorithm = filter (+ all (+ (== 1) . Data.Exponential.getExponent+ ) . primeFactors algorithm+ ) [1 ..]
src-test/Factory/Test/QuickCheck/Factorial.hs view
@@ -60,9 +60,9 @@ prop_symmetry x n = Test.QuickCheck.label "prop_symmetry" $ Math.Implementations.Factorial.risingFactorial x n == Math.Implementations.Factorial.fallingFactorial (pred $ x + n) n - prop_x0 x _ = Test.QuickCheck.label "prop_x0" $ all (== 1) $ map ($ 0) [Math.Implementations.Factorial.risingFactorial x, Math.Implementations.Factorial.fallingFactorial x]+ prop_x0 x _ = Test.QuickCheck.label "prop_x0" $ all ((== 1) . ($ 0)) [Math.Implementations.Factorial.risingFactorial x, Math.Implementations.Factorial.fallingFactorial x] - prop_0n _ n = Test.QuickCheck.label "prop_0n" $ all (== if n == 0 then 1 else 0) $ map ($ n) [Math.Implementations.Factorial.risingFactorial 0, Math.Implementations.Factorial.fallingFactorial 0]+ prop_0n _ n = Test.QuickCheck.label "prop_0n" $ all ((== if n == 0 then 1 else 0) . ($ n)) [Math.Implementations.Factorial.risingFactorial 0, Math.Implementations.Factorial.fallingFactorial 0] prop_ratio :: Math.Implementations.Factorial.Algorithm -> Integer -> Integer -> Test.QuickCheck.Property prop_ratio algorithm i j = Test.QuickCheck.label "prop_ratio" $ n !/! d == Math.Factorial.factorial algorithm n % Math.Factorial.factorial algorithm d where
src-test/Factory/Test/QuickCheck/Pi.hs view
@@ -101,8 +101,10 @@ -- | The constant test-results for this data-type. results :: IO [Test.QuickCheck.Result]-results = mapM Test.QuickCheck.quickCheckResult [prop_consistency] where+results = mapM (+ Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 }+ ) [prop_consistency] where prop_consistency :: Testable- prop_consistency l r decimalDigits = l /= r ==> Test.QuickCheck.label "prop_consistency" $ Math.Pi.openI l decimalDigits' - Math.Pi.openI r decimalDigits' <= 1 {-rounding error-} where+ prop_consistency l r decimalDigits = l /= r ==> Test.QuickCheck.label "prop_consistency" $ Math.Pi.openI l decimalDigits' - Math.Pi.openI r decimalDigits' <= 2 {-rounding error-} where decimalDigits' = succ $ decimalDigits `mod` 250
src-test/Factory/Test/QuickCheck/Probability.hs view
@@ -60,7 +60,7 @@ Math.Statistics.getMean &&& pred . Math.Statistics.getStandardDeviation -- Both of which, having been normalised, should be zero. ) . ( normalise distribution :: [Double] -> [Double]- ) . take 10000 $ Math.Probability.generatePopulation distribution randomGen where+ ) . take 100000 $ Math.Probability.generatePopulation distribution randomGen where maxParameter = log . fromInteger $ Math.Probability.maxPreciseInteger (undefined :: Double) location' | location >= 0 = maxParameter `min` location@@ -134,7 +134,7 @@ Math.Statistics.getMean &&& pred . Math.Statistics.getStandardDeviation -- Both of which, having been normalised, should be zero. ) . ( normalise distribution :: [Double] -> [Double]- ) . take 10000 $ Math.Probability.generatePopulation distribution randomGen where+ ) . take 100000 $ Math.Probability.generatePopulation distribution randomGen where probability' = recip . succ $ abs probability -- Semi-closed unit-interval (0, 1]. distribution = Math.Probability.ShiftedGeometricDistribution probability'
src-test/Factory/Test/QuickCheck/SquareRoot.hs view
@@ -47,20 +47,20 @@ -- | The constant test-results for this data-type. results :: IO [Test.QuickCheck.Result]-results = mapM Test.QuickCheck.quickCheckResult [--- prop_accuracy, -- This occasionally fails.- prop_factorable--- prop_perfectSquare -- This occasionally fails.+results = sequence [+-- Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } prop_accuracy, -- This occasionally fails.+ Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } prop_factorable+-- Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } prop_perfectSquare -- This occasionally fails. ] where prop_accuracy, prop_factorable, prop_perfectSquare :: (Math.Implementations.SquareRoot.Algorithm, Math.Precision.DecimalDigits, Rational) -> Test.QuickCheck.Property prop_accuracy (algorithm, decimalDigits, operand) = Test.QuickCheck.label "prop_accuracy" . (>= requiredDecimalDigits) . Math.SquareRoot.getAccuracy operand' $ Math.SquareRoot.squareRoot algorithm requiredDecimalDigits operand' where requiredDecimalDigits :: Math.Precision.DecimalDigits- requiredDecimalDigits = succ $ decimalDigits `mod` 1024+ requiredDecimalDigits = succ $ decimalDigits `mod` 512 operand' :: Rational operand' = abs operand - prop_factorable (algorithm, decimalDigits, operand) = Test.QuickCheck.label "prop_factorable" . (<= 5) . (+ prop_factorable (algorithm, decimalDigits, operand) = Test.QuickCheck.label "prop_factorable" . (<= 9) . ( * 10 ^ requiredDecimalDigits -- Promote the relative error. ) . abs $ 1 - ( Math.SquareRoot.squareRoot algorithm requiredDecimalDigits (
src-test/Factory/Test/QuickCheck/Statistics.hs view
@@ -27,7 +27,7 @@ import qualified Data.Array.IArray import qualified Data.List-import qualified Data.Map+import qualified Data.Map.Strict import qualified Data.Numbers.Primes import qualified Data.Set import qualified Factory.Math.Implementations.Factorial as Math.Implementations.Factorial@@ -99,7 +99,7 @@ prop_varianceOfArray l = not (null l) ==> Test.QuickCheck.label "prop_varianceOfArray" $ Math.Statistics.getVariance ( Data.Array.IArray.array (1, length l) $ zip [1 ..] l :: Data.Array.IArray.Array Int Integer ) == (Math.Statistics.getVariance l :: Rational)- prop_varianceOfMap l = not (null l) ==> Test.QuickCheck.label "prop_varianceOfMap" $ Math.Statistics.getVariance (Data.Map.fromList $ zip [0 :: Int ..] l) == (Math.Statistics.getVariance l :: Rational)+ prop_varianceOfMap l = not (null l) ==> Test.QuickCheck.label "prop_varianceOfMap" $ Math.Statistics.getVariance (Data.Map.Strict.fromList $ zip [0 :: Int ..] l) == (Math.Statistics.getVariance l :: Rational) prop_meanOfSet l = not (null l') ==> Test.QuickCheck.label "prop_meanOfSet" $ Math.Statistics.getMean (Data.Set.fromList l') == (Math.Statistics.getMean l' :: Rational) where l' = Data.List.nub l