करत्सुबा एल्गोरिथम

करात्सुबा कलनविधि तेज़ गुणन कलनविधि है। इसकी खोज 1960 में अनातोली करत्सुबा द्वारा की गई थी और 1962 में प्रकाशित हुई थी।  यह विभाजन और जीत कलनविधि है जो दो n-अंकीय संख्याओं के गुणन को घटाकर n/2-अंकीय संख्याओं के तीन गुणा तक कम कर देता है और, इस कमी को, अधिकतम $$ n^{\log_23}\approx n^{1.58}$$ एकल अंकों का गुणन में दोहराता है। इसलिए यह लंबे गुणन कलनविधि की तुलना में स्पर्शोन्मुख जटिलता है, जो प्रदर्शन  $$n^2$$ एकल अंक वाले उत्पाद करता है। उदाहरण के लिए, दो 1024-अंकीय संख्याओं (n = 1024 = 210) को गुणा करने के लिए, पारंपरिक एल्गोरिथम को (210)2 = 1,048,576 एकल-अंकीय गुणन की आवश्यकता है, चूंकि करात्सुबा एल्गोरिदम के लिए 310 = 59,049 की आवश्यकता होती है, इस प्रकार ~17.758 गुना तेज है।

करात्सुबा एल्गोरिथम द्विघात ग्रेड स्कूल एल्गोरिथम की तुलना में एसिम्प्टोटिक रूप से तेज़ पहला गुणन एल्गोरिथम था।

टूम-कुक एल्गोरिथम (1963) करात्सुबा की विधि का तेज़ सामान्यीकरण है, और शॉनहेज-स्ट्रैसन एल्गोरिथम (1971) पर्याप्त रूप से बड़े n के लिए और भी तेज़ है।

इतिहास
दो n-अंकीय संख्याओं के गुणा के लिए मानक प्रक्रिया के लिए बिग-ओ नोटेशन में $$n^2\,\!$$, या $$O(n^2)\,\!$$ के समानुपातिक कई प्राथमिक संक्रियाओं की आवश्यकता होती है। एंड्री कोलमोगोरोव ने अनुमान लगाया कि पारंपरिक एल्गोरिदम असीमित रूप से इष्टतम था, जिसका अर्थ है कि उस कार्य के लिए किसी भी एल्गोरिदम $$\Omega(n^2)\,\!$$ प्राथमिक संचालन की आवश्यकता होगी।

1960 में, कोलमोगोरोव ने मॉस्को स्टेट यूनिवर्सिटी में साइबरनेटिक्स में गणितीय समस्याओं पर संगोष्ठी का आयोजन किया, जहाँ उन्होंने कहा कि $$\Omega(n^2)\,\!$$ कम्प्यूटेशनल जटिलता सिद्धांत में अनुमान और अन्य समस्याओं को बताया है। सप्ताह के अन्दर, 23 वर्षीय छात्र करत्सुबा ने एल्गोरिदम पाया जो दो एन-अंकीय संख्याओं को $$O(n^{\log_2 3})$$से गुणा करता है, प्रारंभिक चरण, इस प्रकार अनुमान को अस्वीकार करते हैं। कोलमोगोरोव इस खोज को लेकर बहुत उत्साहित थे; उन्होंने संगोष्ठी की अगली बैठक में इसकी सूचना दी, जिसे तब समाप्त कर दिया गया था। कोलमोगोरोव ने दुनिया भर के सम्मेलनों में करात्सुबा परिणाम पर कुछ व्याख्यान दिए (उदाहरण के लिए देखें, गणितज्ञों की अंतर्राष्ट्रीय कांग्रेस की कार्यवाही 1962, पीपी है। 351-356, और स्टॉकहोम में गणितज्ञों की अंतर्राष्ट्रीय कांग्रेस में दिए गए 6 व्याख्यान, 1962) और यूएसएसआर एकेडमी ऑफ साइंसेज की कार्यवाही में 1962 में विधि प्रकाशित किया था। लेख कोल्मोगोरोव द्वारा लिखा गया था और इसमें गुणन पर दो परिणाम, करात्सुबा के कलनविधि और यूरी पेट्रोविच ऑफमैन द्वारा अलग परिणाम; इसमें ए. करत्सुबा और यू. लेखक के रूप में ऑफमैन सम्मिलित थे। करत्सुबा को केवल कागज के बारे में पता चला जब उन्हें प्रकाशक से पुनर्मुद्रण प्राप्त हुआ है।

