2016 Update

This commit is contained in:
Tina Müller 2016-12-05 22:15:40 +01:00
parent 948b86eafa
commit dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions

View file

@ -1,3 +1,5 @@
factorize n = concat [divs n p | p <- [2..n], isPrime p]
where
divs n p = if rem n p==0 then p:divs (quot n p) p else []
factorize n = [ d | p <- [2..n], isPrime p, d <- divs n p ]
-- [2..n] >>= (\p-> [p|isPrime p]) >>= divs n
where
divs n p | rem n p == 0 = p : divs (quot n p) p
| otherwise = []

View file

@ -1,6 +1,11 @@
factorize n = divs n primesList
where
divs n ds@(d:t) | d*d > n = [n | n > 1]
| r == 0 = d : divs q ds
| otherwise = divs n t
where (q,r) = quotRem n d
import Data.Maybe (listToMaybe)
import Data.List (unfoldr)
factorize :: Integer -> [Integer]
factorize n
= unfoldr (\n -> listToMaybe [(x, div n x) | x <- [2..n], mod n x==0]) n
= unfoldr (\(d,n) -> listToMaybe [(x, (x, div n x)) | x <- [d..n], mod n x==0]) (2,n)
= unfoldr (\(d,n) -> listToMaybe [(x, (x, div n x)) | x <-
takeWhile ((<=n).(^2)) [d..] ++ [n|n>1], mod n x==0]) (2,n)
= unfoldr (\(ds,n) -> listToMaybe [(x, (dropWhile (< x) ds, div n x)) | n>1, x <-
takeWhile ((<=n).(^2)) ds ++ [n|n>1], mod n x==0]) (primesList,n)

View file

@ -1,22 +1,6 @@
import Test.HUnit
import Data.List
factor::Int->[Int]
factor 1 = []
factor n
| product primeDivisor == n = primeDivisor
| otherwise = primeDivisor ++ factor (div n $ product primeDivisor)
where
primeDivisor = filter isPrime $ filter (isDivisor n) [2 .. n]
isDivisor n d = (==) 0 $ mod n d
isPrime n = not $ any (isDivisor n) [2 .. n-1]
tests = TestList[TestCase $ assertEqual "1 has no prime factors" [] $ factor 1
,TestCase $ assertEqual "2 is 2" [2] $ factor 2
,TestCase $ assertEqual "3 is 3" [3] $ factor 3
,TestCase $ assertEqual "4 is 2*2" [2, 2] $ factor 4
,TestCase $ assertEqual "5 is 5" [5] $ factor 5
,TestCase $ assertEqual "6 is 2*3" [2, 3] $ factor 6
,TestCase $ assertEqual "7 is 7" [7] $ factor 7
,TestCase $ assertEqual "8 is 2*2*2" [2, 2, 2] $ factor 8
,TestCase $ assertEqual "large number" [2, 3, 3, 5, 7, 11, 13] $ sort $ factor (2*9*5*7*11*13)]
factorize n = divs n primesList
where
divs n ds@(d:t) | d*d > n = [n | n > 1]
| r == 0 = d : divs q ds
| otherwise = divs n t
where (q,r) = quotRem n d