الگوریتم ضرب

الگوریتم ضرب مجموعه‌ای از دستورالعمل‌های محاسباتی خوش‌تعریف است، که به وسیلهٔ آن می‌توان حاصل ضرب دو عدد را بدست آورد. الگوریتم‌های مختلفی برای ضرب دو عدد ارائه داده شده‌اند که با توجه به طول اعداد و مکان استفاده از آن‌ها از الگوریتم‌های مختلف استفاده می‌کنیم.

شیوهٔ ضرب در مصر باستان

نام دیگر این روش شیوهٔ ضرب روستاییان است. در مصر باستان مردم شیوهٔ جالبی برای ضرب اعداد استفاده می‌کردند، که بر مبنای مضرب دو اعداد کار می‌کرد. در این روش جدولی از اعداد تشکیل می‌دهیم و در سطر اول آن عدد یک و عدد ضرب‌کننده را می‌نویسیم. در هر سطر بعدی عدد سطر بالا را در دو ضرب می‌کنیم و این کار را آنقدر ادامه می‌دهیم تا اولین عدد سطر از ضرب‌شونده (مضروب) بیشتر شود. حال در ستون اول اعدادی که ضرب‌شونده را با عملگر جمع می‌سازند می‌یابیم. با جمع مقادیر پیدا شده حاصل ضرب اعداد را بدست می‌آوریم.
برای مثال اگر بخواهیم حاصل ضرب ۳۱ در ۴۲ را بدست آوریم جدولی به صورت زیر تشکیل می‌دهیم.
 ۳۱ ۱
 ۶۲ ۲
 ۱۲۴ ۴
 ۲۴۸ ۸
 ۴۹۶ ۱۶
 ۹۹۲ ۳۲
 ۱۹۸۴ ۶۴ <-- بزرگتر از ۴۲ است پس متوقف می‌شویم
در ستون چپ جمع اعداد ۲ و ۸ و ۳۲ عدد ۴۲ را می‌سازند پس با جمع اعداد روبرویشان یعنی ۶۲ و ۲۴۸ و ۹۹۲ حاصل ضرب بدست می‌آید.
۱۳۰۲ = ۶۲ + ۲۴۸ + ۹۹۲ = ۳۱×۴۲

شیوهٔ ضرب در چین باستان

چینیان باستان برای ضرب دو عدد از شیوه‌ای تصویری استفاده می‌کردند. برای مثال اگر بخواهیم دو عدد ۱۶ و ۲۴ را در هم ضرب کنیم خط‌هایی عمودی برای ۱۶ در نظر می‌گیریم به صورتی که خط‌های سمت چپ نشان دهندهٔ دهگان و خط‌های سمت راست نشان دهندهٔ یکان باشد. به همین طریق خط‌هایی افقی در نظر می‌گیریم به طوری که خط‌های بالا دهگان و خط‌های پایین نشان‌دهندهٔ یکان عدد ۲۴ باشد.
حال تعداد برخورد خط‌ها با یک‌دیگر را بررسی می‌کنیم. اگر هر ردیف از راست به چپ نشان‌دهندهٔ یک ارزش مکانی باشد، می‌توانیم حاصل ضرب را پیدا کنیم. برای این مثال ۲۴ برخورد در ردیف ارزش مکانی یکان اتفاق افتاده است. یعنی ارزش یکان ۴ است و به ارزش دهگان ۲ واحد اضافه می‌کنیم. تعداد برخوردها در ردیف ارزش دهگان ۱۶ است و ۲ واحد هم از یکان اضافه شده پس به ارزش دهگان ۸ است و یک واحد به صدگان اضافه می‌کند. به همین طریق ارزش صدگان ۳ است. پس حاصل ضرب اعداد مثال‌زده‌شده ۳۸۴ است.

مثال

برای ضرب دو عدد ۲۳۹۵۸۲۳۳ و ۵۸۳۰ در هم اعداد را به صورت زیر نوشته و حاصل ضرب را بدست می‌آوریم.
 ۲۳۹۵۸۲۳۳
 ۵۸۳۰ ×
 ———————————————
 ۰۰۰۰۰۰۰۰ (= ۲۳٬۹۵۸٬۲۳۳ × ۰)
 ۷۱۸۷۴۶۹۹ (= ۲۳٬۹۵۸٬۲۳۳ × ۳۰)
 ۱۹۱۶۶۵۸۶۴ (= ۲۳٬۹۵۸٬۲۳۳ × ۸۰۰)
 ۱۱۹۷۹۱۱۶۵ (= ۲۳٬۹۵۸٬۲۳۳ × ۵٬۰۰۰)
 ———————————————
 ۱۳۹۶۷۶۴۹۸۳۹۰ (= ۱۳۹٬۶۷۶٬۴۹۸٬۳۹۰)

محاسبهٔ پیچیدگی الگوریتم طولانی ضرب

