الگوریتم تعمیمیافته اقلیدس
در علم حساب و برنامه نویسی کامپیوتر الگوریتم تعمیم یافته اقلیدس تعمیمی بر الگوریتم اقلیدس است که در کنار محاسبه بزرگترین مقسوم علیه مشترک دو عدد صحیح a,b ضرایب قضیه بزو را هم محاسبه میکند(x,y اعداد صحیح اند):
الگوریتم تعمیم یافته اقلیدس به الگوریتمی بسیار مشابه به الگوریتمی برای محاسبه بزرگترین مقسوم علیه مشترک چندجمله ای و ضرایب قضیه بزو از دو چندجملهای با یک متغیر، ارجاع دارد. الگوریتم تعمیم یافته اقلیدس زمانی که a و b نسبت به هم اولند مفید تر است. چون x برابر وارون ضربی پیمانهای a به پیمانه b و y برابر وارون ضربی پیمانهای b به پیمانه a است. در الگوریتم اقلیدس برای چندجملهای میتوان وارون ضربی را در بسطهای میدان جبری محاسبه کرد. که از آن نتیجه میشود هردو نوع الگوریتم اقلیدسی تعمیم یافته (معمولی و چندجملهای) کاربردی گسترده در رمزنگاری دارند. به خصوص در محاسبه وارون ضربی پیمانهای در روش RSA یک گام ضروریست.
توضیح الگوریتم
در الگوریتم اقلیدسی معمولی فقط باقیماندهها نگاه داشته میشوند و خارج قسمت استفاده نمیشود. اما در الگوریتم تعمیم یافته خارج قسمتهای متوالی استفاده میشوند. بهطور دقیقتر در الگوریتم تعمیم یافته که a، b را به عنوان ورودی میگیرد، دنبالهٔ
مهمترین ویژگی تقسیم اقلیدسی نامساوی سمت راست است که
در این الگوریتم هم وقتی
- بزرگترین مقسوم علیه برای دو ورودیواست.
- ضرایب بزو هم که برابر ودر رابطهٔ زیر صدق میکنند:
- خارج قسمت تقسیم a و b بر بزرگترین مقسوم علیه مشترکشان به این صورت است:
که این یعنی جفت ضرایب بزو که از این الگوریتم به دست میآیند یکی از کمترین جفت ضرایب بزو هستند.
مثال
جدول زیر رویه الگوریتم تعمیم یافته اقلیدسی را برای46 و240 را نشان میدهد. بزرگترین مقسوم علیه مشترک برابر ۲ است. محاسبه در ستون ۶ متوقف میشود، چون باقیمانده صفر میشود. ضرایب بزو هم در دو ستون آخر از سطر آخرند. تحقیق رابطه -9*240+47*46=2 راحت است. و سرانجام -120 و 23 بدون توجه به علامت برابر تقسیم ۲۴۰ و ۴۶ بر بزرگترین مقسوم علیه مشترک یعنی ۲ هستند
index i | quotient qi-1 | Remainder ri | si | ti |
---|---|---|---|---|
0 | 240 | 1 | 0 | |
1 | 46 | 0 | 1 | |
2 | 240 ÷ 46 = 5 | 240 − 5 × 46 = 10 | 1 − 5 × 0 = 1 | 0 - 5 × 1 = -5 |
3 | 46 ÷ 10 = 4 | 46 − 4 × 10 = 6 | 0 − 4 × 1 = -4 | 1 - 4× -5 = 21 |
4 | 10 ÷ 6 = 1 | 10 − 1 × 6 = 4 | 1 − 1 ×-4 =5 | -5 - 1 × 21 = -26 |
5 | 6 ÷ 4 = 1 | 6 − 1 × 4 = 2 | -4 − 1 × 5 = -9 | 21 - 1 × -26 = 47 |
6 | 4 ÷ 2 = 2 | 4 − 2 × 2 = 0 | 5 − 2 × -9 = 23 | -26 - 2 × 47 =-120 |
اثبات
چون
چون
ماتریس زیر را در نظر بگیرید
رابطهٔ بازگشی را به شکل ماتریسی مینویسیم
ماتریس
الگوریتم اقلیدسی برای چندجملهای
برای یک چندجملهای با ضریب در یک میدان همه چیز مشابه حالت قبل است (تقسیم اقلیدسی، قضیه بزو، و تعمیم الگوریتم اقلیدس). اولین تفاوت در تقسیم اقلیدسی و الگوریتم، جایگذاری
تفاوت سوم در این است که بزرگترین مقسوم علیه مشترک فقط به صورت ضرب یک ثابت غیر صفر تعریف میشود. راههای مختلفی برای تعریف بزرگترین مقسوم علیه مشترک به صورت غیر مبهم وجود دارد.
در ریاضیات معمولاً به چندجملهای که ب.م.م همهٔ ضریبهایش یک هست نیاز است. برای رسیدن به این مقصود کافیست هر خروجی را بر ضریب بزرگترین توان
که
شبهکد
برای پیادهسازی الگوریتمی که در بالا ذکر شد،اولاً باید توجه داشت که در هر مرحله تنها نیاز به نگهداری دو مقدار نهایی متغیرهای شاخصگذاری شده، هست. بنابراین برای صرفه جویی در حافظه هر متغیر شاخصگذاری شده باید با تنها دو متغیر جایگزین شود. برای راحتی کار در الگوریتم زیر(و بقیهٔ الگوریتمها در این مقاله) از مقداردهی موازی استفاده میشود.در زبانهای برنامه نویسی که از مقداردهی موازی پشتیبانی نمیکنند، باید اینکار را با کمک یک متغیر کمکی شبیه سازی کرد.
برای مثال
(old_r, r) := (r, old_r - quotient *r)
برابر هست با
prov := r;
r := old_r - quotient * prov;
old_r := prov;
و مشابهاً برای بقیهٔ استفادهها از مقداردهی موازی هم باید چنین کاری کرد.که اینکار به کد زیر می انجامد:
'''function''' extended_gcd(a, b)
s := 0; old_s := 1
t := 1; old_t := 0
r := b; old_r := a
'''while''' r ≠ 0
quotient := old_r '''div''' r
(old_r, r) := (r, old_r - quotient *r)
(old_s, s) := (s, old_s - quotient *s)
(old_t, t) := (t, old_t - quotient *t)
'''output''' "Bézout coefficients:", (old_s, old_t)
'''output''' "greatest common divisor:", old_r
'''output''' "quotients by the gcd:", (t, s)
باید به این نکته توجه داشت که خارج قسمتهای a و b در تقسیم بر ب.م.م، که خروجی این الگوریتم هست، ممکن هست علامت نادرستی داشته باشند. رفع این مشکل در انتهای محاسبات بسیار ساده هست، اما در اینجا به دلیل سادگی کد بیان نشدهاست. مشابها اگر یکی از دو مقدار a یا b منفی و دیگری صفر باشد، ب.م.م، که خروجی این الگوریتم هست، منفی میشود و باید علامت خروجی تغییر کند.
محاسبه ی وارون ضربی در ساختارهای پیمانه ای
الگوریتم تعمیم یافتهٔ اقلیدس وسیلهٔ اصلی برای محاسبهٔ وارون ضربی در ساختارهای پیمانهای هست و اغلب در حساب پیمانهای اعداد صحیح و تعمیمهای میادین جبری به کار میآید.یک نمونهٔ مهم از مورد آخر میدانهای متناهی با order غیر اول هست.
حساب پیمانهای اعداد صحیح
اگر n یک عدد صحیح مثبت باشد، حلقهٔ Z/nZ ممکن هست توسط مجموعه {0, 1, ..., n} از باقیماندههای تقسیم اقلیدسی بر n قابل شناسایی باشد،عمل جمع و ضرب همان محاسبه ی، باقیماندهٔ نتیجهٔ جمع و ضرب اعداد صحیح، بر n هست.یک عضو از Z/nZ یک وارون ضربی دارد(اگر چنین باشد، به آن unit میگویند) اگر نسبت به n اول باشد.در حالت خاص اگر n اول باشد a وارون ضربی دارد،اگر مخالف صفر باشد(باقیمانده اش بر n).بنابراین Z/nZ یک میدان هست اگر و تنها اگر n اول باشد. قضیه بزو بیان میکند که a و n نسبت به هم اولند اگر و تنها اگر اعداد صحیحی مانند s و t وجود داشته باشند که
که اگر از دوطرف بر n باقیمانده بگیریم:
بنابراین t یا، بهطور دقیقتر، باقیماندهٔ تقسیم t بر n، همان وارون ضربی a در پیمانهٔ n هست. برای تطبیق دادن الگوریتم تعمیم یافتهٔ اقلیدس به نحوی که این مسئله را حل کند، باید در نظر داشته باشیم که نیازی به محاسبهٔ ضرایب بزو ی n نیست.همچنین برای اینکه نتیجه مثبت و کمتر از n باشد، باید از این موضوع که t همواره در رابطهٔ |t| < n صدق میکند،استفاده کرد. اگر t <0 در انتهای کار میتوان با جمع کردن آن با n آن را مثبت کرد.این تغییرات را در شبه کد زیر آورده ایم که در آن n یک عدد صحیح بزرگتر از یک هست.
'''function''' inverse(a, n)
t := 0; newt := 1;
r := n; newr := a;
'''while''' newr ≠ 0
quotient := r '''div''' newr
(t, newt) := (newt, t - quotient * newt)
(r, newr) := (newr, r - quotient * newr)
'''if''' r> 1 then '''return''' "a is not invertible"
'''if''' t <0 '''then''' t := t + n
'''return''' t
بسطهای میدان جبری ساده
الگوریتم پیشرفتهٔ اقلیدس همچنین ابزار اصلی برای محاسبهٔ وارون ضربی در تعمیمهای میدان جبری ساده هست.یک نمونهٔ مهم که بهطور گستردهای در رمزنگاری و نظریه کدگذاری استفاده میشود میدانهای جبری با اندازه (order) غیر اول هست.
در واقع اگر p یک عدد اول باشد و q = pd، میدان با اندازه(order) q یک تعمیم سادهٔ جبری از میدان اول p عضو ، هست، که توسط یک ریشهٔ معادله چندجملهای کاهش ناپذیر از درجه d ساخته شدهاست.
یک بسط سادهٔ جبری L از یک میدان K که توسط ریشه یک چندجملهای کاهش ناپذیر از درجه d ساخته شدهاست، ممکن است توسط حلقهٔ خارج قسمتهای
'''function''' inverse(a, p)
t := 0; newt := 1;
r := p; newr := a;
'''while''' newr ≠ 0
quotient := r '''div''' newr
(r, newr) := (newr, r - quotient * newr)
(t, newt) := (newt, t - quotient * newt)
'''if''' degree(r)> 0 then
'''return''' "Either p is not irreducible or a is a multiple of p"
'''return''' (1/r) * t
مثال
برای مثال اگر چندجملهای که برای تعریف میدان متناهی GF(28) بکار میرود p = x8 + x4 + x3 + x + 1 باشد و a = x6 + x4 + x + 1 عضوی باشد که وارونش مطلوب ماست، نتایج اجرای هر مرحله از الگوریتم در جدول زیر مشاهده میشود.با توجه به اینکه میدان با order 2n برای هر عضو z عضو -z = z و z + z = 0را هم دارد.توجه کنید که 1 تنها عضو غیرصفری از GF(2)هست که برایش تغییرات در خط آخر شبه کد مورد نیاز نبودهاست.
step | quotient | r, newr | t, newt |
---|---|---|---|
p = x + x + x + x + 1 | 0 | ||
a = x + x + x + 1 | 1 | ||
1 | x + 1 | x = p - a (x + 1) | x + 1 = 0 - 1 × (x + 1) |
2 | x + x | x + 1 = a - x (x + x) | x + x + 1 = 1 - (x + x) (x + 1) |
3 | x + 1 | 1 = x - (x + 1) (x + 1) | x + x + x + x = (x + 1) - (x + 1) (x + x + 1) |
4 | x + 1 | 0 = (x + 1) - 1 × (x + 1) |
بنابراین وارون مطلوب x7 + x6 + x3 + xهست، و میشود با انجام عمل ضرب دو عضو در هم و گرفتن باقیمانده بر pبه صحت آن پی برد.
الگوریتم تعمیم یافته اقلیدس برای بیش از دو عدد
ما میتوانیم در موردی که تعداد اعداد بیش از دو تا هست، بهطور پشت سر هم(دو تا باهم و سپس حاصل آنها با عدد بعدی) از این الگوریتم استفاده کنیم.اول باید اثبات کنیم که
که همان چیز مورد انتظار ما هست.
منابع
- Knuth، Donald. هنر برنامهنویسی رایانه. Addison-Wesley. Volume 2, Chapter 4.
- توماس اچ کورمن, Charles E. Leiserson, رونالد ریوست, and کلیفورد استین. مقدمهای بر الگوریتمها, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Pages 859–861 of section 31.2: Greatest common divisor.
پیوند به بیرون
- Source for the form of the algorithm used to determine the multiplicative inverse in GF(2^8)