توانرسانی دودویی
توانرسانی دودویی الگوریتمی سریع برای محاسبهٔ توانهای بزرگ اعداد است.
الگوریتم عادی توانرسانی برای محاسب
الگوریتم اصلی
این الگوریتم بر پایهٔ این دو تساوی ساده بنا شده است:
اگر
اگر
بنابراین میتوان با ارائهٔ تابع
کد الگوریتم
کد این الگوریتم به زبان برنامهنویسی پایتون به این صورت است:
def power(a,b):
if b == 0:
return 1
c = power(a,b//2)
c *= c
if b % 2 == 1:
c *= a
return c
کد الگوریتم به زبان ++C برای اعداد طبیعی اینگونه است. باید توجه داشت با توجه به محدودیت ظرفیت int
و long long
در++C و بزرگ بودن احتمالی خروجی تابع بهتر است یک پارامتر ورودی دیگری به عنوان mod
به تابع داده شود تا باقی ماندهٔ
int power(int a, int b, int mod)
{
if (b == 0)
return 1;
long long c = power(a, b/2, mod);
c = (c * c) % mod;
if (b % 2 == 1)
c = (c * a) % mod;
return c;
}
باید دقت شود که متغیر داخلی c
را باید حتماً از نوع long long
تعریف کرد حتی اگر تمامی ورودیها و خروجیها int
باشند؛ زیرا ضرب دو یا چند متغیر int
ممکن است از محدودهٔ int
بیرون بزند و جواب غیرقابل قبولی تولید شود.
تحلیل زمانی الگوریتم
در هر فراخوانی تابع یک بار تابع بازگشتی صدا زده میشود و نیز تعدادی عملیات ضرب و شرط که همگی از
با توجه به اینکه در هر مرحله قراخوانی تابع بازگشتی مقدار عدد
کاربردها
این الگوریتم از الگوریتمهای بسیار پرکاربرد در حوزه نظریه اعداد است؛ برای مثال برای یافتن وارون ضربی در پیادهسازی تابع ترکیب برای مقادیر ورودی بزرگ کاربرد دارد. برای مثال فرض کنید میخواهیم