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