मनमाना परिशुद्धता पूर्णांक वर्गमूल कलन विधि?


9

nबिट पूर्णांक के वर्गमूल के तल की गणना के लिए क्या कोई ज्ञात उप-योग एल्गोरिदम हैं ?

भोली एल्गोरिथ्म कुछ इस तरह होगा

def sqrt(x):
    r = 0
    i = x.bit_length() // 2
    while i >= 0:
        inc = (r << (i+1)) + (1 << (i*2))
        if inc <= x:
            x -= inc
            r += 1 << i
        i -= 1
    return r

यह O(n)पुनरावृत्तियों को लेता है , प्रत्येक में अतिरिक्त जोड़ शामिल हैं जो O(n)समय है, इसलिए यह O(n^2)समग्र रूप से समय है। क्या कुछ तेज है? मुझे पता है कि गुणन के मामले में विशेष एल्गोरिदम हैं जो द्विघात समय से बेहतर करते हैं, लेकिन मुझे वर्गमूल के लिए कुछ भी नहीं मिल सकता है।


कुछ संबंधित से मेरा जवाब cs.stackexchange.com/a/37338/12052 मदद कर सकता है । केवल समस्या है, आवश्यक समीकरण का एक हिस्सा जिसे आपको अपनी सटीकता को ट्विक करने के लिए अनुभवजन्य रूप से खोजने की आवश्यकता होगी।
फ्रांसेस्को ग्रामानो

@FrancescoGramano: क्षमा करें, मुझे नहीं लगता कि मदद करता है।
आर्यभट्ट

btw, क्या यह उप-द्विघात आवश्यकता एक बड़ी समस्या का हिस्सा है? क्योंकि सरल द्विघात और जटिल उप-द्विघात के बीच का अंतर व्यवहार में उतना बड़ा नहीं हो सकता है। या यह सिर्फ सैद्धांतिक हित है?
आर्यभट्ट

@ आर्यभट्ट क्षमा करें, मैंने आपकी टिप्पणी पहले नहीं देखी थी। नहीं, यह एक बड़ी समस्या का हिस्सा नहीं है, बस जिज्ञासा है।
एंटीमनी

जवाबों:


5

बहुपद की जड़ों के लिए अनुमान लगाने के लिए आप न्यूटन की विधि या कई अन्य तरीकों का उपयोग कर सकते हैंp(x)=x2c

न्यूटन की विधि के लिए अभिसरण की दर द्विघात होगी, जिसका अर्थ है कि प्रत्येक पुनरावृत्ति में बिट्स की संख्या सही है। इसका मतलब है कीO(lgn) न्यूटन की विधि की पुनरावृत्तियाँ पर्याप्त हैं।

न्यूटन की विधि की प्रत्येक पुनरावृति गणना करती है

xj+1=xj(xj2c)/(2xj)=0.5xj+c2xj.

गुणा के बिट जटिलता है , गुणा दो के लिए -बिट पूर्णांकों (अनदेखी घटक)। विभाजन के लिए थोड़ा जटिलता (करने के लिए परिशुद्धता के टुकड़े) एक ही है। इसलिए, प्रत्येक पुनरावृत्ति की गणनाO (blgb)blglgbbO (nlgn)संचालन। द्वारा गुणा करनाO(lgn) पुनरावृत्तियों, हम पाते हैं कि वर्गमूल की गणना करने के लिए कुल समय चल रहा है n परिशुद्धता के बिट्स है O (n(lgn)2)। यह उप-द्विघात है।

मुझे लगता है कि अधिक सावधान विश्लेषण से पता चलता है कि इसमें सुधार किया जा सकता है O (nlgn) रनिंग टाइम (इस बात को ध्यान में रखकर कि हमें केवल प्रत्येक को जानना है xj के बारे में j परिशुद्धता के बिट्स, बजाय nपरिशुद्धता के बिट्स)। हालांकि, यहां तक ​​कि अधिक बुनियादी विश्लेषण पहले से ही चल रहे समय को दर्शाता है जो स्पष्ट रूप से अवचेतन है।


बाइनरी में भी पहचान का उपयोग करके एक महान प्रारंभिक अनुमान है x1/2=21/2log2x। लॉग की गणना करने के बजाय, कोई अनुमानित हो सकता हैlog2x अंकों की संख्या के रूप में x। उदाहरण के लिए,log21010116
निक अल्जीरिया

@ डब्लू: लेकिन क्या हम पूर्णांक वर्गमूल की तलाश नहीं कर रहे हैं? यदि आप केवल पूर्णांक अंकगणितीय का उपयोग करके न्यूटन की विधि पुनरावृत्ति करते हैं, तो हमें इसके लिए कुछ अतिरिक्त औचित्य की आवश्यकता हैO(logn)दावा है, हम नहीं? अन्यथा, हम पहले से ही पर्याप्त रूप से बड़ी परिशुद्धता मान रहे हैं ... क्षमा करें यदि मुझे कुछ स्पष्ट याद आ रहा है।
आर्यभट्ट २

