RosettaCodeData/Task/Perfect-numbers/Python/perfect-numbers-4.py

36 lines
691 B
Python

'''Perfect numbers'''
from math import sqrt
# perfect :: Int - > Bool
def perfect(n):
'''Is n the sum of its proper divisors other than 1 ?'''
root = sqrt(n)
lows = [x for x in enumFromTo(2)(int(root)) if 0 == (n % x)]
return 1 < n and (
n == 1 + sum(lows + [n / x for x in lows if root != x])
)
# main :: IO ()
def main():
'''Test'''
print([
x for x in enumFromTo(1)(10000) if perfect(x)
])
# GENERIC -------------------------------------------------
# enumFromTo :: (Int, Int) -> [Int]
def enumFromTo(m):
'''Integer enumeration from m to n.'''
return lambda n: list(range(m, 1 + n))
if __name__ == '__main__':
main()