शॉनहगे-स्ट्रैसेन एल्गोरिथ्म में आंतरिक रिंग को कैसे चुना जाता है?


9

मैं शॉनहाज-स्ट्रैसेन पूर्णांक गुणन एल्गोरिथम को लागू करने की कोशिश कर रहा हूं, लेकिन पुनरावर्ती चरण में एक ठोकर मारा।

मेरा एक मूल्य है x साथ में nबिट्स और मैं गणना करना चाहते हैं । मैंने मूल रूप से सोचा था कि इस तरह के एक कश्मीर को चुनने के लिए 4 ^ k \ geq 2n , x को 2 ^ k टुकड़ों में 2 ^ {k-1} बिट्स के साथ विभाजित करें, modulo 2 ^ {2 ^ k} काम करते हुए SSA के कनवल्शन को लागू करें। +1 , मूल्य के अनुसार क्षमता के 2 ^ k बिट के साथ एक अंगूठी , फिर टुकड़ों को वापस एक साथ रखें। हालाँकि, कनवल्शन का आउटपुट 2n बिट्स से अधिक है (अर्थात > आउटपुट बिट्स प्रति आउटपुट मूल्य, जो कि रिंग की क्षमता से अधिक है, क्योंकि प्रत्येक आउटपुट वैल्यू कई उत्पादों का योग है) इसलिए यह काम नहीं करता है । मुझे पैडिंग के 2 के अतिरिक्त कारक पर जोड़ना था।x2(mod2n+1)k4k2nx2k2k122k+12k2n>2k

पैडिंग में 2 का वह अतिरिक्त कारक जटिलता को नष्ट कर देता है। यह मेरे पुनरावर्ती कदम को बहुत महंगा बनाता है। इसके बजाय का एक F(n)=nlgn+nF(2n)=Θ(nएलजीnएलजीएलजीn) एल्गोरिथ्म, मैं अंत एक साथ एफ(n)=nएलजीn+nएफ(4n)=Θ(nएलजी2n) एल्गोरिथ्म।

मैं विकिपीडिया से जुड़े हुए कुछ संदर्भों को पढ़ता हूं, लेकिन वे सभी इस बात पर गौर करते हैं कि यह समस्या कैसे हल होती है। उदाहरण के लिए, मैं modulo को लिए काम करके अतिरिक्त पैडिंग ओवरहेड से बच सकता हूं जो कि 2 की शक्ति नहीं है ... लेकिन तब चीजें बस बाद में टूट जाती हैं, जब मेरे पास केवल गैर-शक्ति होती है- शेष -2 कारक शेष और टुकड़ों की संख्या को दोगुना किए बिना Cooley-Tukey को लागू नहीं कर सकते। इसके अलावा, में एक बहुपरत व्युत्क्रम modulo नहीं हो सकता है । इसलिए अभी भी 2 के जबरदस्त कारक पेश किए जा रहे हैं।2पी2+1पीपी2p+1

मैं पुनरावर्ती चरण के दौरान उपयोग करने के लिए अंगूठी कैसे उठाता हूं, बिना स्पर्शोन्मुख जटिलता को उड़ाए?

या, छद्म कोड रूप में:

multiply_in_ring(a, b, n):
  ...
  // vvv                          vvv //
  // vvv HOW DOES THIS PART WORK? vvv //
  // vvv                          vvv //
  let inner_ring = convolution_ring_for_values_of_size(n);
  // ^^^                          ^^^ //
  // ^^^ HOW DOES THIS PART WORK? ^^^ //
  // ^^^                          ^^^ //

  let input_bits_per_piece = ceil(n / inner_ring.order);
  let piecesA = a.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);
  let piecesB = b.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);

  let piecesC = inner_ring.negacyclic_convolution(piecesA, piecesB);
  ...

कृपया एकाधिक साइटों पर एक ही प्रश्न पोस्ट न करें । प्रत्येक समुदाय को किसी का समय बर्बाद किए बिना जवाब देने के लिए एक ईमानदार शॉट होना चाहिए। मेरा सुझाव है कि आप दो प्रतियों में से एक को हटा दें।
डीडब्ल्यू

