الگوریتم تعمیم‌یافته اقلیدس

بندانگشتی|الگوریتم تعمیم‌یافته اقلیدس
در علم حساب و برنامه نویسی کامپیوتر **الگوریتم تعمیم یافته اقلیدس** تعمیمی بر الگوریتم اقلیدس است که در کنار محاسبه بزرگترین مقسوم علیه مشترک دو عدد صحیح a,b ضرایب قضیه بزو را هم محاسبه می‌کند(x,y اعداد صحیح اند): 
ax + by = \gcd(a, b). 
همچنین می‌توان بدون هزینهٔ اضافی خارج قسمت a,b را با بزرگترین مقسوم علیه مشترک محاسبه کرد.

الگوریتم تعمیم یافته اقلیدس به الگوریتمی بسیار مشابه به الگوریتمی برای محاسبه بزرگترین مقسوم علیه مشترک چندجمله ای و ضرایب قضیه بزو از دو چندجمله‌ای با یک متغیر، ارجاع دارد. 
الگوریتم تعمیم یافته اقلیدس زمانی که a و b نسبت به هم اولند مفید تر است. چون x برابر وارون ضربی پیمانه‌ای a به پیمانه b و y برابر وارون ضربی پیمانه‌ای b به پیمانه a است. در الگوریتم اقلیدس برای چندجمله‌ای می‌توان وارون ضربی را در بسط‌های میدان جبری محاسبه کرد. که از آن نتیجه می‌شود هردو نوع الگوریتم اقلیدسی تعمیم یافته (معمولی و چندجمله‌ای) کاربردی گسترده در رمزنگاری دارند. به خصوص در محاسبه وارون ضربی پیمانه‌ای در روش RSA یک گام ضروریست. 
  
## توضیح الگوریتم
در الگوریتم اقلیدسی معمولی فقط باقی‌مانده‌ها نگاه داشته می‌شوند و خارج قسمت استفاده نمی‌شود. اما در الگوریتم تعمیم یافته خارج قسمت‌های متوالی استفاده می‌شوند. به‌طور دقیقتر در الگوریتم تعمیم یافته که a، b را به عنوان ورودی می‌گیرد، دنبالهٔ  q_1,\ldots, q_k از خارج قسمت‌ها و دنبالهٔ  r_0,\ldots, r_{k+1} از باقی‌مانده‌ها را شامل می‌شود.

:
\begin{array}{l}
r_0=a\\
r_1=b\\
\ldots\\
r_{i+1}=r_{i-1}-q_i r_i \quad \text {and} \quad 0\le r_{i+1} 
مهمترین ویژگی تقسیم اقلیدسی نامساوی سمت راست است که  r_{i+1} را متفاوت از  r_{i-1} و r_{i} تعریف می‌کند. وقتی باقی‌مانده به صفر رسید محاسبه متوقف می‌شود، بزرگترین مقسوم علیه مشترک آخرین باقی‌مانده غیر صفر است. الگوریتم تعمیم یافته اقلیدسی روشی مشابه دارد با این تفاوت که دو دنبالهٔ زیر نیز به آن اضافه می‌شود:

:
\begin{array}{l}
s_0=1\qquad s_1=0\\
t_0=0\qquad t_1=1\\
\ldots\\
s_{i+1}=s_{i-1}-q_i s_i\\
t_{i+1}=t_{i-1}-q_i t_i\\
\ldots
\end{array}


در این الگوریتم هم وقتی r_{k+1}=0 میشود کار الگوریتم به اتمام می‌رسد. 
* r_{k} بزرگترین مقسوم علیه برای دو ورودی  a=r_{0} و b=r_{1}. است. 
* ضرایب بزو هم که برابر s_{k} و t_{k}, در رابطهٔ زیر صدق می‌کنند: 
GCD(a,b)=r_{k}=as_k+bt_k
* خارج قسمت تقسیم a و b بر بزرگترین مقسوم علیه مشترکشان به این صورت است: 
s_{k+1}=\pm\frac{b}{GCD(a,b)} و t_{k+1}=\pm\frac{a}{GCD(a,b)} 
به علاوه اگر a و b هردو مثبت باشند داریم: 
:|s_k|  
که این یعنی جفت ضرایب بزو که از این الگوریتم به دست می‌آیند یکی از کمترین جفت ضرایب بزو هستند. 
## مثال

