Loading [MathJax]/jax/output/HTML-CSS/jax.js

المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:دوره ی تابستان:دوره ی ۹:الگوریتم ها:سوال ۱

بهبود ضرب

الگوریتم زیر برای ضرب دو عدد n1 بیتی به کار می‌رود. ورودی این الگوریتم دو عدد n1 بیتی B به شکل ¯bnb2b1 و Q به شکل ¯qnq2q1 است. بدیهی است که bn و qn صفر هستند. الگوریتم در طول اجرا از شمارنده‌ی C و متغیر تک‌بیتی q0 وعدد n بیتی A به شکل ¯ana2a1 بهره می‌گیرد. خروجی الگوریتم، عدد 2n بیتی ¯ana2a1qnq2q1 است. مراحل اجرای الگوریتم به شرح زیر می‌باشد:

  • A و q0 را برابر صفر و C را برابر n قرار بده.
  • با توجه به جدول زیر، مقدار (¯q1q0) را محاسبه کن، حاصل را در B ضرب کن، اگر حاصل منفی شد، به تعداد کافی 2n به حاصل‌ضرب بیفزا تا حاصل مثبت شود. حال حاصل را با A جمع کن و n بیت سمت راست (n بیت کم‌ارزش) حاصل جمع را در A ذخیره کن.

  • عدد ¯an1a2a1qnq1q0 را یک بیت به سمت راست انتقال بده و سپس an1 را برابر an قرار بده. پس از این عمل، مقدار قبلی q0 جایگاهی نخواهد داشت.
  • از C یک واحد کم کن و اگر صفر شد، به اجرای الگوریتم خاتمه بده وگرنه، اجرا را از بند شماره‌ی ۲ ادامه بده.

برای مثال جدول ۲ روند اجرای الگوریتم برای ضرب دو عدد ۰۱۰ و ۰۱۱ نشان می‌دهد.

الف) درستی اجرای الگوریتم را ثابت کنید.

ب) برای افزایش سرعت، متغیر تک‌بیتی q1 را در نظر گرفته و الگوریتم را مطابق زی تغییر می‌دهیم.

  1. A، q0 و q1 را برابر صفر و C را برابر n‌قرار بده.
  2. با توجه به جدول، مقدار g(¯q1q0q1) را محاسبه کن. اگر حاصل منفی شد، به تعداد کافی 2n به حاصل ضرب بیفزا تا حاصل مثبت شود. حال حاصل را با A جمع کن و n بیت سمت راست (n بیت کم‌ارزش) حاصل جمع را در A ذخیره کن.
  3. عدد ¯an1a1a1qnq1q0q1 را ۲ بیت به سمت راست انتقال بده و سپس an1‌را برابر an‌قرار بده. پس از این عمل، مقدار قبلی q1‌جایگاهی نخواهد داشت.
  4. از C یک واحد کم کن واگر صفر شد، به اجرای الگوریتم خاتمه بده وگرنه، اجرا را از بند شماره‌ی ۲ ادامه بده.

جدول مربوط به مقادیر g(x) را تنظیم کنید و درستی الگوریتم به دست آمده را نشان دهید.


ابزار صفحه