Skip to content

Commit e2cd982

Browse files
Variiiestpre-commit-ci[bot]cclauss
authored
Weird numbers (TheAlgorithms#6871)
* Create weird_number.py In number theory, a weird number is a natural number that is abundant but not semiperfect * check * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * resolved * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * removed * Update weird_number.py * Update weird_number.py * Update weird_number.py Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <[email protected]>
1 parent bae08ad commit e2cd982

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

maths/weird_number.py

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
"""
2+
https://en.wikipedia.org/wiki/Weird_number
3+
4+
Fun fact: The set of weird numbers has positive asymptotic density.
5+
"""
6+
from math import sqrt
7+
8+
9+
def factors(number: int) -> list[int]:
10+
"""
11+
>>> factors(12)
12+
[1, 2, 3, 4, 6]
13+
>>> factors(1)
14+
[1]
15+
>>> factors(100)
16+
[1, 2, 4, 5, 10, 20, 25, 50]
17+
18+
# >>> factors(-12)
19+
# [1, 2, 3, 4, 6]
20+
"""
21+
22+
values = [1]
23+
for i in range(2, int(sqrt(number)) + 1, 1):
24+
if number % i == 0:
25+
values.append(i)
26+
if int(number // i) != i:
27+
values.append(int(number // i))
28+
return sorted(values)
29+
30+
31+
def abundant(n: int) -> bool:
32+
"""
33+
>>> abundant(0)
34+
True
35+
>>> abundant(1)
36+
False
37+
>>> abundant(12)
38+
True
39+
>>> abundant(13)
40+
False
41+
>>> abundant(20)
42+
True
43+
44+
# >>> abundant(-12)
45+
# True
46+
"""
47+
return sum(factors(n)) > n
48+
49+
50+
def semi_perfect(number: int) -> bool:
51+
"""
52+
>>> semi_perfect(0)
53+
True
54+
>>> semi_perfect(1)
55+
True
56+
>>> semi_perfect(12)
57+
True
58+
>>> semi_perfect(13)
59+
False
60+
61+
# >>> semi_perfect(-12)
62+
# True
63+
"""
64+
values = factors(number)
65+
r = len(values)
66+
subset = [[0 for i in range(number + 1)] for j in range(r + 1)]
67+
for i in range(r + 1):
68+
subset[i][0] = True
69+
70+
for i in range(1, number + 1):
71+
subset[0][i] = False
72+
73+
for i in range(1, r + 1):
74+
for j in range(1, number + 1):
75+
if j < values[i - 1]:
76+
subset[i][j] = subset[i - 1][j]
77+
else:
78+
subset[i][j] = subset[i - 1][j] or subset[i - 1][j - values[i - 1]]
79+
80+
return subset[r][number] != 0
81+
82+
83+
def weird(number: int) -> bool:
84+
"""
85+
>>> weird(0)
86+
False
87+
>>> weird(70)
88+
True
89+
>>> weird(77)
90+
False
91+
"""
92+
return abundant(number) and not semi_perfect(number)
93+
94+
95+
if __name__ == "__main__":
96+
import doctest
97+
98+
doctest.testmod(verbose=True)
99+
for number in (69, 70, 71):
100+
print(f"{number} is {'' if weird(number) else 'not '}weird.")

0 commit comments

Comments
 (0)