Arithmetik.hs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. module Arithmetik where
  2. -- Aufgabe 1.1
  3. -- Berechnung der Potenz durch e-faches multiplizieren von b
  4. -- Benötigt e Rekursionsschritte
  5. pow1 :: Double -> Int -> Double
  6. pow1 b 0 = 1
  7. pow1 b e = b * (pow1 b (e-1))
  8. -- Aufgabe 1.2
  9. -- Berechnung der Potenz pow2(b,e) = b^e
  10. -- Benötigt O(log_2(e)) Rekursionsschritte
  11. pow2 :: Double -> Int -> Double
  12. pow2 b 0 = 1
  13. pow2 b e = if odd e
  14. then b * pow2 b (e-1)
  15. else pow2 (b*b) (quot e 2)
  16. -- Aufgabe 1.3
  17. -- Berechnung der Potenz pow3(b,e) = b^e mit einer Hilfsfunktion
  18. pow3 :: Double -> Integer -> Double
  19. pow3 b e
  20. | e < 0 = error "Der Exponent muss nicht-negativ sein"
  21. | otherwise = pow3h b e 1 where
  22. pow3h b e acc
  23. | e == 0 = acc
  24. | odd e = pow3h b (e-1) (acc*b)
  25. | otherwise = pow3h (b*b) (quot e 2) acc
  26. -- Aufgabe 1.4
  27. -- Suche größte natürliche Zahl x, sodass x^e <= r
  28. -- Prinzipiell könnte e auch Double sein, aber wenn x und e
  29. -- natürliche Zahlen sind, könnte man o.B.d.A r abrunden.
  30. root :: Int -> Int -> Int
  31. root e r = rootH 0 r
  32. where rootH a b
  33. | b-a == 1 = a
  34. | floor (pow1 (fromIntegral(quot (a+b) 2)) e) <= r = rootH (quot (a+b) 2) b
  35. | otherwise = rootH a (quot (a+b) 2)
  36. -- Aufgabe 1.5: Primzahlcheck
  37. isPrime :: Integer -> Bool
  38. isPrime 0 = False
  39. isPrime 1 = False
  40. isPrime x = not (hasDivisor (root 2 x) 2)
  41. where hasDivisor upperBound i
  42. | i > upperBound = False
  43. | mod x i == 0 = True
  44. | otherwise = hasDivisor upperBound (i+1)