Skip to content

Commit a328ee0

Browse files
improved perfect number algorithm in maths module
1 parent ca5b8c1 commit a328ee0

File tree

1 file changed

+17
-76
lines changed

1 file changed

+17
-76
lines changed

maths/perfect_number.py

Lines changed: 17 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,27 @@
1-
"""
2-
== Perfect Number ==
3-
In number theory, a perfect number is a positive integer that is equal to the sum of
4-
its positive divisors, excluding the number itself.
5-
For example: 6 ==> divisors[1, 2, 3, 6]
6-
Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6
7-
So, 6 is a Perfect Number
8-
9-
Other examples of Perfect Numbers: 28, 486, ...
10-
11-
https://en.wikipedia.org/wiki/Perfect_number
12-
"""
13-
14-
15-
def perfect(number: int) -> bool:
1+
def is_perfect_number(n: int) -> bool:
162
"""
17-
Check if a number is a perfect number.
3+
Check whether a number is a Perfect Number.
184
19-
A perfect number is a positive integer that is equal to the sum of its proper
20-
divisors (excluding itself).
5+
A perfect number is a positive integer that is equal to the sum
6+
of its proper positive divisors (excluding itself).
217
22-
Args:
23-
number: The number to be checked.
24-
25-
Returns:
26-
True if the number is a perfect number otherwise, False.
27-
Start from 1 because dividing by 0 will raise ZeroDivisionError.
28-
A number at most can be divisible by the half of the number except the number
29-
itself. For example, 6 is at most can be divisible by 3 except by 6 itself.
30-
Examples:
31-
>>> perfect(27)
32-
False
33-
>>> perfect(28)
34-
True
35-
>>> perfect(29)
36-
False
37-
>>> perfect(6)
8+
>>> is_perfect_number(6)
389
True
39-
>>> perfect(12)
40-
False
41-
>>> perfect(496)
42-
True
43-
>>> perfect(8128)
44-
True
45-
>>> perfect(0)
46-
False
47-
>>> perfect(-1)
48-
False
49-
>>> perfect(33550336) # Large perfect number
10+
>>> is_perfect_number(28)
5011
True
51-
>>> perfect(33550337) # Just above a large perfect number
52-
False
53-
>>> perfect(1) # Edge case: 1 is not a perfect number
12+
>>> is_perfect_number(10)
5413
False
55-
>>> perfect("123") # String representation of a number
56-
Traceback (most recent call last):
57-
...
58-
ValueError: number must be an integer
59-
>>> perfect(12.34)
60-
Traceback (most recent call last):
61-
...
62-
ValueError: number must be an integer
63-
>>> perfect("Hello")
64-
Traceback (most recent call last):
65-
...
66-
ValueError: number must be an integer
6714
"""
68-
if not isinstance(number, int):
69-
raise ValueError("number must be an integer")
70-
if number <= 0:
15+
if n <= 1:
7116
return False
72-
return sum(i for i in range(1, number // 2 + 1) if number % i == 0) == number
73-
74-
75-
if __name__ == "__main__":
76-
from doctest import testmod
7717

78-
testmod()
79-
print("Program to check whether a number is a Perfect number or not...")
80-
try:
81-
number = int(input("Enter a positive integer: ").strip())
82-
except ValueError:
83-
msg = "number must be an integer"
84-
raise ValueError(msg)
18+
divisors_sum = 1
19+
i = 2
20+
while i * i <= n:
21+
if n % i == 0:
22+
divisors_sum += i
23+
if i != n // i:
24+
divisors_sum += n // i
25+
i += 1
8526

86-
print(f"{number} is {'' if perfect(number) else 'not '}a Perfect Number.")
27+
return divisors_sum == n

0 commit comments

Comments
 (0)