Bằng cách nào đó, tôi có thể thấy rằng các thuật toán tìm kiếm nhị phân là .O(lg n⋅(lg lg n)2)
Thứ nhất, , có b < l g n . Thuật toán tìm kiếm nhị phân:
Với mỗi b , chúng tôi sử dụng tìm kiếm nhị phân để tìm a .ab=nb<lg n
ba
Mỗi lần tính toán của chi phí l g b = l g l g n hoạt động bằng cách sử dụng lũy thừa nhanh . Do đó, vấn đề còn lại là phạm vi của a .ablg b=lg lg na
Nếu là giá trị tối đa có thể có của a , thì tìm kiếm nhị phân cần l g A hoạt độngAalg A
Lưu ý rằng , đó là
l g A = l g nb l g a = l g n
Khi tổng hợp,
ΣlgMột=lgn⋅(1
tôi g A = l g nb
Σ l g A = l g n ⋅ ( 11+ 12+ . . . + 1B) = l g n ⋅ l g B = l g n ⋅ l g tôi g n
Ô ( l g n ⋅ l g tôi g n )
mộtbÔ ( l g n ⋅ ( l g tôi g n )2)
ps: Tất cả các lg là cơ sở 2.
Mã Python:
#--- a^n ---------------------------------------
def fast_exponentation(a, n):
ans = 1
while n:
if n & 1 : ans = ans * a
a = a * a
n >>= 1
return ans
#------------------------------------------
# Determines whether n is a power a ^ b, O(lg n (lg lg n) ^ 2)
def is_power(n):
if (- n & n) == n: return True # 2 ^ k
lgn = 1 + ( len( bin ( abs ( n ) ) ) - 2)
for b in range(2,lgn):
# b lg a = lg n
lowa = 1L
higha = 1L << (lgn / b + 1)
while lowa < higha - 1:
mida = (lowa + higha) >> 1
ab = fast_exponentation(mida,b)
if ab > n: higha = mida
elif ab < n: lowa = mida
else: return True # mida ^ b
return False