جدول زیر رویه الگوریتم تعمیم یافته اقلیدسی را برای46 و240 را نشان می‌دهد. بزرگترین مقسوم علیه مشترک برابر ۲ است. محاسبه در سطر ۶ متوقف می‌شود، چون باقی‌مانده صفر می‌شود. ضرایب بزو هم در دو ستون آخر از سطر آخرند. تحقیق رابطه -9*240+47*46=2 راحت است. و سرانجام -120 و 23 بدون توجه به علامت برابر تقسیم ۲۴۰ و ۴۶ بر بزرگترین مقسوم علیه مشترک یعنی ۲ هستند

## اثبات

چون   0\le r_{i+1} و دنبالهٔ باقی‌مانده‌ها یک دنبالهٔ نزولی غیر منفی است در نتیجه باید حتماً با  r_{k+1}=0.  متوقف شود. این نشان می‌دهد که الگوریتم متوقف می‌شود و کار به اتمام می‌رسد.

چون  r_{i+1}= r_{i-1} - r_i q_i, در نتیجه بزرگترین مقسوم علیه مشترک  (r_{i-1}, r_i) و  (r_{i}, r_{i+1})
برابر است. که از ان نتیجه می‌شود بزرگترین مقسوم علیه مشترک  a=r_0, b=r_1  برابر است با بزرگترین مقسوم علیه مشترک  r_k, r_{k+1}=0.  وهمچنین نشان می‌دهد که  r_k  بزرگترین مقسوم علیه مشترک a و b است که آن را d می‌نامیم.

 a=r_0 و  b=r_1,  که برای i=0,1داریم: as_i+bt_i=r_i  برای هر i رابطهٔ بازگشتی خطی  برقرار است بخصوص برای i=k که as_k+bt_k=r_k,  نشان میدهیم که  (s_k, t_k)  ضرایب بزواند. 

ماتریس زیر را در نظر بگیرید 
:A_i=\begin{pmatrix}
s_{i-1} & s_i\\
t_{i-1} & t_i
\end{pmatrix} \,.
 
رابطهٔ بازگشی را به شکل ماتریسی می‌نویسیم 
:A_{i+1} = A_i
\,.\,
\begin{pmatrix}
0 & 1\\
1 & -q_i
\end{pmatrix} \,.
 
ماتریس  A_1 ماتریس واحد است و دترمینان آن برابر ۱ است. دترمینان ماتریس سمت راست برابر -1 است که نتیجه می‌شود دترمینان  A_i برابر (-1)^{i-1}. است و برای حالت خاص i=k+1 داریم  s_k t_{k+1}-t_k s_{k+1} = (-1)^k.  که نشان می‌دهد  s_{k+1} و  t_{k+1} نسبت بهم اولند. رابطهٔ as_{k+1}+bt_{k+1}=0 که در بالا اثبات شد و لم اقلیدس نشان می‌دهد که  s_{k+1} مقسوم علیه b و  t_{k+1} مقسوم علیه a‌اند. چون آن‌ها نسبت بهم اولاً بدون در نظر گرفتن علامتشان برابر خارج قسمت تقسیم a و b بر d می‌شوند.

## الگوریتم اقلیدسی برای چندجمله‌ای

