بهبود ضرب
الگوریتم زیر برای ضرب دو عدد n−1 بیتی به کار میرود. ورودی این الگوریتم دو عدد n−1 بیتی B به شکل ¯bn…b2b1 و Q به شکل ¯qn…q2q1 است. بدیهی است که bn و qn صفر هستند. الگوریتم در طول اجرا از شمارندهی C و متغیر تکبیتی q0 وعدد n بیتی A به شکل ¯an…a2a1 بهره میگیرد. خروجی الگوریتم، عدد 2n بیتی ¯an…a2a1qn…q2q1 است. مراحل اجرای الگوریتم به شرح زیر میباشد:
A و q0 را برابر صفر و C را برابر n قرار بده.
با توجه به جدول زیر، مقدار (¯q1q0) را محاسبه کن، حاصل را در B ضرب کن، اگر حاصل منفی شد، به تعداد کافی 2n به حاصلضرب بیفزا تا حاصل مثبت شود. حال حاصل را با A جمع کن و n بیت سمت راست (n بیت کمارزش) حاصل جمع را در A ذخیره کن.
عدد ¯an−1…a2a1qn…q1q0 را یک بیت به سمت راست انتقال بده و سپس an−1 را برابر an قرار بده. پس از این عمل، مقدار قبلی q0 جایگاهی نخواهد داشت.
از C یک واحد کم کن و اگر صفر شد، به اجرای الگوریتم خاتمه بده وگرنه، اجرا را از بند شمارهی ۲ ادامه بده.
برای مثال جدول ۲ روند اجرای الگوریتم برای ضرب دو عدد ۰۱۰ و ۰۱۱ نشان میدهد.
الف) درستی اجرای الگوریتم را ثابت کنید.
ب) برای افزایش سرعت، متغیر تکبیتی q−1 را در نظر گرفته و الگوریتم را مطابق زی تغییر میدهیم.
A، q0 و q−1 را برابر صفر و C را برابر nقرار بده.
با توجه به جدول، مقدار g(¯q1q0q−1) را محاسبه کن. اگر حاصل منفی شد، به تعداد کافی 2n به حاصل ضرب بیفزا تا حاصل مثبت شود. حال حاصل را با A جمع کن و n بیت سمت راست (n بیت کمارزش) حاصل جمع را در A ذخیره کن.
عدد ¯an−1…a1a1qn…q1q0q−1 را ۲ بیت به سمت راست انتقال بده و سپس an−1را برابر anقرار بده. پس از این عمل، مقدار قبلی q−1جایگاهی نخواهد داشت.
از C یک واحد کم کن واگر صفر شد، به اجرای الگوریتم خاتمه بده وگرنه، اجرا را از بند شمارهی ۲ ادامه بده.
جدول مربوط به مقادیر g(x) را تنظیم کنید و درستی الگوریتم به دست آمده را نشان دهید.