1unitedpower: Algorithmen zum Wochenende

Beitrag lesen

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 vollkommenen Zahlen kleiner als 1000 zu bekommen (https://repl.it/MztM/1):

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.