Data aktualizacji: 24 czerwca 2026

Algorytm Euklidesa - Co to jest algorytm NWD, jak go obliczyć i zaimplementować

Algorytm Euklidesa jest używany już od setek lat i jest jednym z najstarszych znanych sposobów obliczania największego wspólnego dzielnika (NWD). Z jego pomocą można w prosty sposób znaleźć NWD dla dwóch konkretnych wartości, niezależnie od tego, czy są one małe czy bardzo duże. Jest to jeden z tematów, które przeprowadzamy na naszym kursie przygotowującym do matury z informatyki.

Co to jest algorytm Euklidesa?

Algorytm Euklidesa, opracowany przez Euklidesa w Aleksandrii w III wieku p.n.e., polega na odejmowaniu od siebie dwóch liczb (mniejszej od większej), a następnie podmienianiu większej wartości przez uzyskany wynik. Proces ten powtarza się, dopóki nie uzyska się wartości 0 zamiast jednej z liczb, dzięki czemu uzyskuje się NWD (największy wspólny dzielnik). 

NWD (Największy Wspólny Dzielnik) to największa liczba naturalna, która dzieli dwie liczby (lub więcej) na wyniki bez reszty.

Algorytm Euklidesa dostępny jest w dwóch formach, czyli z odejmowaniem lub z resztą z dzielenia. Co istotne, można z niego korzystać także w przypadku liczb całkowitych lub zmiennoprzecinkowych.

Złożoność czasowa algorytmu Euklidesa wynosi O(log2(a+b)), przy czym a i b to wejściowe liczby całkowite.

Jak obliczyć NWD: odejmowanie

W przypadku odejmowania odejmuje się od siebie dwie liczby (a i b), a uzyskany wynik zamienia z większą z wartości. W momencie, gdy uzyska się wartość 0 (czyli liczby przed odejmowaniem są takie same) zamiast jednej z liczb (a lub b), działanie algorytmu się kończy i uzyskuje się największy wspólny dzielnik (NWD), czyli tę liczbę, która jest większa od 0.

Przykład algorytmu Euklidesa: odejmowanie

Algorytm Euklidesa wykorzystujący odejmowanie jest stosowany głównie dla małych liczb, bo można oczekiwać, że proces dla małych wartości przebiegnie szybko.

Algorytm Euklidesa z odejmowaniem
Algorytm Euklidesa działa na zasadzie powtarzającego się odejmowania mniejszej liczby od większej.

Dla przykładu zastosujemy algorytm Euklidesa wykorzystujący odejmowanie na liczbach 1050 oraz 420.
W tym przypadku 1050 to większa liczba, więc to od niej odejmujemy drugą, czyli 420:
1050 – 420 = 630
Uzyskany wynik zamieniamy z większą z liczb w parze.
Czyli teraz to: 630, 420

Wartość 630 jest większa od 420, dlatego: 

630 – 420 = 210
420, 210

420 – 210 = 210
210, 210

210 – 210 = 0
0, 210

Największym wspólnym dzielnikiem (NWD) liczb 1050 oraz 420 jest 210.

Algorytm Euklidesa (NWD): schemat blokowy i pseudokod

Poniżej zapisano algorytm Euklidesa z odejmowaniem w formie schematu blokowego oraz pseudokodu. Skorzystaj z nich, by lepiej zrozumieć działanie metody wykorzystującej odejmowanie.

Algorytm Euklidesa - Schemat blokowy z odejmowaniem
Algorytm Euklidesa to metoda znajdowania największego wspólnego dzielnika (NWD) dwóch liczb.
funkcja AlgorytmEuklidesa_Odejmowanie (zm_a, zm_b)
    dopóki zm_a ≠ zm_b wykonuj
        jeżeli zm_a > zm_b
            zm_a ← zm_a - zm_b
        w przeciwnym razie
            zm_b ← zm_b - zm_a
    zwróć zm_a i zakończ

Opis pseudokodu - algorytm Euklidesa z odejmowaniem

