الگوریتم تقسیم
خارجقسمت q و باقیماندهی r را طوری پیدا میکند که a = q·b + r و 0 ≤ r < b؛ با کم کردن یا اضافه کردن پیاپی b.
قضیهی تقسیم: برای هر عدد صحیح a و هر b > 0، دقیقاً یک جفت q و r هست که
- زمان:
O(|a| / b) - حافظه:
O(1) - گریمالدی، فصل ۴
- جانسونباو، فصل ۵
۱۷۰ تقسیم بر ۱۱: ۱۷۰ = ۱۵·۱۱ + ۵.
def divide(a, b):# a = q·b + r with 0 ≤ r < b, by repeated subtraction (b > 0).q = 0r = arows = [(q, r)]while r >= b:r = r - bq = q + 1rows.append((q, r))while r < 0:r = r + bq = q - 1rows.append((q, r))return q, r
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
Call stack
- divide()خط 1
توضیح
ایده
قضیهی تقسیم: برای هر عدد صحیح a و هر b > 0، دقیقاً یک جفت q و r هست که
a = q·b + r و 0 ≤ r < b
سادهترین راه پیدا کردنشان: از q = 0 و r = a شروع کن. تا وقتی r ≥ b است یک b از آن کم کن و q را یکی زیاد کن؛ اگر a منفی بود، تا وقتی r < 0 است یک b اضافه کن و q را یکی کم کن.
نکته دربارهی عددهای منفی
در ریاضیات باقیمانده همیشه نامنفی است، پس −17 mod 5 = 3. بعضی زبانهای برنامهنویسی (مثل C) −2 میدهند؛ پایتون مثل ریاضیات 3 میدهد.
هزینه
این روش |a| / b گام دارد؛ ماشینها تقسیم را مستقیم و خیلی سریعتر انجام میدهند. ولی هدف اینجا دیدن معنای q و r است.