Euklideszi algoritmus: GCD (legnagyobb közös osztó), magyarázva C ++ és Java példákkal

Ehhez a témához először ismernie kell a legnagyobb közös osztót (GCD) és a MOD műveletet.

Legnagyobb közös osztó (GCD)

Két vagy több egész szám GCD-je a legnagyobb egész szám, amely az egész számokat úgy osztja fel, hogy a fennmaradó részük nulla legyen.

Példa-

GCD 20-ból, 30 = 10   (10 a legnagyobb szám, amely osztja a 20-at és a 30-at, a fennmaradó rész pedig 0)

GCD 42, 120, 285 = 3   (3 a legnagyobb szám, amely osztja a 42, 120 és 285 maradékot 0-val)

"mod" művelet

A mod művelet megadja a maradékot, ha két pozitív egész szám fel van osztva. A következőképpen írjuk:

A mod B = R

Ez azt jelenti, hogy ha A-t elosztjuk B-vel, akkor megkapjuk a maradék R-t.

Példa-

7 mod 2 = 1   (A 7 osztása 2-vel megadja a maradékot 1)

42 mod 7 = 0   (Ha elosztjuk 42-vel 7-et, a maradék 0-t adunk)

A fenti két megértett fogalommal könnyen meg fogja érteni az euklideszi algoritmust.

Euklideszi algoritmus a legnagyobb közös osztóra (GCD)

Az euklideszi algoritmus megtalálja 2 szám GCD-jét.

Jobban meg fogja érteni ezt az algoritmust, ha működésében látja. Ha feltételezzük, hogy ki akarja számítani az 1220 és 516 GCD értékét, alkalmazhatja az euklideszi algoritmust:

Ha feltételezzük, hogy ki akarja számítani az 1220 és 516 GCD értékét, alkalmazhatja az euklideszi algoritmust:

Euklideszi példa

Az algoritmus ál kódja-

1. lépés:   Legyen   a, b  a két szám

2. lépés:  a mod b = R

3. lépés:   Hagyd   a = b  és  b = R

4. lépés:   Ismételje meg a 2. és 3. lépést, amíg   a mod b  nagyobb lesz, mint 0

5. lépés:   GCD = b

6. lépés: Befejezés

JavaScript kód a GCD elvégzéséhez

function gcd(a, b) { var R; while ((a % b) > 0) { R = a % b; a = b; b = R; } return b; } 

JavaScript kód a GCD elvégzéséhez rekurzióval-

function gcd(a, b) { if (b == 0) return a; else return gcd(b, (a % b)); } 

C kód a GCD rekurzióval történő végrehajtásához

int gcd(int a, int b) { // Everything divides 0 if (a == 0) return b; if (b == 0) return a; // base case if (a == b) return a; // a is greater if (a > b) return gcd(a-b, b); return gcd(a, b-a); } 

C ++ kód a GCD-hez

int gcd(int a,int b) { int R; while ((a % b) > 0) { R = a % b; a = b; b = R; } return b; } 

Python-kód a GCD végrehajtásához a rekurzió segítségével

def gcd(a, b): if b == 0: return a: else: return gcd(b, (a % b)) 

Java kód a GCD végrehajtásához a rekurzió használatával

static int gcd(int a, int b) { if(b == 0) { return a; } return gcd(b, a % b); } 

Használhatja az euklideszi algoritmust kétnél több számból álló GCD megkeresésére is. Mivel a GCD asszociatív, a következő művelet érvényes  GCD(a,b,c) == GCD(GCD(a,b), c)

Számítsa ki az első két szám GCD-jét, majd keresse meg az eredmény GCD-jét és a következő számot. Példa-  GCD(203,91,77) == GCD(GCD(203,91),77) == GCD(7, 77) == 7

n  Ugyanígy megtalálhatja a számok GCD-jét is   .

Mi az a kibővített euklideszi algoritmus?

Ez az euklideszi algoritmus kiterjesztése. Kiszámítja az x, y együtthatókat is úgy, hogy

ax + by = gcd (a, b)

x és y Bézout azonosságának együtthatójaként is ismertek.

c kiterjesztett euklideszi algoritmus kódja

struct Triplet{ int gcd; int x; int y; }; Triplet gcdExtendedEuclid(int a,int b){ //Base Case if(b==0){ Triplet myAns; myAns.gcd = a; myAns.x = 1; myAns.y = 0; return myAns; } Triplet smallAns = gcdExtendedEuclid(b,a%b); //Extended euclid says Triplet myAns; myAns.gcd = smallAns.gcd; myAns.x = smallAns.y; myAns.y = (smallAns.x - ((a/b)*(smallAns.y))); return myAns; }