স্ক্যানহেজ – স্ট্র্যাসেন অ্যালগরিদমে কীভাবে অভ্যন্তরের আংটিটি বেছে নেওয়া হয়?


9

আমি স্কনহেজ – স্ট্র্যাসেন পূর্ণসংখ্যার গুণিত অ্যালগরিদম বাস্তবায়নের চেষ্টা করছি, তবে পুনরাবৃত্তির পদক্ষেপে একটি হোঁচট খেয়েছি hit

আমি একটি মান আছে সঙ্গে বিট এবং আমি গনা করতে চান । আমি মূলত চিন্তা ধারণা একটি বাছাই ছিল যেমন যে 4 ^ ট \ geq 2n , বিভক্ত এক্স মধ্যে 2 ^ ট টুকরা সঙ্গে প্রতিটি 2 ^ {K-1} বিট, এসএসএ এর সংবর্তন আবেদন মডিউল কাজ করার সময় 2 ^ {2 ^ ট} +1 , প্রতি মান হিসাবে 2 ^ কে বিট সহ একটি রিং , তারপরে টুকরোগুলি একসাথে রেখে দিন put তবে কনভ্যুশনের আউটপুটটিতে 2n বিট (যেমন > 2 ^ কে) এর চেয়ে কিছুটা বেশিxnx2(mod2n+1)k4k2nx2k2k122k+12k2n>2kপ্রতি আউটপুট মান বিট, যা রিংয়ের সক্ষমতা থেকে বেশি, প্রতিটি আউটপুট মান বিভিন্ন পণ্যের যোগফল হওয়ার কারণে) তাই এটি কার্যকর হয় না। আমাকে প্যাডিংয়ের 2 অতিরিক্ত ফ্যাক্টর যুক্ত করতে হয়েছিল।

প্যাডিংয়ের 2 এর অতিরিক্ত ফ্যাক্টরটি জটিলতা নষ্ট করে দেয়। এটি আমার পুনরাবৃত্তির পদক্ষেপটি ব্যয়বহুল করে তোলে। এর পরিবর্তে একজন F(n)=nlgn+nF(2n)=Θ(nlgnlglgn) আলগোরিদিম, আমি শেষ পর্যন্ত একটি F(n)=nlgn+nF(4n)=Θ(nlg2n) অ্যালগরিদম সহ

আমি উইকিপিডিয়া থেকে লিঙ্কযুক্ত কয়েকটি রেফারেন্স পড়েছি, তবে এই সমস্যাটি কীভাবে সমাধান করা হয় তার বিশদগুলি নিয়ে তারা সকলে চকচকে মনে হয়। উদাহরণস্বরূপ, আমি অতিরিক্ত প্যাডিং ওভারহেড এড়াতে পারতাম মডুলো 2p2k+1 কাজ করে এমন একটি p যা 2 এর শক্তি নয় ... তবে তখন জিনিসগুলি কেবল তখনই ভেঙে যায়, যখন আমার কেবল অ-শক্তি- -2 ফ্যাক্টর অবশিষ্ট রয়েছে এবং টুকরো সংখ্যা দ্বিগুণ না করে কুলি-টুকি প্রয়োগ করতে পারবেন না। এছাড়াও, p গুণক বিপরীতমুখী মডুলো 2 ^ পি + 1 নাও থাকতে পারে 2p+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);
  ...

দয়া করে একাধিক সাইটে একই প্রশ্ন পোস্ট করবেন না । প্রত্যেকের সম্প্রদায়ের কারও সময় নষ্ট না করে উত্তর দেওয়ার জন্য একটি সৎ শট দেওয়া উচিত। আমি আপনাকে দুটি অনুলিপি মুছে ফেলার পরামর্শ দিচ্ছি।
DW

@DW সম্পন্ন সিএস এক সপ্তাহের জন্য কোনও উত্তর না দেওয়ার পরে আমি ক্রস পোস্ট করেছি, এটি সাইটের পক্ষে খুব কঠিন ছিল। স্পষ্টত কোনও উত্তর ফিরে দিতে যাচ্ছিল।
ক্রেগ গিডনি

