summaryrefslogtreecommitdiffstats
path: root/AufgabeFFP2.hs
blob: e66b7a8af8d5b9c025e3b00714ae4c4b80882bf6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
module AufgabeFFP2
where

-- 1

primes :: [Integer]
primes = sieve [2 ..]

-- sieve of eratosthenes (according to lecture slides)
sieve :: [Integer] -> [Integer]
sieve (x:xs) = x : sieve [ y | y <- xs, mod y x > 0]

-- generate all pairs with map and then filter only the valid ones
-- TODO: filtering should be optimized, still a bit slow
pps :: [(Integer, Integer)]
pps = filter validPair $ map (\x -> (x,x+2)) primes
	where
		-- pair is valid if the second component n is a prime
		-- since simply checking if the Integer is element of the prime-list 
		-- does not terminate for non-primes, we take the first n primes
		validPair :: (Integer,Integer) -> Bool
		validPair (_,maybePrime) = elem maybePrime $ take (fromInteger maybePrime) primes
				
-------------------------------------------------------------------------------

-- 2

-- generates powers of 2	
pof2s :: [Integer]
pof2s = [1] ++ (map (2*) pof2s)
	
pow :: Int -> Integer
pow 0 = 1
pow n = pow (n-1) + pow (n-1)

-- uses memtable for power-calculation
powFast :: Int -> Integer
powFast 0 = 1
powFast n = pof2s !! (n-1) + pof2s !! (n-1)

-------------------------------------------------------------------------------