আমি স্কনহেজ – স্ট্র্যাসেন পূর্ণসংখ্যার গুণিত অ্যালগরিদম বাস্তবায়নের চেষ্টা করছি, তবে পুনরাবৃত্তির পদক্ষেপে একটি হোঁচট খেয়েছি hit
আমি একটি মান আছে সঙ্গে বিট এবং আমি গনা করতে চান । আমি মূলত চিন্তা ধারণা একটি বাছাই ছিল ট যেমন যে 4 ^ ট \ geq 2n , বিভক্ত এক্স মধ্যে 2 ^ ট টুকরা সঙ্গে প্রতিটি 2 ^ {K-1} বিট, এসএসএ এর সংবর্তন আবেদন মডিউল কাজ করার সময় 2 ^ {2 ^ ট} +1 , প্রতি মান হিসাবে 2 ^ কে বিট সহ একটি রিং , তারপরে টুকরোগুলি একসাথে রেখে দিন put তবে কনভ্যুশনের আউটপুটটিতে 2n বিট (যেমন > 2 ^ কে) এর চেয়ে কিছুটা বেশিপ্রতি আউটপুট মান বিট, যা রিংয়ের সক্ষমতা থেকে বেশি, প্রতিটি আউটপুট মান বিভিন্ন পণ্যের যোগফল হওয়ার কারণে) তাই এটি কার্যকর হয় না। আমাকে প্যাডিংয়ের 2 অতিরিক্ত ফ্যাক্টর যুক্ত করতে হয়েছিল।
প্যাডিংয়ের 2 এর অতিরিক্ত ফ্যাক্টরটি জটিলতা নষ্ট করে দেয়। এটি আমার পুনরাবৃত্তির পদক্ষেপটি ব্যয়বহুল করে তোলে। এর পরিবর্তে একজন আলগোরিদিম, আমি শেষ পর্যন্ত একটি অ্যালগরিদম সহ
আমি উইকিপিডিয়া থেকে লিঙ্কযুক্ত কয়েকটি রেফারেন্স পড়েছি, তবে এই সমস্যাটি কীভাবে সমাধান করা হয় তার বিশদগুলি নিয়ে তারা সকলে চকচকে মনে হয়। উদাহরণস্বরূপ, আমি অতিরিক্ত প্যাডিং ওভারহেড এড়াতে পারতাম মডুলো কাজ করে এমন একটি যা 2 এর শক্তি নয় ... তবে তখন জিনিসগুলি কেবল তখনই ভেঙে যায়, যখন আমার কেবল অ-শক্তি- -2 ফ্যাক্টর অবশিষ্ট রয়েছে এবং টুকরো সংখ্যা দ্বিগুণ না করে কুলি-টুকি প্রয়োগ করতে পারবেন না। এছাড়াও, গুণক বিপরীতমুখী মডুলো 2 ^ পি + 1 নাও থাকতে পারে । সুতরাং এখনও 2 টির জন্য বাধ্যতামূলক কারণগুলি চালু করা হচ্ছে।
অ্যাসিপটোটিক জটিলতাটি না ঘটিয়ে পুনরাবৃত্তির পদক্ষেপের সময় আমি কীভাবে রিংটি ব্যবহার করব?
অথবা, সিউডো কোড ফর্মে:
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);
...