与えられたに対して、次のような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
pが50の場合、最大50回の操作が必要になります
2 のすべてのべき乗を 2^50 まで事前に計算し、二分探索を使用して p を見つけることができます。これには約 log(50) 操作が必要ですが、少し過剰で醜いですか?
C ベースのソリューションについては、次のスレッドを見つけました:高速ログ ベース 2 天井を計算する
しかし、それは少し醜いようで、Pythonに変換する方法が正確にはわかりませんでした.