>>>isperfect = lambda n: n == sum(x for x inrange(1,n//2+1) ifnot n%x)>>>[n for n inrange(1, 10000) if isperfect(n)]
[6, 28, 496, 8128]
(from https://oeis.org/A000396 i see the next perfect number after 8128 is 33550336 which is too big for me to wait for the naive approach above to test…)
more bonus nonsense
>>> divisors_if_perfect = lambda n: n == sum(d:=[x for x inrange(1,n//2+1) ifnot n%x]) and d
>>> print("\n".join(f"{n:>5} == sum{tuple(d)}"for n inrange(10000) if (d:=divisors_if_perfect(n))))
6 == sum(1, 2, 3)
28 == sum(1, 2, 4, 7, 14)
496 == sum(1, 2, 4, 8, 16, 31, 62, 124, 248)
8128 == sum(1, 2, 4, 8, 16, 32, 64, 127, 254, 508, 1016, 2032, 4064)
you’ve got an extra zero in there, and you forgot the 1, but the rest of your divisors match my crude brute-force approach:
>>> n=31521281 >>> d = [ x for x in range(1,n//2+1) if not n%x ] >>> d [1, 11, 17, 59, 187, 649, 1003, 2857, 11033, 31427, 48569, 168563, 534259, 1854193, 2865571] >>> yours=list(map(int,"11+17+59+2857+11033+534259+1854193+2865571+168563+48569+10003+31427+649+187".split("+"))) >>> set(yours) - set(d) {10003} >>> set(d) - set(yours) {1, 1003} >>> sum(d) 5518399
same conclusion though: 5518399 also ≠ 31521281
bonus nonsense
>>> isperfect = lambda n: n == sum(x for x in range(1,n//2+1) if not n%x) >>> [n for n in range(1, 10000) if isperfect(n)] [6, 28, 496, 8128]
(from https://oeis.org/A000396 i see the next perfect number after 8128 is 33550336 which is too big for me to wait for the naive approach above to test…)
more bonus nonsense
>>> divisors_if_perfect = lambda n: n == sum(d:=[x for x in range(1,n//2+1) if not n%x]) and d >>> print("\n".join(f"{n:>5} == sum{tuple(d)}" for n in range(10000) if (d:=divisors_if_perfect(n)))) 6 == sum(1, 2, 3) 28 == sum(1, 2, 4, 7, 14) 496 == sum(1, 2, 4, 8, 16, 31, 62, 124, 248) 8128 == sum(1, 2, 4, 8, 16, 32, 64, 127, 254, 508, 1016, 2032, 4064)