Każdy z poniższych punktów oznacza kolejną linię w pseudokodzie.

  1. Zdefiniowanie funkcji o nazwie AlgorytmEuklidesa_Odejmowanie przyjmującej dwie zmienne: zm_a i zm_b. Te zmienne reprezentują dwie liczby, dla których chcemy znaleźć największy wspólny dzielnik (NWD).
  2. Rozpoczęcie pętli, która będzie działać, dopóki zm_a i zm_b nie będą równe. Oznacza to, że dopóki różnica między liczbami istnieje, algorytm będzie kontynuowany.
  3. Sprawdzenie, czy zm_a jest większa niż zm_b. Jeśli tak, wykona się kod w kolejnej linii.
  4. Jeśli zm_a > zm_b, od wartości zm_a odejmowana jest wartość zm_b. Wynik przypisywany jest z powrotem do zm_a.
  5. Jeżeli warunek w linii 3 nie jest spełniony, tzn. zm_a jest mniejsze lub równe zm_b, wykonuje się ten blok kodu.
  6. Od wartości zm_b odejmowana jest wartość zm_a. Wynik przypisywany jest z powrotem do zm_b.
  7. Po zakończeniu pętli (gdy zm_a == zm_b) algorytm zwraca wartość zm_a jako wynik. Jest to największy wspólny dzielnik (NWD) dla liczb zm_a i zm_b.

Implementacje algorytmu Euklidesa: Python, C++ i Java

Poniżej znajdziesz implementację algorytmu Euklidesa wykorzystującą odejmowanie w językach Python, C++ oraz Java. Do każdego z języków podano dwie formy implementacji: jedną utworzoną przy pomocy iteracji (pętli), a drugą przy pomocy rekurencji.

Algorytm Euklidesa: Python - odejmowanie
# Algorytm Euklidesa z odejmowaniem w formie iteracyjnej

def Iteracyjnie_AlgorytmEuklidesa_Odejmowanie(zm_a, zm_b):
	while zm_a != zm_b:
    	if zm_a > zm_b:
        	zm_a -= zm_b
    	else:
        	zm_b -= zm_a
	return zm_a  # Zwracanie NWD
 
print(Iteracyjnie_AlgorytmEuklidesa_Odejmowanie(1050, 420))
# Algorytm Euklidesa z odejmowaniem w formie rekurencyjnej

def Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(zm_a, zm_b):
	if zm_a == zm_b:
    	return zm_a
	if zm_a > zm_b:
    	return Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(zm_a - zm_b, zm_b)
	return Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(zm_b - zm_a, zm_a)
# Po rekurencyjnym wywołaniu funkcji, następuje zamiana między zm_a na wynik różnicy zm_b oraz zm_a, natomiast zm_b na zm_a

print(Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(1050, 420))
Algorytm Euklidesa: C++ - odejmowanie
// Algorytm Euklidesa z odejmowaniem w formie iteracyjnej

#include <iostream>
 
using namespace std;
 
int Iteracyjnie_AlgorytmEuklidesa_Odejmowanie (int zm_a, int zm_b) {
	while (zm_a != zm_) {
    	if (zm_a > zm_b)
        	zm_a -= zm_b;
    	else
        	zm_b -= zm_a;
	}
	return zm_a; // Zwracanie NWD
}


int main() {
	cout << Iteracyjnie_AlgorytmEuklidesa_Odejmowanie (1050, 420) << endl;
	return 0;
}
// Algorytm Euklidesa z odejmowaniem w formie rekurencyjnej

#include <iostream>
 
using namespace std;

int Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie (int zm_a, int zm_b) {
	if (zm_a == zm_b)
    	return zm_a;
	if (zm_a > zm_b)
    	return Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie (zm_a-zm_b, zm_b);
	return Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie (zm_b-zm_a, zm_a);
// Po rekurencyjnym wywołaniu funkcji, następuje zamiana między zm_a na wynik różnicy zm_b oraz zm_a, natomiast zm_b na zm_a
}

int main() {
	cout << Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie (1050, 420) << endl;
	return 0;
}
Algorytm Euklidesa: Java - odejmowanie
// Algorytm Euklidesa z odejmowaniem w formie iteracyjnej
    
public class Main {
	static int Iteracyjnie_AlgorytmEuklidesa_Odejmowanie(int zm_a, int zm_b) {
    	while (zm_a != zm_b) {
        	if (zm_a > zm_b)
            	zm_a -= zm_b;
        	else
            	zm_b -= zm_a;
         	}
    	return zm_a; // Zwracanie NWD
	}
    
	public static void main(String[] args) {
    	System.out.println(Iteracyjnie_AlgorytmEuklidesa_Odejmowanie(1050, 420));
	}
}
// Algorytm Euklidesa z odejmowaniem w formie rekurencyjnej
    