আমি বুঝেছি. যদি ভবিষ্যতে এটি প্রকাশিত হয়, আপনি সর্বদা আপনার পোস্টকে মডারেটরের মনোযোগের জন্য পতাকাঙ্কিত করতে এবং এটি স্থানান্তরিত করার জন্য জিজ্ঞাসা করতে পারেন এবং আমরা এটি আপনার জন্য সিএসথিরিতে স্থানান্তর করতে পারি। বুঝবার জন্য আপনাকে ধন্যবাদ!
DW

3
অ্যালগরিদমের একটি সংস্করণ রয়েছে যা ফর্মের মডুলো সংখ্যার সাথে কাজ করে : এ। Schönhage। জটিল সহগের সাথে বহুভুজগুলির সংখ্যাগত গুণন এবং বিভাগের জন্য অ্যাসেম্পোটোটিক্যালি দ্রুত অ্যালগরিদম। EUROCAM '82 তে: ইউরোপীয় কম্পিউটার বীজগণিত সম্মেলন, বক্তৃতা। নোট কমপ সী। 144, 3-15। iai.uni-bonn.de/~schoe/publi39.dvi2ν2n
মার্কাস ব্লজার

আইআইআরসি এখন মুছে ফেলা সিএস প্রশ্নে আপনার একটি আংশিক স্ব-উত্তর ছিল। এটা হারাতে লজ্জা লাগে। আপনি কি এটি এখানে অন্তর্ভুক্ত করতে পারেন (প্রশ্নে, যাতে প্রশ্নটি ইতিমধ্যে উত্তর হিসাবে চিহ্নিত করা হয়নি)?
পিটার টেলর

উত্তর:


4

এই উত্তরটি "জটিল সংখ্যার সাথে বহুবর্ষগুলির সংখ্যাবৃত্তীয় বিভাজন এবং বিভাগের জন্য অ্যাসিম্পটোটিক্যালি ফাস্ট অ্যালগরিদম" পত্রিকা থেকে নেওয়া হয়েছে যা মার্কাস মন্তব্যে লিঙ্ক করেছেন।


আপনি একটি বিট নম্বর বর্গ করতে চান , মডুলো । আপনি যা করেন তা এখানে:n2n+1

  • এই এবং যে সন্তুষ্ট এবং ।psn=(p1)2ssp2s

  • বিটগুলিকে বিভক্ত করতে টুকরো সংখ্যা এবং টুকরা আকারের জন্য সংশ্লিষ্ট পরামিতিগুলি চয়ন করুন:2mn

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

    নোট করুন যে এবং সন্তুষ্ট করে । আরও মনে রাখবেন যে সন্তুষ্ট, তাই ইনপুট বহন করার জন্য রুমের সাথে ফিট করে।s2p2s2p22s22m2s2p22n+m+1

  • যথারীতি টুকরোগুলিতে এফএফটি-ভিত্তিক নেগ্রাসিক্লিক কনভলিউশনটি সম্পাদন করুন এবং বাকিগুলি যথারীতি।

সুতরাং এটি বহুল আলোচিত ধারণা: একটি লোগারিথমিক প্যাডিং ফ্যাক্টর । জটিলতার বিশ্লেষণের জন্য এখন। FFT নিতে হবে কাজ করতে, এবং আমরা আছি recursing আকারের টুকরা , তাই এখন আমরা পুনরাবৃত্তি সম্পর্ক wrt অত্যন্ত রুক্ষ গণিত করতে পারি না :pnm2m(p21)2s2s

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

যা সঠিক সম্পর্কে মনে হয়, যদিও আমি এই পদক্ষেপগুলিতে বেশ প্রতারিত হয়েছি।

'কৌতুক' সত্য যে আমরা দিয়ে শেষ হবে বলে মনে হয় পরিবর্তে বেস খরচ হবে। মত আমি প্রশ্ন সম্পর্কে অভিযোগ করা হয়, কিন্তু এখন halving, দুই multiplications রিকার্সিভ প্রতি স্তরের দুই এখনও ডাবল লভ্যাংশ পরিশোধ করা হয়, তাই এটি সব কাজ। তারপরে, শেষে, আমরা অতিরিক্ত ফ্যাক্টরটি বাতিল করি (যা আসলে এর একটি উপাদান ) প্রাথমিকভাবে তুলনায় লোগারিথমিকভাবে বৃহত আপেক্ষিক তৈরি করার জন্য ধন্যবাদ ।s2ssslognps

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