मूलभूत चरण
करात्सुबा के कलनविधि का मूल सिद्धांत एक सूत्र का उपयोग करके विभाजित और जीतना है, जो किसी को दो बड़ी संख्याओं $$x$$ और $$y$$ के उत्पाद की गणना करने की अनुमति देता है, छोटी संख्याओं के तीन गुणन का उपयोग करके, प्रत्येक में $$x$$ या $$y$$ के रूप में लगभग आधे अंक साथ ही कुछ जोड़ और अंक बदलाव होते हैं। यह मूलभूत चरण, वास्तविक में, एक समान जटिल गुणन कलनविधि का एक सामान्यीकरण है, जहां काल्पनिक इकाई $i$ मूलांक की घात द्वारा प्रतिस्थापित किया जाता है।

होने देना $$x$$ और $$y$$ के रूप में प्रतिनिधित्व किया जाए $$n$$-संख्या रेखा कुछ आधार में $$B$$, किसी भी सकारात्मक पूर्णांक के लिए $$m$$ से कम $$n$$, दी गई दो संख्याओं को इस प्रकार लिख सकते हैं


 * $$x = x_1 B^m + x_0,$$
 * $$y = y_1 B^m + y_0,$$

जहाँ $$x_0$$ और $$y_0$$ से कम $$B^m$$. उत्पाद है तो

$$ \begin{align} xy &= (x_1 B^m + x_0)(y_1 B^m + y_0) \\ &= x_1 y_1 B^{2m} + (x_1 y_0 + x_0 y_1) B^m + x_0 y_0 \\ &= z_2 B^{2m} + z_1 B^m + z_0, \\ \end{align} $$

जहाँ


 * $$z_2 = x_1 y_1,$$
 * $$z_1 = x_1 y_0 + x_0 y_1,$$
 * $$z_0 = x_0 y_0.$$

इन सूत्रों के लिए चार गुणन की आवश्यकता होती है और वे चार्ल्स बैबेज के लिए जाने जाते थे। करत्सुबा ने देखा $$xy$$ कुछ अतिरिक्त परिवर्धन की मान पर, केवल तीन गुणा में गणना की जा सकती है। साथ में $$z_0$$ और $$z_2$$ जैसा कि पहले कोई देख सकता है



\begin{align} z_1 &= x_1 y_0 + x_0 y_1 \\ &= x_1 y_0 + x_0 y_1 + x_1 y_1 - x_1 y_1 + x_0 y_0 - x_0 y_0 \\ &= x_1 y_0 + x_0 y_0 + x_0 y_1 + x_1 y_1 - x_1 y_1 - x_0 y_0 \\ &= (x_1 + x_0) y_0 + (x_0 + x_1) y_1 - x_1 y_1 - x_0 y_0 \\ &= (x_1 + x_0) (y_0 + y_1) - x_1 y_1 - x_0 y_0 \\ &= (x_1 + x_0) (y_1 + y_0) - z_2 - z_0. \\ \end{align} $$

उदाहरण
12345 और 6789 के उत्पाद की गणना करने के लिए, जहां b = 10, M = 3 चुनें। हम परिणामी आधार (b) का उपयोग करके इनपुट ऑपरेंड को विघटित करने के लिए Mm = 1000) राइट शिफ्ट का उपयोग करते हैं, जैसा:
 * 12345 = '12' · 1000 + '345'
 * 6789 = '6' · 1000 + '789'