@DW: "न्यूटन की विधि के लिए अभिसरण की दर" यदि द्विघात नहीं होगी c=0, और मुझे नहीं पता कि मूल्यों के लिए क्या होता है c यह गैर-नकारात्मक वास्तविक नहीं हैं। गुणन की थोड़ी जटिलता के लिए आपका अनुमान आपकी निम्न टिप्पणी से अधिक कठिन है इसके अलावा, हमें "प्रत्येक को जानने की आवश्यकता है xj के बारे में " 2j "सटीकता के बिट्स"।

@ आर्यभट्ट: हम काफी "पूर्णांक वर्गमूल की तलाश में" नहीं हैं; हम "वर्गमूल के तल" की तलाश कर रहे हैं। आप पूर्णांक अंकगणितीय समस्या के बारे में सही हैं, हालांकि फ़्लोटिंग-पॉइंट ऑपरेशन्स के लिए समान बिट जटिलताएँ हैं।

1
@ रिकीडेमर, हां, c=0 एक विशेष मामला है, क्योंकि तब की जड़ p(x) गुणन 2 है, लेकिन जब c>0तो न्यूटन की विधि, जड़ बहुलता 1 है करता द्विघात अभिसरण की है। मुझे लगता है कि कोई भी वर्ग के मूल की गणना करने के लिए न्यूटन की विधि का उपयोग नहीं करेगाc=0(क्योंकि शून्य का वर्गमूल स्पष्ट रूप से शून्य है)। तो आप क्या कहना चाह रहे हैं? क्या आपकी टिप्पणी एक तुच्छ टिप्पणी है जिसे मेरे उत्तर में कुछ ऐसा जोड़कर संबोधित किया गया है जो कहता है "विशेष-मामला शून्य का वर्गमूल", या क्या यहां कुछ गहरा है जो मुझे याद आ रहा है?
डीडब्ल्यू

7

न्यूटन की विधि के साथ समस्याओं में से एक यह है कि इसे प्रत्येक पुनरावृत्ति में एक विभाजन ऑपरेशन की आवश्यकता होती है, जो सबसे धीमा बुनियादी पूर्णांक ऑपरेशन है।

हालांकि, पारस्परिक वर्गमूल के लिए न्यूटन की विधि , नहीं है। अगरx वह संख्या है जिसके लिए आप ढूंढना चाहते हैं 1x, पुनरावृति:

ri+1=12ri(3xri2)

यह अक्सर के रूप में व्यक्त किया जाता है:

wi=ri2
di=1wix
ri+1=ri+ridi2

यह तीन गुणा ऑपरेशन है। दो द्वारा विभाजन को शिफ्ट-राइट के रूप में लागू किया जा सकता है।

अब समस्या यह है कि rपूर्णांक नहीं है। हालाँकि, आप इसे फ़्लोटिंग-पॉइंट को मैन्युअल रूप से कार्यान्वित करके, और उपयुक्त होने पर क्षतिपूर्ति करने के लिए शिफ़्ट ऑपरेशन का एक गुच्छा बनाकर इसमें हेरफेर कर सकते हैं।

सबसे पहले, आइए पुनर्विक्रय करें x:

x=22ex

हम कहाँ चाहेंगे x से बड़ा होना, लेकिन पास होना, 1। यदि हम उपरोक्त एल्गोरिथ्म को चलाते हैंx के बजाय x, हम खोजें r=1x। फिर,x=2erx

अब फूट डालो r एक मंटिसा और प्रतिपादक में:

ri=2eiri

कहाँ पे riएक पूर्णांक है। intuitively,ei उत्तर की शुद्धता का प्रतिनिधित्व करें।

हम जानते हैं कि न्यूटन की विधि लगभग महत्वपूर्ण अंकों की संख्या को दोगुना कर देती है। तो हम चुन सकते हैं:

ei+1=2ei

थोड़ा हेरफेर के साथ, हम पाते हैं:

ei+1=2ei
wi=ri2
xi=x22eei+1
di=2ei+1wixi2ei+1
ri+1=2eiriridi2ei+1

हर पुनरावृत्ति पर:

xrix2e+ei

एक उदाहरण के रूप में, चलो वर्गमूल की गणना करने का प्रयास करते हैं x=263। हमें पता है कि उत्तर है2312। पारस्परिक वर्गमूल है12231, तो हम सेट करेंगे e=31 (यह समस्या का पैमाना है) और हमारे प्रारंभिक अनुमान के लिए हम लेंगे r0=3 तथा e0=2। (अर्थात, हम उठाते हैं34 हमारे प्रारंभिक अनुमान के लिए 12।)

फिर:

e1=4,r1=11
e2=8,r2=180
e3=16,r3=46338
e4=32,r4=3037000481

