सबसे पहले, यह सोचते हैं आप एक विशिष्ट लघुगणक ऑपरेटर है (कई भाषाओं लघुगणक 10
या आधार के आधार के लिए प्रदान कर रहे हैं e
केवल), logab
को logxb/logxa
के रूप में गणना की जा सकती है (जहां x
स्पष्ट रूप से आधार है जो आपकी भाषा प्रदान करता है)।
पायथन एक बेहतर हो जाता है क्योंकि यह ऊपर की मुश्किल समानता के बिना मनमानी आधार के लिए लॉगरिदम का काम कर सकता है।
तो एक तरफ या दूसरा, आपके पास एक विशिष्ट आधार पर लॉगरिदम प्राप्त करने का एक तरीका है। वहां से, यदि का आधार a
में एक पूर्णांक (नोट 1) है, तो b
a
की शक्ति है।
तो मैं जोड़ा किनारे मामलों की पहचान के साथ निम्न कोड के साथ शुरू करना चाहते हैं, अब:
# Don't even think about using this for negative powers :-)
def isPower (num, base):
if base == 1 and num != 1: return False
if base == 1 and num == 1: return True
if base == 0 and num != 1: return False
power = int (math.log (num, base) + 0.5)
return base ** power == num
उदाहरण के लिए देखें निम्नलिखित पूरा कार्यक्रम जो कार्रवाई में यह पता चलता है:
import math
def isPower (num, base):
if base == 1 and num != 1: return False
if base == 1 and num == 1: return True
if base == 0 and num != 1: return False
power = int (math.log (num, base) + 0.5)
return base ** power == num
print isPower (127,2) # false
print isPower (128,2) # true
print isPower (129,2) # false
print
print isPower (26,3) # false
print isPower (27,3) # true
print isPower (28,3) # false
print isPower (3**10,3) # true
print isPower (3**129,3) # true
print
print isPower (5,5) # true
print isPower (1,1) # true
print isPower (10,1) # false
यदि आप ऐसे हैं जो फ़्लोटिंग पॉइंट ऑपरेशंस के बारे में चिंतित हैं, तो आप बार-बार गुणा के साथ कर सकते हैं लेकिन आपको प्रदर्शन का परीक्षण करना चाहिए ऐसे समाधान का एनसीई क्योंकि यह हार्डवेयर में हार्डवेयर की तुलना में काफी धीमी होने की संभावना है। isPower(128,2)
जैसी चीजों के लिए इससे कोई फर्क नहीं पड़ता है, लेकिन यह isPower(verybignum,2)
के लिए चिंता का विषय बन सकता है।
ऊपर कोड की एक गैर फ्लोटिंग बिंदु संस्करण के लिए:
def isPower (num, base):
if base == 1 and num != 1: return False
if base == 1 and num == 1: return True
if base == 0 and num != 1: return False
testnum = base
while testnum < num:
testnum = testnum * base
return testnum == num
लेकिन यकीन है कि यह आप किसी भी प्रदर्शन के झटके नहीं मिलता है सुनिश्चित करने के लिए अपने सबसे बड़ी संख्या है और छोटी से छोटी आधार के खिलाफ परीक्षण किया है बनाते हैं।
(नोट 1) संभावना को ध्यान में यहाँ रखें चल बिन्दु अस्पष्टता यह बिल्कुल कोई पूर्णांक नहीं है मतलब हो सकता है कि। आपको "पर्याप्त बंद" तुलना का उपयोग करना पड़ सकता है।
मदद करता है कि आप जांच नहीं कर रहे हैं कि math.log (n, base) * कोई * पूर्णांक है या नहीं? –
'math.log (n, base)' बराबर बराबर 'आधार ** एन' क्यों होगा? 128 2 की शक्ति है, लेकिन '2 ** 128' निश्चित रूप से' 7' नहीं है। – chrisaycock