Использование журнала от Предыдущий пост
from math import log
def is_power(a, b):
" check if a is a power of b (i.e. b is base)"
if b == 1 or a == 0: return False
return return b ** int(round(log(a, b))) == a
print(is_power(243, 3)) # returns True
Это должно работать для практических чисел
Возможно, стоит отметить, чтоХотя это решение не является полностью непогрешимым для больших значений, в зависимости от точности с плавающей точкой, оно должно быть невероятно большим, чтобы это стало проблемой. Например, при значениях b = 2, a = 2**(2**53 + 1)
и IEEE 754 это не может работать, но вам потребуется приблизительно 1,2 ПБ ОЗУ и машина с адресным пространством, большим 2**48
, чтобы иметь возможность представлять это значение впервое место. - Марк Динкинсон
Да, не существует компьютера с достаточным объемом памяти для хранения целых чисел, достаточно больших, чтобы это могло привести к ошибкам. Но я не упомянул об этом, потому что, если ОП удивился, что log () может быть не точным во всех случаях, они не совсем готовы оценить аргумент о широких пределах теоретических возможностей ;-) - ТимPeters
Производительность
По сравнению с методами полномочий, такими как процедура is_power_of, используемая в решении @chepner
for k in range(1, 300):
num = 3**k
assert is_power_of(num, 3) == is_power(num, 3)
Утверждений нет, поэтомуэти два метода равна по крайней мере, до сих 3 ^ 300 = 136891479058588375991326027382088315966463695625337436471480190078368997177499076593800206155688941388250484440597994042813512732765695774566001 (144 цифр)
num = 3**300
%timeit is_power_of(num, 3)--uses powers
100000 loops, best of 3: 136 µs per loop
%timeit is_power(num, 3)--uses log
100000 loops, best of 3: 2.71 µs per loop
Таким образом, метод журнала составляет более 50X быстрее для больших количествах, однако, эти два метода сопоставимы для меньших чисел