केवल तीन गुणन, जो छोटे पूर्णांकों पर संचालित होता है, का उपयोग तीन आंशिक परिणामों की गणना करने के लिए किया जाता है:
 * Z2 = 12 × 6 = 72
 * Z0 = 345 × 789 = 272205
 * Z1 = (12 + 345) × (6 + 789) - Z2 - Z0 = 357 × 795 − 72 − 272205 = 283815 − 72 − 272205 = 11538

हम केवल इन तीन आंशिक परिणामों को जोड़कर परिणाम प्राप्त करते हैं, तदनुसार स्थानांतरित कर दिया जाता है (और फिर इनपुट ऑपरेंड के लिए इन तीन इनपुटों को आधार 1000 में विघटित करके ध्यान में रखा जाता है):
 * परिणाम = Z2 · (Bm)2 + के Z1 · (Bm)1 + के Z0 · (Bm)0, अर्थात्
 * परिणाम = 72 · 10002 + 11538 · 1000 + 272205 = '83810205'।

ध्यान दें कि मध्यवर्ती तीसरा गुणन इनपुट डोमेन पर संचालित होता है जो पहले दो गुणाओं की तुलना में दो गुना बड़ा होता है, इसका आउटपुट डोमेन चार गुना से कम बड़ा होता है, और इन दो घटावों की गणना करते समय पहले दो गुणाओं से गणना की गई आधार-1000 को ध्यान में रखा जाना चाहिए।

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

पूर्ण 32-बिट गुणा 32-बिट बाइनरी गुणक वाले कंप्यूटर में, उदाहरण के लिए, कोई B = 231 चुन सकता है और प्रत्येक अंक को अलग 32-बिट बाइनरी शब्द के रूप में संग्रहीत करें। फिर योग x1 + x0 और y1 + y0 कैरी-ओवर डिजिट (कैरी-सेव योजक के रूप में) को स्टोर करने के लिए अतिरिक्त बाइनरी शब्द की आवश्यकता नहीं होगी, और करत्सुबा रिकर्सन को तब तक प्रायुक्त किया जा सकता है जब तक कि संख्याओं को गुणा करने के लिए केवल अंक लंबा न हो।

समय जटिलता विश्लेषण
करात्सुबा का मूल चरण किसी भी आधार b और किसी भी m के लिए काम करता है, लेकिन पुनरावर्ती कलनविधि सबसे अधिक कुशल होता है जब MN / 2 के बराबर होता है, और गोल होता है। विशेष रूप से, यदि n 2k है, कुछ पूर्णांक k के लिए, और पुनरावर्तन केवल तभी रुकता है जब n 1 हो, तो एकल-अंक गुणन की संख्या 3k है, जो कि nc है जहाँ c = log23.

चूंकि कोई भी इनपुट शून्य अंकों के साथ बढ़ा सकता है जब तक कि उनकी लंबाई दो की घात न हो, यह निम्नानुसार है कि किसी भी एन के लिए प्राथमिक गुणन की संख्या अधिकतम है $$3^{ \lceil\log_2 n \rceil} \leq 3 n^{\log_2 3}\,\!$$.

चूंकि करात्सुबा के मूलभूत चरण में जोड़, घटाव और अंकों की शिफ्ट (b की घातयों से गुणा) n के अनुपात में समय लेती है, इसलिए n बढ़ने पर उनकी लागत नगण्य हो जाती है। अधिक सटीक रूप से, यदि T (n) प्राथमिक संचालन की कुल संख्या को दर्शाता है जो एल्गोरिदम दो एन-अंकीय संख्याओं को गुणा करते समय करता है, तो


 * $$T(n) = 3 T(\lceil n/2\rceil) + cn + d$$

