Rozšírený Euklidov algoritmus je algoritmus, ktorým je možné nájsť Bézoutovú rovnosť, čiže vyjadriť najväčší spoločný deliteľ (NSD) dvoch kladných celých čísel ich lineárnou kombináciou.
Príklad
Nech sú dané dve kladné celé čísla m a n a nech d je ich najväčší spoločný deliteľ, t.j. d = NSD(m,n). Pomocou Euklidovho algoritmu je možné zistiť, že NSD(196,34) = 2:
i
|
ci
|
di
|
pi
|
zi
|
0
|
196
|
34
|
5
|
26
|
1
|
34
|
26
|
1
|
8
|
2
|
26
|
8
|
3
|
2
|
3
|
8
|
2
|
4
|
0
|
kde
je iterácia,
,
,
je celočíselný podiel
,
je zvyšok po delení
, čiže platí
,
resp:
![{\displaystyle z_{i}=c_{i}-d_{i}p_{i}\qquad (1)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/003dc145245e68840d75ca6d31320c731a322a98)
a pre každé
je
![{\displaystyle {\begin{array}{lcll}c_{i}&=&d_{i-1}&\qquad (2)\\d_{i}&=&z_{i-1}&\qquad (3)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/67c3072a9fbd15305634ed7930536ce330d7eff9)
Úlohou Rozšíreného Euklidovho algoritmu je nájsť dvojicu celých čísel
a
, spĺňajúcu rovnosť
.
Nájdenie Bézoutovej rovnosti spätným dosadzovaním
V uvedenom príklade platí:
![{\displaystyle {\begin{array}{lcll}2&=&26-8\cdot 3&\qquad (4)\\8&=&34-26\cdot 1&\qquad (5)\\26&=&196-34\cdot 5&\qquad (6)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/82a18875898289396da1f9cb80b5df512a407986)
Dosadením ľavej strany rovnosti (5) do rovnosti (4) dostaneme:
![{\displaystyle 2=34\cdot (-3)+26\cdot 4\qquad (7)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7d9ae8ac054cca8fea790fdb88bbe01998207a53)
a dosadením ľavej strany rovnosti (6) do rovnosti (7) dostaneme výsledok:
![{\displaystyle 2=196\cdot 4+34\cdot (-23)\qquad (8)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1e6a806dd0fe36f6c496519b32e154d0e7ffb58d)
t.j. jednu z možností, ako vyjadriť najväčší spoločný deliteľ dvoch čísel ich lineárnou kombináciou.
Odvodenie
Nech
je iterácia v Euklidovom algoritme, v ktorej bol nájdený najväčší spoločný deliteľ dvoch kladných celých čísel
, čiže pre ktoré platí
.
Spätným dosadením vyjadríme najväčší spoločný deliteľ
ako lineárnu kombináciu
a
postupne pre každé
, t.j:
![{\displaystyle d=c_{i}u_{i}+d_{i}v_{i}\qquad (9)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/22a4cd7db7cba591c51344cf14a42ad1d05beca0)
Dosadením (2) a (3) do (9) dostaneme:
![{\displaystyle d=d_{i-1}u_{i}+z_{i-1}v_{i}\qquad (10)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/77a5cd8151408c732eaf37018518c182ab96f303)
a dosadením (1) do (10):
![{\displaystyle {\begin{alignedat}{2}d&=d_{i-1}u_{i}+(c_{i-1}-d_{i-1}p_{i-1})v_{i}\\&=c_{i-1}v_{i}+d_{i-1}(u_{i}-p_{i-1}v_{i})\qquad (11)\end{alignedat}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5241a629755920dce17684700d0cc15c7b025845)
Porovnaním (11) a (9) dostávame výsledok:
![{\displaystyle {\begin{array}{lcll}u_{i-1}&=&v_{i}&\qquad (12)\\v_{i-1}&=&u_{i}-p_{i-1}v_{i}&\qquad (13)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/995ca318b427925253269d9a2a3b93ed0f60fe5b)
Tiež platí:
![{\displaystyle d=d_{k}=c_{k}\cdot 0+d_{k}\cdot 1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/536fa0ffefd806bfe33645de858266170f26ec25)
preto:
![{\displaystyle {\begin{array}{lcll}u_{k}&=&0&\qquad (14)\\v_{k}&=&1&\qquad (15)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c69613115611b09cb2295573abdfb552e1aa1582)
1. [Inicializácia premenných.] Priraďte i ← k, u ← 0, v ← 1.
2. [Ukončovacia podmienka.] Ak i = 0 tak koniec, pričom NSD(m,n) = m·u + n·v
3. [Výpočet u a v.] Priraďte u_new ← v, v_new ← u - p[i-1]·v.
4. [Ďalšia iterácia.] Priraďte i ← i-1, u ← u_new, v ← v_new. Vráťte sa do bodu 2.
Poznámka: Výpočet prebieha opačným smerom než výpočet NSD a okrem naposledy vypočítanej dvojice hodnôt
a
je potrebné mať k dispozícii aj všetky hodnoty
.
Použitie na konkrétnom príklade
i
|
ci
|
di
|
pi
|
zi
|
ui
|
vi
|
0
|
196
|
34
|
5
|
26
|
4
|
-23
|
1
|
34
|
26
|
1
|
8
|
-3
|
4
|
2
|
26
|
8
|
3
|
2
|
1
|
-3
|
3
|
8
|
2
|
4
|
0
|
0
|
1
|
Rozšírený Euklidov algoritmus
Odvodenie
Nech
je iterácia v Euklidovom algoritme, v ktorej bol nájdený najväčší spoločný deliteľ dvoch kladných celých čísel
, čiže pre ktoré platí
. Pre každé
vyjadrime
ako lineárnu kombináciu čísel
a
, t.j. hľadáme dvojicu celých čísel
a
, pre ktoré platí
- Pre
z rovnosti (1) vyplýva:
![{\displaystyle {\begin{array}{lclr}z_{0}&=&c_{0}-d_{0}p_{0}\\&=&m-np_{0}&\qquad (17)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c407ac6a3bb72d6c590e27bfeb149581d5981003)
- preto
![{\displaystyle {\begin{array}{lclr}a_{0}&=&1&\qquad (18)\\b_{0}&=&-p_{0}&\qquad (19)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/32f9972b918758113996666a5bd4425f9825d375)
- Pre
z (1) vyplýva:
![{\displaystyle {\begin{array}{lclr}z_{1}&=&c_{1}-d_{1}p_{1}&\qquad (20)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/701790907146405a5f4ce76009b0279cf8460864)
- a podľa (2) a (3):
![{\displaystyle {\begin{array}{lclcl}c_{1}&=&d_{0}&=&n\\d_{1}&=&z_{0}\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9b2d0ba3f3ab8c90d296ca14fece3eb51cef7783)
- Preto
![{\displaystyle {\begin{array}{lcl}z_{1}&=&n-z_{0}p_{1}\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/15937dd627236f1660f3501fb06d320fadb7dc64)
- Po dosadení za
zo (17) dostaneme:
![{\displaystyle {\begin{array}{lclr}z_{1}&=&n-mp_{1}+np_{0}p_{1}\\&=&-mp_{1}+n(1+p_{0}p_{1})&\qquad (21)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4beda533fb52c1ddd844b1f8ab85baf11ad11ad2)
- A teda
![{\displaystyle {\begin{array}{lclr}a_{1}&=&-p_{1}&\qquad (22)\\b_{1}&=&1+p_{0}p_{1}&\qquad (23)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/920e15d5bf080ae5c2163591836128e7dbaf8073)
- Pre ľubovoľné
je podľa (2) a (3):
![{\displaystyle {\begin{array}{lclcl}c_{i}&=&d_{i-1}&=&z_{i-2}\\d_{i}&=&z_{i-1}\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/19a3dd0157d41877e4b8287544071141a7931afa)
- Dosadením do (1) dostávame:
![{\displaystyle {\begin{array}{lclcl}z_{i}&=&c_{i}-d_{i}p_{i}&=&z_{i-2}-z_{i-1}p_{i}\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/92f0c3f78616a9a40a0f376bbaa79721a8d85bf0)
- Ak poznáme (16) pre
a
, dostávame:
![{\displaystyle {\begin{array}{lcl}z_{i}&=&ma_{i-2}+nb_{i-2}-(ma_{i-1}+nb_{i-1})p_{i}\\&=&m(a_{i-2}-a_{i-1}p_{i})+n(b_{i-2}-b_{i-1}p_{i})\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/979c36cf8e56952e67199b817371e68639e5c0ee)
- Preto pre ľubovoľné
je:
![{\displaystyle {\begin{array}{lclr}a_{i}&=&a_{i-2}-a_{i-1}p_{i}&\qquad (24)\\b_{i}&=&b_{i-2}-b_{i-1}p_{i}&\qquad (25)\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c34c77a42a6e0a1ec63df68f9106fdd6a2789dbb)
- Ak sa nasledujúcim spôsobom zadefinujú hodnoty
,
a
aj pre
a
:
![{\displaystyle {\begin{array}{lcllcllcl}z_{-2}&=&m,&a_{-2}&=&1,&b_{-2}&=&0\\z_{-1}&=&n,&a_{-1}&=&0,&b_{-1}&=&1\end{array}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ae0054bda2a35fe5c93a5ffcccd100b67e5734a8)
bude rovnosť (16) platiť aj pre ne a vzťahy (24), (25) je možné použiť aj na zistenie
.
1. [Inicializácia premenných.] Priraďte c ← m, d ← n, a_old ← 1, b_old ← 0, a ← 0, b ← 1.
2. [Výpočet podielu a zvyšku.] Vypočítajte celočíselný podiel p a zvyšok z po delení c / d.
3. [Ukončovacia podmienka.] Ak z = 0 tak koniec, pričom NSD(m,n) = d = m·a + n·b
4. [Výpočet a a b.] Priraďte a_new ← a_old - a·p, b_new ← b_old - b·p.
5. [Redukcia.] Priraďte c ← d, d ← z, a_old ← a, a ← a_new, b_old ← b, b ← b_new. Vráťte sa do bodu 2.
Poznámka: Výpočet prebieha súčasne s výpočtom NSD pričom je potrebné mať k dispozícii aj dve posledné dvojice hodnôt
.
Použitie na konkrétnom príklade
i
|
ci
|
di
|
pi
|
zi
|
ai
|
bi
|
-2
|
|
|
|
196
|
1
|
0
|
-1
|
|
|
|
34
|
0
|
1
|
0
|
196
|
34
|
5
|
26
|
1
|
-5
|
1
|
34
|
26
|
1
|
8
|
-1
|
6
|
2
|
26
|
8
|
3
|
2
|
4
|
-23
|
3
|
8
|
2
|
4
|
0
|
|
|
Zdroj
Iné projekty