हम बाहर काम कर सकते हैं जब तुलना द्वारा पुनरावृत्ति को रोकने के लिए ei सेवा e; यदि मैंने सही गणना की है,ei>2eकाफी अच्छा होना चाहिए। हम यहाँ रुकेंगे, हालाँकि, और पाएंगे:

2633037000481×263231+32=3037000481

सही पूर्णांक वर्गमूल है 3037000499, तो हम बहुत करीब हैं। हम एक और पुनरावृत्ति कर सकते हैं, या एक अनुकूलित अंतिम पुनरावृत्ति कर सकते हैं जो दोगुना नहीं हैei। विवरण एक अभ्यास के रूप में छोड़ दिया जाता है।

इस पद्धति की जटिलता का विश्लेषण करने के लिए, ध्यान दें कि दो गुणा करें b-बिट पूर्णांक लेता है O(blogb)संचालन। हालाँकि, हमने चीजों को व्यवस्थित किया है ताकिri<2ei। तो गणना करने के लिए गुणाwi गुणक दो ei-बिट संख्या का उत्पादन करने के लिए एक ei+1-बिट संख्या, और अन्य दो गुणन दो गुणा करते हैं ei+1-बिट संख्या का उत्पादन करने के लिए एक 2ei+1-बिट नंबर।

प्रत्येक मामले में, प्रति पुनरावृत्ति संचालन की संख्या है O(eilogei), और वहाँ है O(loge)पुनरावृत्तियों की आवश्यकता है। के आदेश पर अंतिम गुणा हैO(2elog2e)संचालन। तो समग्र जटिलता हैO(elog2e) संचालन, जो बिट्स की संख्या में उप-द्विघात है x। जो सभी बॉक्स को टिक कर देता है।

हालांकि, यह विश्लेषण एक महत्वपूर्ण सिद्धांत को छिपाता है जिसे बड़े पूर्णांक के साथ काम करने वाले सभी को ध्यान में रखना चाहिए: क्योंकि गुणन बिट्स की संख्या में अत्यधिक है, किसी भी गुणन कार्यों को केवल पूर्णांकों पर ही किया जाना चाहिए, जिसमें वर्तमान परिशुद्धता का परिमाण (और) है , मैं जोड़ सकता हूं, आपको संख्याओं को एक साथ गुणा करने की कोशिश करनी चाहिए जो परिमाण का एक समान क्रम है)। पूर्णांक से अधिक का उपयोग करना प्रयास की बर्बादी है। लगातार कारक मायने रखते हैं, और बड़े पूर्णांकों के लिए, वे बहुत मायने रखते हैं।

अंतिम अवलोकन के रूप में, गुणा के दो रूप हैं ab2c। स्पष्ट रूप से यह बेकार है कि सभी बिट्स की गणना करेंab केवल फेंकने के लिए cउनमें से एक सही बदलाव के साथ दूर। एक स्मार्ट गुणन पद्धति को लागू करना, जो इसे ध्यान में रखता है, एक अभ्यास के रूप में भी छोड़ दिया जाता है।


यह बढ़िया सामान है। एक टिप्पणी, हालांकि: विभाजन की बिट-जटिलता असमानता की दृष्टि से लगभग गुणा की जटिलता के समान नहीं है? तो आप एक ऐसी चीज के बारे में बात कर रहे हैं जो एक निरंतर कारक सुधार देती है, एक विषमतापूर्ण सुधार नहीं, है ना? यह आपके उत्तर से पूरी तरह से स्पष्ट नहीं था।
डीडब्ल्यू

आप कहते हैं कि दो को गुणा करें b-बिट पूर्णांक लेता है O(blgb)बिट संचालन। मुझे लगता है कि सही उत्तर कुछ ऐसा हैO(blgb(lglgb)O(1))(सही?)। आप इंगित करना चाह सकते हैं कि आप पॉली-लॉग-लॉग कारकों (जैसे कि अपने बड़े ओ, या कुछ और पर एक टिल्ड लगाकर) को अनदेखा कर रहे हैं।
डीडब्ल्यू

1
@DW: नहीं, वह कहता है कि "दो को गुणा करना b-बिट पूर्णांक लेता है O(blogb) संचालन। " "बिट" शब्द केवल एक बार उस में दिखाई देता है; अन्यथा मैं पहले ही बता देता।

यह लगातार कारकों की बात है, हाँ। सर्वश्रेष्ठ बड़े पूर्णांक विभाजन एल्गोरिदम पूरे एल्गोरिथ्म के समान एक तकनीक का उपयोग करते हैं, जैसे न्यूटन-राफसन पुनरावृत्ति और प्रत्येक पुनरावृत्ति पर प्रभावी परिशुद्धता को दोगुना करना। एक न्यूटन-रफसन लूप लगातार कारकों पर न्यूटन-राफसन लूप ढेर के भीतर! रिकी डेमर सही है; मैं रैम मॉडल शब्द में सोच रहा था। मुझे शायद इसका उल्लेख करना चाहिए था।
छद्म नाम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.