summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Wisniowski <matthias.wisniowski@gmail.com>2012-03-26 00:21:42 +0200
committerMatthias Wisniowski <matthias.wisniowski@gmail.com>2012-03-26 00:21:42 +0200
commit3079424b11b32d019a68f13299e372a6aa277163 (patch)
treee07b8b77378d6bd99ac83f7615c1fac775419008
parentd0bf96ede7e199aac494e65a239edb9d8bf9f413 (diff)
parent8613f7154f815835fc5e6ddbe15e9aebc62109b1 (diff)
downloadffp-3079424b11b32d019a68f13299e372a6aa277163.tar.gz
ffp-3079424b11b32d019a68f13299e372a6aa277163.tar.bz2
ffp-3079424b11b32d019a68f13299e372a6aa277163.zip
Merge branch 'dev'
-rw-r--r--AufgabeFFP2.hs57
-rw-r--r--TestAufgabeFFP2.hs69
2 files changed, 125 insertions, 1 deletions
diff --git a/AufgabeFFP2.hs b/AufgabeFFP2.hs
index e66b7a8..7993c01 100644
--- a/AufgabeFFP2.hs
+++ b/AufgabeFFP2.hs
@@ -38,4 +38,59 @@ powFast :: Int -> Integer
38powFast 0 = 1 38powFast 0 = 1
39powFast n = pof2s !! (n-1) + pof2s !! (n-1) 39powFast n = pof2s !! (n-1) + pof2s !! (n-1)
40 40
41------------------------------------------------------------------------------- \ No newline at end of file 41-------------------------------------------------------------------------------
42
43-- 3
44
45-- power series of N
46pofNs :: Integer -> [Integer]
47pofNs n = [1] ++ (map (n*) $ pofNs n)
48
49-- faculty function
50fac :: Integer -> Integer
51fac n = product [1..n]
52
53-- stream of faculties
54facGen :: [Integer]
55facGen = map (fac) [1..]
56
57-- function g with memoization (using hFast)
58fMT :: Int -> Int -> Float
59fMT z k = g z k hMT
60
61-- function g without memoization (uning hSlow)
62f :: Int -> Int -> Float
63f z k = g z k h
64
65-- actual function g (converts Int to Integer for more precision)
66g :: Int -> Int -> (Integer -> Integer -> Float) -> Float
67g z k h = sum $ map (h $ fromIntegral z) [1..(fromIntegral k)]
68
69-- helper function h using mem-table for the power-series (z^i) and for faculty (i!)
70hMT :: Integer -> Integer -> Float
71hMT z i = (fromInteger $ pofNs z !! (fromInteger i)) / (fromInteger $ facGen !! ((fromIntegral i)-1))
72
73-- helper function h without memoization
74h :: Integer -> Integer -> Float
75h z i = (fromInteger $ z^i) / (fromInteger $ fac i)
76
77-------------------------------------------------------------------------------
78
79-- 4
80
81-- gets the digits of an integer as a list
82digits :: Integer -> [Integer]
83digits x
84 | x<=0 = []
85 | otherwise = (digits $ x `div` 10)++[x `mod` 10]
86
87-- calculates the goedel-number for the given integer
88-- returns 0 for non-positive numbers
89gz :: Integer -> Integer
90gz n
91 | n<=0 = 0
92 | otherwise = product $ zipWith (^) primes (digits n)
93
94-- goedel-number generator
95gzs :: [Integer]
96gzs = map (gz) [1..]
diff --git a/TestAufgabeFFP2.hs b/TestAufgabeFFP2.hs
new file mode 100644
index 0000000..0df8612
--- /dev/null
+++ b/TestAufgabeFFP2.hs
@@ -0,0 +1,69 @@
1module Main where
2
3import Test.HUnit
4import Control.Monad
5import AufgabeFFP2
6
7assertBoolF :: String -> Bool -> Assertion
8assertBoolF msg b = when b (assertFailure msg)
9
10-------------------------------------------------------------------------------
11-- 1
12
13pps1 :: Test
14pps1 = TestCase (assertEqual "pps"
15 [(3,5),(5,7),(11,13),(17,19),(29,31),(41,43), (59,61),(71,73),(101,103),(107,109)]
16 (take 10 pps))
17
18pps2 :: Test
19pps2 = TestCase (assertEqual "pps"
20 (347,349)
21 (pps!!20))
22
23pps3 :: Test
24pps3 = TestCase (assertEqual "pps"
25 (809,811)
26 (head (drop 30 pps)))
27
28ppsTests = TestList [pps1, pps2, pps3]
29
30-------------------------------------------------------------------------------
31-- 2
32
33-------------------------------------------------------------------------------
34-- 3
35
36-------------------------------------------------------------------------------
37-- 4
38
39gz1 :: Test
40gz1 = TestCase (assertEqual "gz"
41 144
42 (gz 42))
43
44gz2 :: Test
45gz2 = TestCase (assertEqual "gz"
46 400
47 (gz 402))
48
49gzs1 :: Test
50gzs1 = TestCase (assertEqual "gzs"
51 144
52 (gzs!!41))
53
54gzs2 :: Test
55gzs2 = TestCase (assertEqual "gzs"
56 400
57 (gzs!!401))
58
59
60gzTests = TestList [gz1, gz2, gzs1, gzs2]
61
62-------------------------------------------------------------------------------
63
64tests :: [Test]
65tests = [ppsTests, gzTests]
66
67main = do
68 forM tests $ \test ->
69 runTestTT test