برای یک چندجمله‌ای با ضریب در یک میدان همه چیز مشابه حالت قبل است (تقسیم اقلیدسی، قضیه بزو، و تعمیم الگوریتم اقلیدس). اولین تفاوت در تقسیم اقلیدسی و الگوریتم، جایگذاری \deg r_{i+1} بجای 0\le r_{i+1} است. بقیه مشابه حالت قبل باقی میماند. 
تفاوت دوم در محدودیتی است که بر اندازهٔ ضرایب بزو که از تعمیم الگوریتم اقلیدس به دست میاید وجود دارد، که در مورد چندجمله‌ای دقیق تر است. اگر a و b دو چند جملۀ غیر صفر باشند الگوریتم تعمیم یافته (s,t) را به گونه‌ای به دست میاورد که در شرایط زیر صدق کند: 
:as+bt=\gcd(a,b)
و  
:\deg s  
تفاوت سوم در این است که بزرگترین مقسوم علیه مشترک فقط به صورت ضرب یک ثابت غیر صفر تعریف می‌شود. راه‌های مختلفی برای تعریف بزرگترین مقسوم علیه مشترک به صورت غیر مبهم وجود دارد. 
در ریاضیات معمولاً به چندجمله‌ای که ب.م.م همهٔ ضریب‌هایش یک هست نیاز است. برای رسیدن به این مقصود کافیست هر خروجی را بر ضریب بزرگترین توان r_{k}.   تقسیم کنیم. اگر a و b نسبت به هم اول باشند در سمت راست نامساوی بزو یکی ۱ می‌شود، در غیر این صورت یکی ممکن است هر مقدار ثابت غیر صفر شود. در جبر کامپیوتر، چندجمله‌ای معمولاً ضرایب صحیح را می‌پذیرد، و این راه ساده‌سازی بزرگترین مقسوم علیه مشترک برای سهولت تعداد بسیار زیادی بخش ایجاد می‌کند. 
راه دوم ساده‌سازی بزرگترین مقسوم علیه مشترک در حالت چندجمله‌ای با ضرایب صحیح تقسیم بر بزرگترین عمل مشترک بین ضرایب r_{k}, برای رسیدن به چندجمله‌ای اصلی (یعنی چندجمله‌ای که بزرگترین عامل مشترک ضرایبش ۱ است). اگر چند جمله‌ی‌های ورودی نسبت به هم اول باشند این نرمال‌سازی بزرگترین مقسوم علیه مشترک را یک می‌دهد. اشکال این روش محاسبه، وجود زیر مسئله‌های زیاد است که باید محاسبه و ساده شوند. 
 روش سوم شامل تعمیم الگوریتم subresultant pseudo-remainder sequences که مشابه تعمیم الگوریتم اقلیدسی به الگوریتم تعمیم یافته‌است. این روش این امکان را فراهم می‌کند که وقتی با چندجمله‌ای با ضرایب صحیح شروع می‌کنیم هر چندجمله‌ای که بدست میاید ضرایبش، صحیح باشد. علاوه بر این هر باقی‌مانده محاسبه شده یک چندجمله‌ای subresultant است. در حالت خاص اگر چند جمله‌ی‌های ورودی نسبت به هم اول باشند آنگاه طبق قضیه بزو می‌شود: 
:as+bt=\operatorname{Res}(a,b), 
 که \operatorname{Res}(a,b) برابر resultant، a,bاست. در این فرم قضیه بزو مقسوم علیه دیده نمی‌شود. اگر همه چیز را بر resultant تقسیم کنیم قضیه کلاسیک بزو بدست می‌آید ، با یک مقسوم علیه مشترک ساده برای اعداد گویایی که در آن ظاهر می‌شوند. 
## شبه‌کد
برای پیاده‌سازی الگوریتمی که در بالا ذکر شد،اولاً باید توجه داشت که در هر مرحله تنها نیاز به نگهداری دو مقدار نهایی متغیرهای شاخص‌گذاری شده، هست. بنابراین برای صرفه جویی در حافظه هر متغیر شاخص‌گذاری شده باید با تنها دو متغیر جایگزین شود. 
برای راحتی کار در الگوریتم زیر(و بقیهٔ الگوریتم‌ها در این مقاله) از مقداردهی موازی استفاده می‌شود.در زبانهای برنامه نویسی که از مقداردهی موازی پشتیبانی نمی‌کنند، باید اینکار را با کمک یک متغیر کمکی شبیه سازی کرد.

برای مثال 

```bash
(old_r, r) := (r, old_r - quotient *r)
```

برابر هست با

```bash
prov := r;
 r := old_r - quotient * prov;
 old_r := prov;
```

و مشابهاً برای بقیهٔ استفاده‌ها از مقداردهی موازی هم باید چنین کاری کرد.که اینکار به کد زیر می انجامد:


