किसी तरह, मैं दिखा सकता हूं कि द्विआधारी खोज एल्गोरिथ्म ।O(lg n⋅(lg lg n)2)
सबसे पहले, , वहाँ । बाइनरी सर्च एल्गोरिथ्म:
प्रत्येक , हम खोजने के लिए बाइनरी खोज का उपयोग करते हैं ।ab=nb<lg n
ba
हर बार तेज घातांक का उपयोग करके लागत संचालन की गणना । इसलिए, शेष अंक की श्रेणी ।ablg b=lg lg na
यदि का अधिकतम संभव मान , तो बाइनरी खोज को संचालन की आवश्यकता है Aalg A
ध्यान दें कि , यह
जब ,
b lg a=lg n
lg A=lg nb
∑lg A=lg n⋅(11+12+...+1B)=lg n⋅lg B=lg n⋅lg lg n
दूसरे शब्दों में, द्विआधारी खोज के सभी ऑपरेशनO(lg n⋅lg lg n)
के संचालन पर विचार करें , यह अंत में है। हे ( एल जी एन ⋅ ( एल जी एल जी एन ) 2 )abO(lg n⋅(lg lg n)2)
ps: सभी lg बेस 2 हैं।
पायथन कोड:
#--- 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