Skip to content

Commit ee533fc

Browse files
authored
add is_k_power_of_n.py to bit manipulation
1 parent beb3cfd commit ee533fc

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
def is_power(base: int, number: int) -> bool:
2+
"""
3+
Checks if a given integer `number` is a power of another integer `base`.
4+
5+
This function determines if there exists an integer x such that base^x = number.
6+
It handles positive integers only and raises an error for non-positive inputs.
7+
For more information, see: https://en.wikipedia.org/wiki/Power_of_two
8+
9+
Args:
10+
base: The base integer (must be a positive integer).
11+
number: The number to check if it's a power of base
12+
(must be a positive integer).
13+
14+
Returns:
15+
True if number is a power of base, False otherwise.
16+
17+
Raises:
18+
ValueError: If base or number are not positive integers.
19+
20+
Examples:
21+
>>> is_power(2, 8)
22+
True
23+
>>> is_power(3, 81)
24+
True
25+
>>> is_power(10, 1)
26+
True
27+
>>> is_power(5, 120)
28+
False
29+
>>> is_power(1, 1)
30+
True
31+
>>> is_power(1, 5)
32+
False
33+
>>> is_power(0, 5)
34+
Traceback (most recent call last):
35+
...
36+
ValueError: Both base and number must be positive integers
37+
>>> is_power(4, -16)
38+
Traceback (most recent call last):
39+
...
40+
ValueError: Both base and number must be positive integers
41+
"""
42+
if base <= 0 or number <= 0:
43+
raise ValueError("Both base and number must be positive integers")
44+
45+
if base == 1:
46+
return number == 1
47+
48+
# Repeatedly divide number by base until it's no longer divisible.
49+
while number % base == 0:
50+
number //= base
51+
52+
# If number has been reduced to 1, it was a power of base.
53+
return number == 1
54+
55+
56+
if __name__ == "__main__":
57+
import doctest
58+
59+
doctest.testmod()

0 commit comments

Comments
 (0)