1. Ce este CMMDC?
Divizorii lui 12: 1, 2, 3, 4, 6, 12
Divizorii lui 8: 1, 2, 4, 8
Divizori comuni: 1, 2, 4 → CMMDC = 4
CMMMC(a, b) = (a × b) / CMMDC(a, b)
Exemplu: CMMMC(4, 6) = (4 × 6) / CMMDC(4, 6) = 24 / 2 = 12
2. Euclid prin scaderi repetate
Proprietate matematica: CMMDC(a, b) = CMMDC(a − b, b) daca a > b.
Pas 0: a=48, b=18 (48 ≠ 18, continuam)
Pas 1: 48 > 18 → a = 48 − 18 = 30 a=30, b=18
Pas 2: 30 > 18 → a = 30 − 18 = 12 a=12, b=18
Pas 3: 12 < 18 → b = 18 − 12 = 6 a=12, b=6
Pas 4: 12 > 6 → a = 12 − 6 = 6 a=6, b=6
Pas 5: a == b → CMMDC = 6
Codul Python corespunzator:
# CMMDC prin scaderi repetate def cmmdc_scaderi(a, b): while a != b: if a > b: a = a - b else: b = b - a return a print("cmmdc_scaderi(48, 18) =", cmmdc_scaderi(48, 18)) print("cmmdc_scaderi(12, 8) =", cmmdc_scaderi(12, 8))
cmmdc_scaderi(48, 18) = 6 cmmdc_scaderi(12, 8) = 4
3. Euclid prin impartiri repetate (varianta clasica)
Proprietate matematica: CMMDC(a, b) = CMMDC(b, a mod b).
Pas 1: 48 = 18 × 2 + 12 → (a, b) = (18, 12)
Pas 2: 18 = 12 × 1 + 6 → (a, b) = (12, 6)
Pas 3: 12 = 6 × 2 + 0 → (a, b) = (6, 0)
b = 0 → CMMDC = 6 (valoarea lui a)
Codul Python corespunzator:
# CMMDC prin impartiri repetate def cmmdc_impartiri(a, b): while b != 0: a, b = b, a % b return a print("cmmdc_impartiri(48, 18) =", cmmdc_impartiri(48, 18)) print("cmmdc_impartiri(12, 8) =", cmmdc_impartiri(12, 8))
cmmdc_impartiri(48, 18) = 6 cmmdc_impartiri(12, 8) = 4
4. Calculul CMMMC folosind CMMDC
Atentie practica: In cod, impartim intai pe a la CMMDC, apoi inmultim cu b. Se evita astfel depasirea (overflow) pentru numere mari:
(a // cmmdc) * b.
# CMMMC folosind CMMDC def cmmdc(a, b): while b != 0: a, b = b, a % b return a def cmmmc(a, b): return (a // cmmdc(a, b)) * b print("cmmmc(4, 6) =", cmmmc(4, 6)) print("cmmmc(12, 8) =", cmmmc(12, 8))
cmmmc(4, 6) = 12 cmmmc(12, 8) = 24
CMMMC(4, 6): CMMDC(4,6)=2; (4×6)/2 = 24/2 = 12 ✓
CMMMC(12, 8): CMMDC(12,8)=4; (12×8)/4 = 96/4 = 24 ✓
5. Comparatie: scaderi vs. impartiri — complexitate
Impartiri repetate: O(log(min(a, b)))
Exemplu concret: a = 1 000 000 000, b = 1
• Scaderi: un miliard de pasi!
• Impartiri: un singur pas (1 000 000 000 mod 1 = 0, CMMDC = 1)
# Numaratoare pasi scaderi a, b = 100, 75 pasi = 0 while a != b: if a > b: a = a - b else: b = b - a pasi += 1 print("CMMDC =", a, ", pasi scaderi:", pasi)
CMMDC = 25 , pasi scaderi: 3
In acest caz avem doar 3 pasi, deoarece CMMDC(100,75)=25 este relativ mare. Cel mai rau caz apare la numere consecutive de Fibonacci: CMMDC(Fib(n+1), Fib(n)) necesita n pasi prin impartiri.
6. Varianta recursiva — Python & C++ EXCLUSIV INTENSIV
La profilul intensiv, algoritmul lui Euclid se implementeaza si recursiv. Subprogramele recursive sunt in programa clasei a X-a exclusiv pentru matematica-informatica si intensiv (Domeniu 3). Aceasta sectiune arata cum stiva de apeluri executa algoritmul.
Pasul recursiv: CMMDC(a, b) = CMMDC(b, a mod b)
Implementare Python:
# CMMDC recursiv (Python) def cmmdc_recursiv(a, b): if b == 0: return a # caz de baza return cmmdc_recursiv(b, a % b) # pas recursiv print("cmmdc_recursiv(48, 18) =", cmmdc_recursiv(48, 18)) print("cmmdc_recursiv(12, 8) =", cmmdc_recursiv(12, 8))
cmmdc_recursiv(48, 18) = 6 cmmdc_recursiv(12, 8) = 4
Acelasi algoritm in C++:
#include <iostream> using namespace std; int cmmdc_recursiv(int a, int b) { if (b == 0) return a; return cmmdc_recursiv(b, a % b); } int main() { cout << "cmmdc_recursiv(48, 18) = " << cmmdc_recursiv(48, 18) << endl; cout << "cmmdc_recursiv(12, 8) = " << cmmdc_recursiv(12, 8) << endl; return 0; }
cmmdc_recursiv(48, 18) = 6 cmmdc_recursiv(12, 8) = 4
cmmdc_recursiv(48, 18) → apeleaza
cmmdc_recursiv(18, 12) → apeleaza
cmmdc_recursiv(12, 6) → apeleaza
cmmdc_recursiv(6, 0) → returneaza 6
← 6 ← 6 ← 6 (raspuns propagat inapoi)