public class Main {
	static int Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(int zm_a, int zm_b) {
    	if (zm_a == zm_b)
        	return zm_a;
    	if (zm_a > zm_b)
        	return Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(zm_a - zm_b, zm_b);
    	return Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(zm_b - zm_a, zm_a);
    	// Po rekurencyjnym wywołaniu funkcji, następuje zamiana między zm_a na wynik różnicy zm_b oraz zm_a, natomiast zm_b na zm_a
	}
    
	public static void main(String[] args) {
    	System.out.println(Rekurencyjnie_AlgorytmEuklidesa_Odejmowanie(1050, 420));
	}
}

Jak obliczyć NWD: reszta z dzielenia

W przypadku obliczania NWD z resztą z dzielenia należy dzielić przez siebie dwie liczby (a i b), a uzyskaną resztę z dzielenia zamienia się z większą z wartości. W momencie, gdy reszta z dzielenia wynosi 0, a więc jedna z liczb (a lub b) jest równa 0, algorytm zostaje zakończony i uzyskuje się największy wspólny dzielnik (NWD), czyli tę liczbę, która jest większa od 0.

Przykład algorytmu Euklidesa: reszta z dzielenia

Algorytm Euklidesa wykorzystujący resztę z dzielenia jest wykorzystywany przy dużych liczbach, bo nawet w przypadku bardzo dużych wartości może wykonać cały proces w zaledwie kilku krokach.

Algorytm Euklidesa - Reszta z dzielenia
Algorytm Euklidesa z dzieleniem jest wydajniejszy niż metoda z odejmowaniem.

Zastosujemy algorytm Euklidesa wykorzystujący metodę reszty z dzielenia na liczbach 1050 oraz 420.
W tym przypadku 1050 to większa liczba, więc dzielimy ją przez 420 i obliczamy resztę:
1050 % 420 = 210
Uzyskany wynik zamieniamy z większą z liczb w parze.
Czyli teraz to: 420, 210

Wartość 420 jest większa od 210, dlatego ponownie obliczamy resztę:
420 % 210 = 0
Teraz mamy: 210, 0

Największym wspólnym dzielnikiem (NWD) liczb 1050 oraz 420 jest 210.

Warto zauważyć, że w tym przypadku zastosowano znak % jako mod lub modulo, czyli dzielenie, które zwraca jako wynik resztę z dzielenia.

Algorytm Euklidesa (NWD): schemat blokowy i pseudokod

Poniżej znajdziesz algorytm Euklidesa z resztą z dzielenia zapisany poprzez schemat blokowy i pseudokod. Z ich pomocą łatwiej zrozumiesz działanie algorytmu.

Algorytm Euklidesa - Schemat blokowy z dzieleniem
Ten rodzaj algorytmu Euklidesa eliminuje wielokrotne odejmowanie poprzez użycie reszty z dzielenia. 
funkcja AlgorytmEuklidesa_Dzielenie (zm_a, zm_b)
    dopóki zm_b ≠ 0 wykonuj
        pom ← zm_b
        zm_b ← zm_a mod zm_b
        zm_a ← pom
    zwróć zm_a i zakończ

Opis pseudokodu - algorytm Euklidesa z dzieleniem

Każdy z poniższych punktów oznacza kolejną linię w pseudokodzie.

  1. Zdefiniowanie funkcji o nazwie AlgorytmEuklidesa_Dzielenie przyjmującej dwie zmienne: zm_a i zm_b. Te zmienne reprezentują dwie liczby, dla których chcemy znaleźć największy wspólny dzielnik (NWD).
  2. Rozpoczęcie pętli, która działa, dopóki zm_b jest różne od zera. Pętla kończy się, gdy zm_b wynosi 0, co oznacza, że znaleziono NWD.
  3. Przypisanie wartości zm_b do zmiennej pomocniczej pom. Umożliwia to późniejszą zmianę wartości zm_b bez utraty jej pierwotnej wartości.
  4. Przypisanie do zm_b reszty z dzielenia zm_a przez zm_b. Oznacza to obliczenie kolejnej wartości w algorytmie Euklidesa.
  5. Przypisanie do zm_a wartości zapisanej wcześniej w zmiennej pomocniczej pom. Dzięki temu zm_a przyjmuje poprzednią wartość zm_b.
  6. Po zakończeniu pętli (gdy zm_b wynosi 0) algorytm zwraca wartość zm_a. Jest to największy wspólny dzielnik (NWD) liczb zm_a i zm_b.