कुछ स्थिरांक c और d के लिए। इस पुनरावर्तन संबंध के लिए, मास्टर प्रमेय (एल्गोरिदम का विश्लेषण) पुनरावृत्ति संबंध लिए मास्टर प्रमेय बिग ओ नोटेशन सीमा देता है

$$T(n) = \Theta(n^{\log_2 3})\,\!$$.

यह इस प्रकार है कि, पर्याप्त रूप से बड़े n के लिए, करत्सुबा का कलनविधि लांगहैंड गुणन की तुलना में कम बदलाव और एकल-अंक जोड़ देगा, भले ही इसका मूल चरण सीधे सूत्र की तुलना में अधिक जोड़ और बदलाव का उपयोग करता है। n के छोटे मूल्यों के लिए, हालांकि, अतिरिक्त शिफ्ट और ऐड ऑपरेशंस इसे लांगहैंड विधि से धीमा कर सकते हैं। सकारात्मक रिटर्न का बिंदु कंप्यूटर मंच और संदर्भ पर निर्भर करता है। अंगूठे के नियम के रूप में, करात्सुबा की विधि सामान्यतः तेज़ होती है जब गुणक 320-640 बिट्स से अधिक होते हैं।

कार्यान्वयन
यहाँ इस एल्गोरिथम के लिए स्यूडोकोड है, आधार दस में प्रदर्शित संख्याओं का उपयोग करते हुए। पूर्णांकों के द्विआधारी प्रतिनिधित्व के लिए, यह हर जगह 10 को 2 से बदलने के लिए पर्याप्त है।

विभाजन_पर फलन का दूसरा तर्क दाईं ओर से निकाले जाने वाले अंकों की संख्या निर्दिष्ट करता है: उदाहरण के लिए, विभाजन_पर( 12345, 3) ​​3 अंतिम अंक, जो देगा: उच्च= 12 , निम्न= 345 निकालेगा। समस्या जो तब होती है जब कार्यान्वयन यह है कि उपरोक्त गणना $$(x_1 + x_0)$$ और $$(y_1 + y_0)$$ के लिए $$z_1$$ परिणाम अतिप्रवाह हो सकता है (परिणाम श्रेणी में उत्पन्न करेगा $$B^m \leq \text{result} < 2 B^m$$), जिसके लिए अतिरिक्त बिट वाले गुणक की आवश्यकता होती है। इसका ध्यान रखकर इससे बचा जा सकता है


 * $$z_1 = (x_0 - x_1)(y_1 - y_0) + z_2 + z_0.$$

यह गणना $$(x_0 - x_1)$$ और $$(y_1 - y_0)$$ की सीमा $$-B^m < \text{result} < B^m$$ में परिणाम देगा. यह विधि ऋणात्मक संख्याओं का उत्पादन कर सकती है, जिसके लिए अतिरिक्त बिट की आवश्यकता होती है, और फिर भी गुणक के लिए अतिरिक्त बिट की आवश्यकता होगी। हालाँकि, इससे बचने का तरीका यह है कि चिन्ह को रिकॉर्ड किया जाए और फिर के निरपेक्ष मान $$(x_0 - x_1)$$ और $$(y_1 - y_0)$$ अहस्ताक्षरित गुणन करने के लिए का उपयोग किया जाए, जिसके बाद दोनों संकेतों के मूल रूप से भिन्न होने पर परिणाम को नकारा जा सकता है। और लाभ यह है कि चाहे $$(x_0 - x_1)(y_1 - y_0)$$ ऋणात्मक हो सकता है, की अंतिम गणना $$z_1$$ केवल जोड़ शामिल है।

बाहरी संबंध

 * Karatsuba's Algorithm for Polynomial Multiplication
 * Bernstein, D. J., "Multidigit multiplication for mathematicians". Covers Karatsuba and many other multiplication algorithms.
 * Bernstein, D. J., "Multidigit multiplication for mathematicians". Covers Karatsuba and many other multiplication algorithms.