для данного x < 10^15
, быстро и точно определить максимальное целое число p
такое, что 2^p <= x
Вот некоторые вещи, которые я пробовал:
Сначала я попробовал это, но это не точно для больших чисел:
>>> from math import log
>>> x = 2**3
>>> x
8
>>> p = int(log(x, 2))
>>> 2**p == x
True
>>> x = 2**50
>>> p = int(log(x, 2))
>>> 2**p == x #not accurate for large numbers?
False
Я мог бы попробовать что-то вроде:
p = 1
i = 1
while True:
if i * 2 > n:
break
i *= 2
p += 1
not_p = n - p
Это займет до 50 операций, если p было 50
Я мог предварительно вычислить все полномочия 2 до 2 ^ 50 и использовать бинарный поиск для поиска p. Это потребует около log (50) операций, но кажется немного чрезмерным и уродливым?
Я нашел эту тему для решений на основе C: Вычислить быстрый бревенчатый фундамент 2 потолка
Однако это кажется немного уродливым, и я не был точно уверен, как его преобразовать в python.