```bash
'''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 وجود داشته باشند که 
:ns+at=1 
که اگر از دوطرف بر n باقی‌مانده بگیریم: 
:at=1 \mod n. 
بنابراین t یا، به‌طور دقیقتر، باقی‌ماندهٔ تقسیم t بر n، همان وارون ضربی a در پیمانهٔ n هست. 
برای تطبیق دادن الگوریتم تعمیم یافتهٔ اقلیدس به نحوی که این مسئله را حل کند، باید در نظر داشته باشیم که نیازی به محاسبهٔ ضرایب بزو ی n نیست.همچنین برای اینکه نتیجه مثبت و کمتر از n باشد، باید از این موضوع که t همواره در رابطهٔ |t| 
 **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 
## بسط‌های میدان جبری ساده
الگوریتم پیشرفتهٔ اقلیدس همچنین ابزار اصلی برای محاسبهٔ وارون ضربی در تعمیم‌های میدان جبری ساده هست.یک نمونهٔ مهم که به‌طور گسترده‌ای در رمزنگاری و نظریه کدگذاری استفاده می‌شود میدان‌های جبری با اندازه (order) غیر اول هست.

در واقع اگر p یک عدد اول باشد و q = pd، میدان با اندازه(order) q یک تعمیم سادهٔ جبری از میدان اول p عضو ، هست، که توسط یک ریشهٔ معادله چندجمله‌ای کاهش ناپذیر از درجه d ساخته شده‌است. 
یک بسط سادهٔ جبری L از یک میدان K که توسط ریشه یک چندجمله‌ای کاهش ناپذیر از درجه d ساخته شده‌است، ممکن است توسط حلقهٔ خارج قسمت‌های K[X]/\langle p\rangle, به‌طور یکتا شناسایی شود، و اعضایش در یک رابطهٔ یک به یک و و پوشا با چندجمله‌ای‌هایی با درجات کمتر از d هستند.عمل جمع در L همان جمع چندجمله‌ای ها است.عمل ضرب در L باقی‌ماندهٔ تقسیم اقلیدسی بر، p حاصلضرب چندجمله ای‌ها است.بنابراین برای تکمیل اعمال حسابی در L تنها کافیست نحوهٔ محاسبهٔ وارون ضربی را تعریف کنیم.که آن با استفاده از الگوریتم تعمیم یافتهٔ اقلیدسی انجام می‌شود. 
این الگوریتم بسیار شبیه الگوریتمی است که در بالا برای محاسبهٔ وارون ضربی پیمانه‌ای بیان شده‌است.در اینجا دو تفاوت مهم وجود دارد:اولاً اینکه به خط آخر نیازی نیست، چون ضریب بزو همیشه یک درجه کمتر از d دارد. 
دوم اینکه ب.م.م ای که بدست آمده‌است، وقتی که چندجمله‌ای‌های ورودی نسبت به هم اولند، ممکن هست هر عضو غیرصفری از K باشند، بنابراین ضریب بزو (یک چندجمله‌ای با درجهٔ مثبت) باید در وارون این عضو از K ضرب شود. 
در شبه کد زیر p یک چندجمله‌ای از درجه بزرگتر از یک هست و a یک چندجمله‌ای هست.علاوه بر این div یک تابع کمکی است که خارج قسمت تقسیم اقلیدسی را حساب می‌کند. 

```bash
'''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)هست که برایش تغییرات در خط آخر شبه کد مورد نیاز نبوده‌است. 

بنابراین وارون مطلوب x7 + x6 + x3 + xهست، و می‌شود با انجام عمل ضرب دو عضو در هم و گرفتن باقی‌مانده بر pبه صحت آن پی برد.

## الگوریتم تعمیم یافته اقلیدس برای بیش از دو عدد
ما می‌توانیم در موردی که تعداد اعداد بیش از دو تا هست، به‌طور پشت سر هم(دو تا باهم و سپس حاصل آن‌ها با عدد بعدی) از این الگوریتم استفاده کنیم.اول باید اثبات کنیم که \gcd(a,b,c) = \gcd(\gcd(a,b),c).برای این اثبات اگر d=\gcd(a,b,c)باشد،طبق تعریف می‌توان گفت که d مقسوم علیه مشترک a و b هست.بنابراین برای یک مقدار خاص k داریم\gcd(a,b)=k d .مشاب‌ها d مقسوم علیه c هم هست، پس برای یک مقدار خاصی ازj c=jd.اگر u=\gcd(k,j) با این تعریف ما از u، ud | a,b,c اما چون d بزرگترین مقسوم علیه هستu وارون ضربی دارد.(unit هست.) 
بنابراین اگر na + mb = \gcd(a,b) پس مقادیر x و y وجود دارند به‌طوری‌که x\gcd(a,b) + yc = \gcd(a,b,c). بنابراین معادلهٔ نهایی به شکل : x(na + mb) + yc = (xn)a + (xm)b + yc =  \gcd(a,b,c).\, خواهد بود. 
پس اگر ما آن را با استقرا روی n عدد انجام دهیم به معادلهٔ زیر میرسیم 
:\gcd(a_1,a_2,\dots,a_n) =\gcd(a_1,\, \gcd(a_2,\, \gcd(a_3,\dots, \gcd(a_{n-1}\,,a_n)))\dots), 
که همان چیز مورد انتظار ما هست.

## منابع

*  Volume 2, Chapter 4.
* توماس اچ کورمن, Charles E. Leiserson, رونالد ریوست, and کلیفورد استین. *[[مقدمه‌ای بر الگوریتم‌ها]]*, Second Edition. MIT Press and McGraw-Hill, 2001. . Pages 859&ndash;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)

رده:اقلیدس
رده:الگوریتم‌های نظریه اعداد