আপাতদৃষ্টিতে এই ও-(এন এলজি এন) গুণনের অ্যালগরিদমের ভুল কোথায়?


15

তিনটি সমান দূরত্বে থাকা সম্পর্কে সন্ধানের জন্য একটি সাম্প্রতিক ধাঁধা ব্লগ পোস্ট আমাকে একটি শীর্ষ উত্তর সহ একটি স্ট্যাকওভারফ্লো প্রশ্নের দিকে নিয়ে যায় যা ও (এন এলজি এন) সময়ে এটি করার দাবি করে। মজাদার অংশটি হ'ল সমাধানটিতে একটি বহুবর্ষের স্কোয়ারিং জড়িত থাকে, একটি কাগজকে উল্লেখ করা হয় যা ও (এন এলজি এন) সময়ে এটি কীভাবে করা যায় তা বর্ণনা করে

এখন, বহুগুণগুলি বহুগুণ করা কার্যত গুণমান সংখ্যার সমান। একমাত্র আসল পার্থক্য হ'ল বহন করার অভাব। তবে ... ক্যারিগুলি ও (এন এলজি এন) সময়েও করা যেতে পারে। উদাহরণ স্বরূপ:

    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) এ সংখ্যার গুণন করা কম্পিউটার বিজ্ঞানের একটি বিশাল উন্মুক্ত সমস্যা এবং আমি সত্যিই সন্দেহ করি যে উত্তরটি এই সহজ হতে পারে।

  • বহন কি ভুল, না ও (এন এলজি এন)? আমি কাজ করেছি যে lg n + 1 বিট প্রতি মূল্য বিটগুলি বহন করার ট্র্যাক করার জন্য যথেষ্ট, এবং অ্যালগরিদম এত সহজ যে আমি যদি ভুল হত তবে আমি অবাক হয়ে যাব। দ্রষ্টব্য, যদিও পৃথক বর্ধিতকরণের ক্ষেত্রে ও (এলজি এন) সময় লাগতে পারে, এক্স ইনক্রিমেন্টের সামগ্রিক ব্যয় হ'ল ও (এক্স)।
  • কাগজ থেকে বহুগুণীয় গুণটির অ্যালগরিদমটি কি ভুল, বা এমন শর্ত রয়েছে যা আমি লঙ্ঘন করছি? কাগজটিতে একটি সংখ্যা তাত্ত্বিক রূপান্তর পরিবর্তে একটি দ্রুত ফুরিয়ার ট্রান্সফর্ম ব্যবহার করে, এটি একটি সমস্যা হতে পারে।
  • 40 বছর ধরে প্রচুর স্মার্ট লোক কী Schönhage – Strassen অ্যালগরিদমের স্পষ্ট রূপটি মিস করেছে ? এটি সম্ভবত খুব কম সম্ভবত বলে মনে হচ্ছে।

আমি এটিকে বাস্তবায়নের জন্য কোডটি লিখেছি, দক্ষ বহুপদী গুন বাদে (সংখ্যাটি তাত্ত্বিক রূপান্তরটি এখনও যথেষ্ট বুঝতে পারছি না)। র‌্যান্ডম টেস্টিংটি অ্যালগরিদম সঠিক হওয়ার বিষয়টি নিশ্চিত করার জন্য উপস্থিত হয়, তাই সমস্যাটি জটিলতার বিশ্লেষণের সময় সম্ভবত সমস্যা।


বর্গ অন্তর্ভুক্ত করা উচিত নয় x^10 + 2x^8? x ^ 10 শুধুমাত্র একবার (x ^ 5 * x ^ 5), এবং x ^ 8 টি দ্বিগুণ (x ^ 6 * x ^ 2 + x ^ 2 * x ^ 6)
শোয়ার্ড

আমি উদাহরণ দিয়ে হাতে করেছিলাম। আমি একটি পাটিগণিত ভুল করেছি। দুঃখিত। আমি আসলে অ্যালগরিদম বাস্তবায়ন করেছি এবং এটি পরীক্ষা করেছি এবং সঠিক ফলাফল পেয়েছি, যদিও।
ক্রেগ গিডনি

উত্তর:


13

আপনার অ্যালগরিদম স্কানহেজ – স্ট্র্যাসেনের সাথে খুব মিল। এফএফটি ধাপে, প্রচুর সংখ্যক জড়িত রয়েছে - যেমন আপনি উল্লেখ করেছেন, তাদের আকার পর্যন্ত হতে পারে । তাদের গাণিতিকগুলি বিনামূল্যে আসে না। আপনার নির্মাণটি পুনরাবৃত্তভাবে প্রয়োগ করতে হবে এবং আপনি কিছু হারাবেন।হে(লগএন)


1

এখানে "ভুল "টি হ'ল ফুরিয়ার ট্রান্সফর্মটি ও (এন লগ এন) সংখ্যার রূপান্তর করতে সংখ্যার যোগ বা গুণনের পদক্ষেপে গণনা করা যেতে পারে, তবে যেহেতু এন সত্যই বড় হয়, রূপগুলি রূপান্তরিত হয় সেই সংখ্যাগুলি আরও বড় হয়, যা যুক্ত করে অন্য ফ্যাক্টর লগ লগ এন।

অনুশীলনে, আমি ভাবব যে কোয়াড স্পষ্টতা ভাসমান পয়েন্ট (দুটি ডাবল ভ্যালু ব্যবহার করে 128 বিট ফ্লোটিং পয়েন্ট) বা এফএফটিতে 128 বিট ফিক্সড পয়েন্ট যে কোনও পণ্যের পক্ষে যথেষ্ট পরিমাণে গণনা করা যথেষ্ট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.