maths.perfect_number¶
== Perfect Number == In number theory, a perfect number is a positive integer that is equal to the sum of its positive divisors, excluding the number itself.
- For example: 6 ==> divisors[1, 2, 3, 6]
Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 So, 6 is a Perfect Number
The first few perfect numbers are: 6, 28, 496, 8128, 33550336, …
https://en.wikipedia.org/wiki/Perfect_number https://oeis.org/A000396
Attributes¶
Functions¶
|
Find all perfect numbers up to a given limit. |
|
Get all proper divisors of a number (excluding the number itself). |
|
Check if a number is a perfect number. |
|
Optimized version of perfect number checker using mathematical properties. |
Module Contents¶
- maths.perfect_number.find_perfect_numbers(limit: int) list[int]¶
Find all perfect numbers up to a given limit.
- Args:
limit: The upper bound to search for perfect numbers.
- Returns:
List of perfect numbers up to the limit.
- Examples:
>>> find_perfect_numbers(10) [6] >>> find_perfect_numbers(30) [6, 28] >>> find_perfect_numbers(500) [6, 28, 496] >>> find_perfect_numbers(0) [] >>> find_perfect_numbers(1) []
- maths.perfect_number.get_divisors(number: int) list[int]¶
Get all proper divisors of a number (excluding the number itself).
- Args:
number: The positive integer to find divisors for.
- Returns:
List of proper divisors in ascending order.
- Examples:
>>> get_divisors(6) [1, 2, 3] >>> get_divisors(28) [1, 2, 4, 7, 14] >>> get_divisors(12) [1, 2, 3, 4, 6] >>> get_divisors(1) [] >>> get_divisors(7) [1]
- maths.perfect_number.perfect(number: int) bool¶
Check if a number is a perfect number.
A perfect number is a positive integer that is equal to the sum of its proper divisors (positive divisors excluding the number itself).
The algorithm finds all divisors up to number//2 (since no proper divisor can be greater than half the number) and sums them for comparison.
Time Complexity: O(sqrt(n)) with optimized divisor finding Space Complexity: O(1)
- Args:
number: The positive integer to be checked.
- Returns:
True if the number is a perfect number, False otherwise.
- Raises:
ValueError: If number is not an integer.
- Examples:
Basic perfect numbers: >>> perfect(6) True >>> perfect(28) True >>> perfect(496) True >>> perfect(8128) True
Large perfect number: >>> perfect(33550336) True
Non-perfect numbers: >>> perfect(12) False >>> perfect(27) False >>> perfect(29) False >>> perfect(100) False
Edge cases: >>> perfect(1) False >>> perfect(2) False >>> perfect(0) False >>> perfect(-1) False >>> perfect(-6) False
Numbers close to perfect numbers: >>> perfect(5) False >>> perfect(7) False >>> perfect(27) False >>> perfect(29) False >>> perfect(495) False >>> perfect(497) False >>> perfect(33550335) False >>> perfect(33550337) False
Type validation: >>> perfect(12.34) Traceback (most recent call last): … ValueError: number must be an integer >>> perfect(“123”) Traceback (most recent call last): … ValueError: number must be an integer >>> perfect(“Hello”) Traceback (most recent call last): … ValueError: number must be an integer >>> perfect([6]) Traceback (most recent call last): … ValueError: number must be an integer >>> perfect(None) Traceback (most recent call last): … ValueError: number must be an integer
Testing divisor sum calculation for known cases: >>> # For 6: divisors are 1, 2, 3 -> sum = 6 >>> sum(i for i in range(1, 6//2 + 1) if 6 % i == 0) == 6 True >>> # For 28: divisors are 1, 2, 4, 7, 14 -> sum = 28 >>> sum(i for i in range(1, 28//2 + 1) if 28 % i == 0) == 28 True >>> # For 12: divisors are 1, 2, 3, 4, 6 -> sum = 16 ≠ 12 >>> sum(i for i in range(1, 12//2 + 1) if 12 % i == 0) == 12 False
- maths.perfect_number.perfect_optimized(number: int) bool¶
Optimized version of perfect number checker using mathematical properties.
This version uses the fact that divisors come in pairs (d, n/d) to reduce the search space to sqrt(n).
Time Complexity: O(sqrt(n)) Space Complexity: O(1)
- Args:
number: The positive integer to be checked.
- Returns:
True if the number is a perfect number, False otherwise.
- Examples:
>>> perfect_optimized(6) True >>> perfect_optimized(28) True >>> perfect_optimized(496) True >>> perfect_optimized(12) False >>> perfect_optimized(1) False >>> perfect_optimized(0) False >>> perfect_optimized(-1) False
- maths.perfect_number.user_input¶