Implementacje algorytmu Euklidesa: Python, C++ i Java

Poniżej znajdziesz implementację algorytmu Euklidesa wykorzystującą resztę z dzielenia w językach Python, C++ oraz Java. Do każdego z języków podano dwie formy implementacji: jedną utworzoną przy pomocy iteracji (pętli), a drugą przy pomocy rekurencji.

Algorytm Euklidesa: Python - reszta z dzielenia
# Algorytm Euklidesa z resztą z dzielenia w formie iteracyjnej
 
def Iteracyjnie_AlgorytmEuklidesa_Dzielenie(zm_a, zm_b):
	while zm_b != 0:
    	pom = zm_b
    	zm_b = zm_a % zm_b
    	zm_a = pom
	return zm_a  # Zwracanie NWD


print(Iteracyjnie_AlgorytmEuklidesa_Dzielenie(1050, 420))
# Algorytm Euklidesa z resztą z dzielenia w formie rekurencyjnej
 
def Rekurencyjnie_AlgorytmEuklidesa_Dzielenie(zm_a, zm_b):
	if zm_a == 0:
    	return zm_b
	return Rekurencyjnie_AlgorytmEuklidesa_Dzielenie(zm_b % zm_a, zm_a)  
	
# Po rekurencyjnym wywołaniu funkcji, następuje zamiana między zm_a na resztę z dzielenia zm_b % zm_a, natomiast zm_b na zm_a

print(Rekurencyjnie_AlgorytmEuklidesa_Dzielenie(1050, 420))
Algorytm Euklidesa: C++ - reszta z dzielenia
// Algorytm Euklidesa z resztą z dzielenia w formie iteracyjnej

#include <iostream>
 
using namespace std;
 
int Iteracyjnie_AlgorytmEuklidesa_Dzielenie (int zm_a, int zm_b) {
	while (zm_b != 0) {
    	int pom = zm_b;
    	zm_b = zm_a % zm_b;
    	zm_a = pom;
	}
	return zm_a; // Zwracanie NWD
}
 
int main() {
	cout << Iteracyjnie_AlgorytmEuklidesa_Dzielenie (1050, 420) << endl;
	return 0;
}
// Algorytm Euklidesa z resztą z dzielenia w formie rekurencyjnej

#include <iostream>
 
using namespace std;

int Rekurencyjnie_AlgorytmEuklidesa_Dzielenie (int zm_a, int zm_b) {
	if (zm_a == 0)
    	return zm_b;
	return Rekurencyjnie_AlgorytmEuklidesa_Dzielenie (zm_b % zm_a, zm_a);
    
	// Po rekurencyjnym wywołaniu funkcji, następuje zamiana między zm_a na resztę z dzielenia zm_b % zm_a, natomiast zm_b na zm_a
}
 
int main() {
	cout << Rekurencyjnie_AlgorytmEuklidesa_Dzielenie (1050, 420) << endl;
	return 0;
}
Algorytm Euklidesa: Java - reszta z dzielenia
// Algorytm Euklidesa z resztą z dzielenia w formie iteracyjnej

public class Main {

	static int Iteracyjnie_AlgorytmEuklidesa_Dzielenie(int zm_a, int zm_b) {
    	while (zm_b != 0) {
        	int pom = zm_b;
        	zm_b = zm_a % zm_b;
        	zm_a = pom;
    	}
    	return zm_a;  // Zwracanie NWD
	}
	public static void main(String[] args) {
    	System.out.println(Iteracyjnie_AlgorytmEuklidesa_Dzielenie(1050, 420));
	}
}
// Algorytm Euklidesa z resztą z dzielenia w formie rekurencyjnej
public class Main {
	static int Rekurencyjnie_AlgorytmEuklidesa_Dzielenie(int zm_a, int zm_b) {
    	if (zm_a == 0)
        	return zm_b;
    	return Rekurencyjnie_AlgorytmEuklidesa_Dzielenie(zm_b % zm_a, zm_a);
   	 
    	// Po rekurencyjnym wywołaniu funkcji, następuje zamiana między zm_a na resztę z dzielenia zm_b % zm_a, natomiast zm_b na zm_a
	}
	public static void main(String[] args) {
    	System.out.println(Rekurencyjnie_AlgorytmEuklidesa_Dzielenie(1050, 420));
	}
}

