diff --git a/maths/perfect_number.py b/maths/perfect_number.py index 52c816cc7895..8b850a1d59b9 100644 --- a/maths/perfect_number.py +++ b/maths/perfect_number.py @@ -1,86 +1,27 @@ -""" -== 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 - -Other examples of Perfect Numbers: 28, 486, ... - -https://en.wikipedia.org/wiki/Perfect_number -""" - - -def perfect(number: int) -> bool: +def is_perfect_number(n: int) -> bool: """ - Check if a number is a perfect number. + Check whether a number is a Perfect Number. - A perfect number is a positive integer that is equal to the sum of its proper - divisors (excluding itself). + A perfect number is a positive integer that is equal to the sum + of its proper positive divisors (excluding itself). - Args: - number: The number to be checked. - - Returns: - True if the number is a perfect number otherwise, False. - Start from 1 because dividing by 0 will raise ZeroDivisionError. - A number at most can be divisible by the half of the number except the number - itself. For example, 6 is at most can be divisible by 3 except by 6 itself. - Examples: - >>> perfect(27) - False - >>> perfect(28) - True - >>> perfect(29) - False - >>> perfect(6) + >>> is_perfect_number(6) True - >>> perfect(12) - False - >>> perfect(496) - True - >>> perfect(8128) - True - >>> perfect(0) - False - >>> perfect(-1) - False - >>> perfect(33550336) # Large perfect number + >>> is_perfect_number(28) True - >>> perfect(33550337) # Just above a large perfect number - False - >>> perfect(1) # Edge case: 1 is not a perfect number + >>> is_perfect_number(10) False - >>> perfect("123") # String representation of a number - Traceback (most recent call last): - ... - ValueError: number must be an integer - >>> perfect(12.34) - Traceback (most recent call last): - ... - ValueError: number must be an integer - >>> perfect("Hello") - Traceback (most recent call last): - ... - ValueError: number must be an integer """ - if not isinstance(number, int): - raise ValueError("number must be an integer") - if number <= 0: + if n <= 1: return False - return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number - - -if __name__ == "__main__": - from doctest import testmod - testmod() - print("Program to check whether a number is a Perfect number or not...") - try: - number = int(input("Enter a positive integer: ").strip()) - except ValueError: - msg = "number must be an integer" - raise ValueError(msg) + divisors_sum = 1 + i = 2 + while i * i <= n: + if n % i == 0: + divisors_sum += i + if i != n // i: + divisors_sum += n // i + i += 1 - print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.") + return divisors_sum == n