اگر دو عددی که در هم ضرب می‌کنیم به طول n بود در هر مرحله n ضرب انجام می‌دهیم و تعداد مراحل n است، پس پیچیدگی این الگوریتم است.

ضرب با استفاده از جدول مشبکی

شیوه‌ای برای ضرب کردن است که از یک جدول مشبکی استفاده می‌کند. این شیوه در زمان قرون وسطی به‌وجود آمده و در سرزمین‌های مختلفی از آن استفاده می‌شد. امروزه نیز این روش در برنامهٔ درسی بعضی کشورها تدریس می‌شود.

در ابن روش یک جدول مشبکی کشیده می‌شود و رقم‌های دو عددی که می‌خواهیم آن‌ها را در هم ضرب کنیم در بالا و سمت راست جدول کشیده می‌شود. جدول مشبکی ضرب دو عدد ۵۸ و ۲۱۳ به صورت زیر (تصویر مرحلهٔ اول) است. ما باید هر خانهٔ آن را به صورتی پر کنیم که با ضرب عدد بالای ستون و سمت راست سطر یکان عدد حاصل در پایین و دهگان آن در بالای خط موجود در خانه نوشته شود.
پس از پر کردن تمامی خانه‌های جدول، جدول به تصویر مرحلهٔ دوم تبدیل می‌شود؛ که بعد از این مرحله باید از پایین راست جدول به سمت بالا حرکت کنیم و سپس به سمت چپ برویم و در هر مرحله جمع خانه‌های مثلثی همسایه (خانه‌های همسایه مثلث‌هایی هستند ساق‌هایشان مشترک است) را حساب کنیم. اگر این جمع بیشتر از نه شد یکان آن را نوشته و عدد دهگان را با عدد مرحلهٔ بعد جمع می‌کنیم.
در آخر تصویر جدول به شکل جدول آمده در مرحلهٔ سوم است.
همان‌طور که مشاهده می‌کنید جواب بدست آمده ۱۲۳۵۴ است.

الگوریتم کاراتسوبا

الگوریتم کاراتسوبا یک الگوریتم سریع برای ضرب است که از الگوریتم تقسیم و حل برای ضرب دو عدد استفاده می‌کند. اگر x و y بیانگر دو عدد در مبنای b به طول n باشند، ما هر کدام از این اعداد را به دو قسمت پرارزش(H) و کم ارزش (L) تقسیم می‌کنیم. به این ترتیب حاصل ضرب به صورت زیر می‌شود.
X = XH b + XL
Y= YH b + YL
(XY = (XH b + XL) (YH b + YL
XY = xHyHbⁿ + (xHyL + xLyH)b + xLyL
به این ترتیب مسئله به چهار زیرمسئله تقسیم می‌شود؛ و این تقسیم ادامه پیدا می‌کند تا به زیرمسئله‌های ساده‌برسد. حاصل ضرب به صورت بازگشتی به دست می‌آید.
با یک راه حل ساده می‌توان تعداد ضرب‌های انجام شده (زیرمسئله‌ها) را از ۴ به ۳ رساند.
با داشتن a و b می‌توان تنها با استفاده از ۳ جمله این ضرب را انجام داد.

مثالی برای الگوریتم کاراتسوبا

فرض کنید می‌خواهیم عدد ۱۲۳۴ را در ۴۳۲۱ ضرب کنیم. برای اینکار به صورت زیر عمل می‌کنیم.
ابتدا a و b و e را بدست می‌آوریم.
حال بدست آوردن هر کدام از این ضرب‌ها خود یک زیر مسئله است. برای بدست آوردن حاصل ضرب ۱۲ و ۴۳ داریم
به همین روش برای مسئلهٔ اصلی ۷۱۴ = d و e با توجه به مقدار بدست آمده برای a و d، برابر ۱۷۱۴ است.
پس نتیجه می‌شود که

تحلیل زمان اجرای الگوریتم

این الگوریتم هر مسئله را به ۳ زیر مسئله به طول نصف مسئله-- قبلی تقسیم می‌کند پس زمان اجراء آن به صورت زیر است.
با توجه به قضیه اصلی در الگوریتم‌ها می‌توانیم زمان اجرای این الگوریتم را بدست آوریم.
پس به اندازهٔ  طول می‌کشد تا بتوانیم حاصل این ضرب را بدست آوریم.

الگوریتم توم ـ کوک

الگوریتم توم ـ کوک که گاهی با نام توم ـ ۳ شناخته می‌شود، ابتدا توسط اندری توم ارائه شد و سپس استفان کوک آن را به صورت شفاف‌تر در پایان‌نامه دکتری خود بیان کرد.الگوریتم توم ـ کوک انواع مختلفی دارد که الگوریتم توم ـ ۳ یکی از آن‌هاست. این الگوریتم تعمیم داده شدهٔ الگوریتم کاراتسوبا است. به‌طور دقیق‌تر الگوریتم کاراتسوبا حالت خاصی از الگوریتم توم ـ کوک است. پیچیدگی یک الگوریتم توم ـ k به صورت  است.