Optymalizacja: Algorytm Euklidesa

W przypadku systemu dwójkowego istnieje binarna implementacja algorytmu Euklidesa. Wykorzystuje się tam przesunięcia bitowe oraz AND, dzięki czemu to rozwiązanie okazuje się znacznie wydajniejsze od standardowych operacji arytmetycznych.

Natomiast jeśli w ramach programu wykorzystuje się kilka razy algorytm Euklidesa na tych samych liczbach, można śmiało zadbać o zapamiętanie wyników. Dzięki temu wypisuje się je potem ze zmiennej, zamiast ponownie wykonywać działania. Okazuje się to dużym usprawnieniem, szczególnie w przypadku wielkich programów.

Poza tym można zadbać o czytelność kodu, jeśli doda się na początku ustalanie wartości wejściowych jako wartości bezwzględnych, czyli bez znaku minusa. Dzięki temu nie trzeba w późniejszych fragmentach dodawać żadnych warunków (bo algorytm Euklidesa działa dla liczb dodatnich).

Zacznij przygotowania do matury z informatyki już dziś i zdobądź pewność siebie oraz wysokie wyniki!

Test - Podsumowanie artykułu

Najczęściej zadawane pytania o algorytm Euklidesa

Jak działa NWD? Największy wspólny dzielnik (NWD) dwóch liczb to największa liczba, która dzieli obie te liczby bez reszty. Aby znaleźć NWD, można wykorzystać algorytm Euklidesa, który w formie z odejmowaniem polega na uzyskiwaniu różnicy między parą liczb, a następnie na zastępowaniu większej uzyskanym wynikiem. Proces ten powtarza się aż do uzyskania zera zamiast jednej z liczb. Pozostała wartość większa od zera to największy wspólny dzielnik (NWD).
Do czego służy algorytm Euklidesa? Algorytm Euklidesa to metoda wyznaczania NWD dwóch liczb w sposób szybki i efektywny. Zamiast analizować wszystkie dzielniki obu liczb wykorzystuje odejmowanie lub resztę z dzielenia. Algorytm Euklidesa jest używany w:
  • matematyce – do rozkładu liczb na czynniki, upraszczania ułamków czy analizy liczb względnie pierwszych,
  • kryptografii – np. w algorytmie RSA, który opiera się na właściwościach NWD,
  • programowaniu i algorytmice – jako przykład wydajnego rozwiązywania problemów związanych z podzielnością.
Jak szybko znaleźć NWD? Najlepiej jest wykorzystać algorytm Euklidesa (dostępne są kalkulatory internetowe wykorzystujące to rozwiązanie). Istnieje on w dwóch wersjach - z odejmowaniem oraz z resztą z dzielenia. Minimalna liczba kroków jest otrzymywana w drugim przypadku, czyli przy wykorzystaniu reszty z dzielenia. Jest to więc najszybsza (najwydajniejsza) forma znajdowania największego wspólnego dzielnika (NWD).

Jak oceniasz ten artykuł?

Przykro nam 🙁 , że ten wpis nie był dla Ciebie wystarczająco przydatny!

Będziemy wdzięczni jeżeli napiszesz co moglibyśmy poprawić.

Najnowsze wpisy

Sortowanie przez wstawianie – co to jest, schemat blokowy oraz przykład zastosowania

Przeczytaj >>

Matura z informatyki 2026 - Odpowiedzi

Przeczytaj >>

Czy Olimpiada Informatyczna Juniorów (OIJ) jest trudna?

Przeczytaj >>

Technik informatyk - kwalifikacja INF.02 - Z czego składa się egzamin INF.02?

Przeczytaj >>

Algorytm Euklidesa - Co to jest algorytm NWD, jak go obliczyć i zaimplementować

Przeczytaj >>

JESTEŚ AMBITNY?

Dołącz do nas jeszcze dziś i rozwijaj się w swojej ulubionej dziedzinie we współpracy z nauczycielami, którzy są autorami artykułów na naszym blogu!
POZNAJ OFERTĘ KUrSÓW
© Ambitni Szkoła Informatyki 011111100101(2) | jesteś niemal gotowy!
crossmenu