Algorithmen zum Wochenende
bearbeitet von 1unitedpower> Hello,
>
> wie man Primzahlen auf einfache itertive Weise mit dem Computer bestimmen kann, lernt man wohl in jedem Informatik-Seminar für Programmierer.
>
> Aber wie kann man eventuell auf ähnliche Weise die vollkommenen Zahlen bestimmen?
> Hat da jemand einen Tipp für mich?
Hab meine Idee mal in Haskell aufgeschrieben. Um beispielsweise alle perfekten Zahlen kleiner als 1000 zu bekommen (<https://repl.it/MztM/1>):
~~~haskell
main :: IO ()
main = putStrLn (show (perfects))
perfects :: [Int]
perfects = [ n | n <- [1..1000], isPerfect n]
isPerfect :: Int -> Bool
isPerfect n = sum (divisors n) == n
divisors :: Int -> [Int]
divisors n = [ i | i <- [1..n-1], n `mod` i == 0]
~~~
Da besteht natürlich noch viel Optimierungspotenziak, bspw. ist es ziemlich dumm bei der Ermittlung der Teiler von 1 bis n-1 zu laufen.
PS: Ein cooles Feature von Haskell ist, dass es mit unendlichen Mengen umgehen kann. Die Liste aller perfekter Zahlen wäre einfach `[ n | n <- [1..], isPerfect n]`. Das lüftet leider nicht alle Geheimnisse um die Zahlen: wenn ich zum Beispiel Haskell frage, ob die Menge endlich ist, dann terminiert Haskell möglicherweise nicht.