इस जाहिरा तौर पर कहां गलती है- O (n lg n) गुणा एल्गोरिथ्म?


15

तीन समान रूप से स्थान प्राप्त करने के बारे में एक हालिया पहेली ब्लॉग पोस्ट ने मुझे एक शीर्ष उत्तर के साथ स्टैकओवरफ्लो प्रश्न का नेतृत्व किया जो कि ओ (एन एलजी एन) समय में करने का दावा करता है। दिलचस्प हिस्सा यह है कि समाधान में एक बहुपद को समाहित करना शामिल है, एक पेपर को संदर्भित करता है जो यह बताता है कि इसे ओ (एन एलजी एन) समय में कैसे किया जाए

अब, बहुपद को गुणा करना व्यावहारिक रूप से संख्याओं को गुणा करने के समान है। एकमात्र वास्तविक अंतर कैर्री की कमी है। लेकिन ... कैरी ओ (n lg n) टाइम में भी किया जा सकता है। उदाहरण के लिए:

    var value = 100; // = 0b1100100

    var inputBitCount = value.BitCount(); // 7 (because 2^7 > 100 >= 2^6)
    var n = inputBitCount * 2; // 14
    var lgn = n.BitCount(); // 4 (because 2^4 > 14 => 2^3)
    var c = lgn + 1; //5; enough space for 2n carries without overflowing

    // do apparently O(n log n) polynomial multiplication
    var p = ToPolynomialWhereBitsAreCoefficients(value); // x^6 + x^5 + x^2
    var p2 = SquarePolynomialInNLogNUsingFFT(p); // x^12 + 2x^11 + 2x^10 + x^8 + 2x^7 + x^4
    var s = CoefficientsOfPolynomial(p2); // [0,0,0,0,1,0,0,2,1,0,2,2,1]
    // note: s takes O(n lg n) space to store (each value requires at most c-1 bits)

    // propagate carries in O(n c) = O(n lg n) time
    for (var i = 0; i < n; i++)
        for (var j = 1; j < c; j++)
            if (s[i].Bit(j))
                s[i + j].IncrementInPlace();

    // extract bits of result (in little endian order)
    var r = new bool[n];
    for (var i = 0; i < n; i++)
        r[i] = s[i].Bit(0);

    // r encodes 0b10011100010000 = 10000

तो मेरा सवाल यह है: यहाँ गलती कहाँ है? O (n lg n) में संख्याओं को गुणा करना कंप्यूटर विज्ञान में एक बड़ी समस्या है, और मुझे वास्तव में संदेह है कि इसका उत्तर सरल होगा।

  • क्या वहन गलत है, या O (n lg n) नहीं है? मैंने काम किया है कि lg n + 1 बिट प्रति मूल्य वहन करने के लिए पर्याप्त है, और एल्गोरिथ्म इतना सरल है कि अगर यह गलत था तो मुझे आश्चर्य होगा। ध्यान दें कि, हालांकि एक व्यक्तिगत वेतन वृद्धि O (lg n) समय ले सकती है, x वेतन वृद्धि की कुल लागत O (x) है।
  • क्या पेपर से बहुपद गुणन एल्गोरिथ्म गलत है, या ऐसी स्थितियां हैं जिनका मैं उल्लंघन कर रहा हूं? पेपर एक संख्या सिद्धांत के बजाय एक तेजी से फूरियर रूपांतरण का उपयोग करता है, जो एक मुद्दा हो सकता है।
  • क्या कई स्मार्ट लोगों ने 40 वर्षों के लिए शॉनहगे-स्ट्रैसेन एल्गोरिदम का एक स्पष्ट संस्करण याद किया ? यह अब तक की सबसे कम संभावना है।

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


वर्ग शामिल नहीं होना चाहिए x^10 + 2x^8? x ^ 10 केवल एक बार (x ^ 5 * x ^ 5), और x ^ 8 दो बार (x ^ 6 * x ^ 2 + x ^ 2 * x ^ 6)
Sjoerd

मैंने हाथ से उदाहरण दिया। मैंने एक अंकगणित की गलती की। माफ़ करना। मैंने वास्तव में एल्गोरिथ्म को लागू किया और इसका परीक्षण किया और सही परिणाम प्राप्त किए, हालांकि।
क्रेग गिदनी

जवाबों:



1

यहाँ "गलती" यह है कि एक फूरियर ट्रांसफॉर्म को संख्याओं को जोड़ने या बदलने के लिए O (n log n) चरणों में परिकलित किया जा सकता है, लेकिन जैसे-जैसे n वास्तव में बड़े होते जाते हैं, वैसे-वैसे रूपांतरित होने वाली संख्याएं भी बड़ी होती जाती हैं, जो जुड़ती हैं एक अन्य कारक लॉग एन।

व्यवहार में, मुझे लगता है कि क्वाड प्रिसिजन फ़्लोटिंग पॉइंट (दो डबल मानों का उपयोग करके 128 बिट फ़्लोटिंग पॉइंट) या एफएफटी में 128 बिट फ़िक्स्ड पॉइंट किसी भी उत्पाद के लिए पर्याप्त होगा जो कि सभी पर गणना करने के लिए पर्याप्त छोटा हो।

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