पिछले कुछ उत्तर समय या अंतरिक्ष जटिलता ओ (एन) के तरीकों का उपयोग करते हैं, जहां एन सबसे बड़ी "छोटी संख्या" है जिसे स्वीकार किया जाएगा। इसके विपरीत, निम्नलिखित विधि ओ (sqrt (n)) समय में है, और ओ (1) अंतरिक्ष में है।
मान लीजिए कि सकारात्मक वास्तविक संख्या r = x + y
, जहां x=floor(r)
और 0 ≤ y < 1
। हम r
को a + √b
के रूप में अनुमानित करना चाहते हैं। x+y ≈ a+√b
तो x+y-a ≈ √b
, तो √b ≈ h+y
कुछ पूर्णांक ऑफ़सेट h
, और b ≈ (h+y)^2
के लिए। बी को पूर्णांक बनाने के लिए, हम सभी योग्य h
पर (h+y)^2
के आंशिक भाग को कम करना चाहते हैं। पर h
के योग्य मान हैं। निम्नलिखित पायथन कोड और नमूना आउटपुट देखें।
import math, random
def findb(y, rhi):
bestb = loerror = 1;
for r in range(2,rhi):
v = (r+y)**2
u = round(v)
err = abs(v-u)
if round(math.sqrt(u))**2 == u: continue
if err < loerror:
bestb, loerror = u, err
return bestb
#random.seed(123456) # set a seed if testing repetitively
f = [math.pi-3] + sorted([random.random() for i in range(24)])
print (' frac sqrt(b) error b')
for frac in f:
b = findb(frac, 12)
r = math.sqrt(b)
t = math.modf(r)[0] # Get fractional part of sqrt(b)
print ('{:9.5f} {:9.5f} {:11.7f} {:5.0f}'.format(frac, r, t-frac, b))
(नोट 1: इस कोड को डेमो के रूप में है, findb()
पैरामीटर y
, r
का आंशिक हिस्सा है, और rhi
, सबसे बड़ी छोटी संख्या का वर्गमूल हैं आप का उपयोग बदलने के लिए इच्छा हो सकती है। । मापदंडों नोट 2: कोड के
if round(math.sqrt(u))**2 == u: continue
लाइन b
का सही वर्ग मूल्यों लौटने से findb()
रोकता है, मूल्य ख = 1 के लिए छोड़कर, क्योंकि कोई पूर्ण वर्ग सटीकता ख द्वारा की पेशकश की सुधार कर सकते हैं = 1)
।
नमूना उत्पादन निम्नानुसार है। मध्य में लगभग एक दर्जन लाइनों को बढ़ाया गया है। पहली आउटपुट लाइन से पता चलता है कि pi
के आंशिक भाग का प्रतिनिधित्व करने के लिए यह प्रक्रिया b=51
उत्पन्न करती है, जो कि कुछ अन्य उत्तरों में समान मूल्य है।
frac sqrt(b) error b
0.14159 7.14143 -0.0001642 51
0.11975 4.12311 0.0033593 17
0.12230 4.12311 0.0008085 17
0.22150 9.21954 -0.0019586 85
0.22681 11.22497 -0.0018377 126
0.25946 2.23607 -0.0233893 5
0.30024 5.29150 -0.0087362 28
0.36772 8.36660 -0.0011170 70
0.42452 8.42615 0.0016309 71
...
0.93086 6.92820 -0.0026609 48
0.94677 8.94427 -0.0024960 80
0.96549 11.95826 -0.0072333 143
0.97693 11.95826 -0.0186723 143
प्रोग्राम के अंत में निम्नलिखित कोड जोड़े गए, नीचे दिखाया गया आउटपुट भी दिखाई देता है। यह पीआई के आंशिक भाग के लिए करीब अनुमान दिखाता है।
frac, rhi = math.pi-3, 16
print (' frac sqrt(b) error b bMax')
while rhi < 1000:
b = findb(frac, rhi)
r = math.sqrt(b)
t = math.modf(r)[0] # Get fractional part of sqrt(b)
print ('{:11.7f} {:11.7f} {:13.9f} {:7.0f} {:7.0f}'.format(frac, r, t-frac, b,rhi**2))
rhi = 3*rhi/2
frac sqrt(b) error b bMax
0.1415927 7.1414284 -0.000164225 51 256
0.1415927 7.1414284 -0.000164225 51 576
0.1415927 7.1414284 -0.000164225 51 1296
0.1415927 7.1414284 -0.000164225 51 2916
0.1415927 7.1414284 -0.000164225 51 6561
0.1415927 120.1415831 -0.000009511 14434 14641
0.1415927 120.1415831 -0.000009511 14434 32761
0.1415927 233.1415879 -0.000004772 54355 73441
0.1415927 346.1415895 -0.000003127 119814 164836
0.1415927 572.1415909 -0.000001786 327346 370881
0.1415927 911.1415916 -0.000001023 830179 833569
दो चीजें मेरे लिए स्पष्ट नहीं हैं: 1- शुरुआत में आपका वास्तविक नंबर किस प्रकार है; 2- इस बात पर विचार करते हुए कि बेवकूफ, क्रूर-बल एल्गोरिदम ओ (आर) समय में निरंतर समय अंकगणितीय परिचालनों को मानने का सबसे अच्छा जवाब देता है, आप "सेन" को क्या कहते हैं? (जब तक कि आप पैरामीटर को नकारात्मक न होने दें, वास्तव में, ब्रूट-फोर्स काम नहीं करता है) –
हां, आपके वास्तविक संख्याओं का बेहतर विवरण उपयोगी होगा। कुछ वास्तविकताओं को एक एस वर्ग (बी), जैसे पीआई द्वारा प्रदर्शित नहीं किया जा सकता है। – ckb
क्या ए और बी सकारात्मक पूर्णांक होने चाहिए? –