@DW किया। मैंने एक सप्ताह तक कोई जवाब नहीं दिया, मुझे लगा कि उस साइट के लिए यह बहुत कठिन है, इसके बाद मैंने क्रॉस-पोस्ट किया। स्पष्ट रूप से किसी भी उत्तर को वापस लिंक करने जा रहा था।
क्रेग गिदनी

मै समझता हुँ। यदि यह भविष्य में आता है, तो आप हमेशा मध्यस्थ ध्यान के लिए अपनी पोस्ट को ध्वजांकित कर सकते हैं और इसे माइग्रेट करने के लिए कह सकते हैं, और हम इसे आपके लिए CSTheory पर स्थानांतरित कर सकते हैं। समझने के लिए धन्यवाद!
DW

3
एल्गोरिथ्म का एक संस्करण है जो फॉर्म modulo नंबर काम करता है : A. Schönhage। जटिल गुणांक के साथ संख्यात्मक गुणन और बहुपद के विभाजन के लिए असममित रूप से तेज एल्गोरिदम। EUROCAM '82 में: यूरोपीय कंप्यूटर बीजगणित सम्मेलन, व्याख्यान। नोट्स COMP। विज्ञान। 144, 3-15। iai.uni-bonn.de/~schoe/publi39.dvi2ν2n
मार्कस ब्लैसर

IIRC आपके पास अब हटाए गए CS प्रश्न पर आंशिक स्व-उत्तर था। इसे खोना शर्म की बात लगती है। क्या आप इसे यहाँ शामिल कर सकते हैं (प्रश्न में, ताकि प्रश्न पहले ही उत्तर के रूप में चिह्नित न हो)?
पीटर टेलर

जवाबों:


4

यह जवाब कागज से लिया गया है "संख्यात्मक गुणांक और जटिल गुणांक के साथ बहुपद के विभाजन के लिए असममित रूप से तेज एल्गोरिदम" जो मार्कस टिप्पणियों में जुड़ा हुआ है।


आप एक वर्ग बनाना चाहते हैं n-बिट संख्या, मोडुलो 2n+1। यहाँ आप क्या करते हैं:

  • खोज p तथा s वह संतुष्ट है n=(p1)2s तथा sp2s

  • टुकड़ों की संख्या चुनें 2m विभाजित करना n टुकड़े के आकार के लिए बिट्स, और संबंधित पैरामीटर:

    m=s/2+1s2=s/2+1p2=p/2+1

    ध्यान दें कि s2 तथा p2 संतुष्ट करना जारी रखें s2p22s2अपरिवर्तनीय। उस पर भी ध्यान दें2m2s2p22n+m+1 संतुष्ट है, इसलिए इनपुट कमरे के लिए फिट बैठता है।

  • एफएफटी-आधारित नेगैसिलिक कनवल्शन को टुकड़ों पर करें, और बाकी, हमेशा की तरह।

तो यह अतिव्यापी विचार है: एक लघुगणक गद्दी कारक p। अब जटिलता विश्लेषण के लिए। एफएफटी लगेगाnm काम करना है, और हम आगे बढ़ रहे हैं 2m आकार के टुकड़े (p21)2s2, तो अब हम पुनरावृत्ति संबंध wrt के साथ अत्यंत कठिन गणित कर सकते हैं s:

F(s)()(p1)2sm+2mF(s/2+1)()2s2s(s/2+1)+2s/2+1F(s/2+1)()s22s+22s/2F(s/2+1)()s22s+4(s/2)22s+16(s/4)22s+...()2ss2lg(s)()nlgn(lgnlgn)2lglgnlgn()nlgn(lg2n)lglgn()n(lgn)lglgn

जो सही के बारे में लगता है, हालांकि मैंने उन चरणों में काफी धोखा दिया है।

'ट्रिक' इस तथ्य से प्रतीत होती है कि हम अंत तक हैं s2 के बजाय sआधार लागत में। अभी भी दो प्रतिवर्ती स्तर से दो गुणा है, जैसे कि मैं सवाल के बारे में शिकायत कर रहा था, लेकिन अब पड़ावsदोहरे-लाभांश का भुगतान कर रहा है, इसलिए यह सब काम करता है। फिर, अंत में, हम के अतिरिक्त कारक को रद्द करते हैंs (जो वास्तव में एक कारक है logn) बनाने के लिए धन्यवाद p लघुगणकीय बड़े सापेक्ष s शुरू में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.