Combinari - Marius Nicoli

  • Upload
    andreea

  • View
    10

  • Download
    0

Embed Size (px)

DESCRIPTION

Combinari - Marius Nicoli

Citation preview

Modaliti de calcul pentru valoarea .

Valoarea reprezint numrul de modaliti de a construi submulimi cu K elemente alese dintr-o mulime cu N elemente. Nu este important ordinea elementelor ntr-o submulime. De exemplu, pentru N = 5 i K = 3, putem considera c mulimea din care alegem este format din elementele {1,2,3,4,5} i submulimile care se pot forma sunt {1,2,3}, {1,2,4}, {1,2,5}, {1,3,4}, {1,3,5}, {1,4,5}, {2,3,4}, {2,3,5}, {2,4,5}, {3,4,5}. Deci, Observm c, fr a fi piedut din soluii, le-am scris pe toate cu elemente n ordine cresctoare. Aceasta este i o strategie pe care o folosim n algoritmii care genereaz efectiv aceste submulimi.n acest articol nu ne propunem s generm soluiile ci s le numrm.

Formula de calcul este urmtoarea:

Ea poate fi implementat folosind operaii pe numere mari: nmulire ntre un numr mare i un numr mic, mprire a dou numere mari.Iat i cteva recurene:

Recuren este liniar. Aadar putem spune c avem complexitate O(N) pentru calcula aceast valoare. Practic, ntruct acest numere cresc foarte repede sunt necesare operaii cu numere mari (n acest caz, nmuliri i mpriri ntre un numr mare i un numr mic).

Dac avem de calculat valoarea combinrilor pentru mai multe perechi N, K putem folosi i urmtoarea recuren

Aceasta este cea care st la baza triunghiului lui Pascal. Considernd C ca fiind o matrice cu N linii i K coloane, un element al su se construiete nsumnd dou elemente de pe linia anterioar, cel de deasupra i cel aflat deasupra i o poziie mai n stnga. 012345

01

111

2121

31331

414641

515101051

Sunt o mulime de relaii ntre elementele triunghiului lui Pascal. Iat cteva:

elementul de pe linia i i coloana j reprezint valoarea elementele de pe linia N sunt coeficienii din dezvoltarea binomului (a+b)N suma elementelor de pe linia N este 2N.Folosind acest mod de calcul al combinrilor complexitatea n timp este de ordinul N^2. Este necesar doar operaia de adunare a dou numere mari.

De regul nu este nevoie de o matrice de memorie ci de 2 vectori (elementele de pe o linie se calculeaz doar n funcie de cele de pe linia anterioar). Memoria se poate reduce la un singur vector observnd c putem calcula elementele de pe o linie de la dreapta la stnga, adunnd la elementul curent elementul anterior.

Calculul combinrilor modulo P

n multe situaii, pentru evitarea lucrului cu numere mari, nu se cere valoarea final ci doar restul mpririi rezultatului la un numr dat P. Spunem c avem de calculat valoarea respectiv modulo P.Aritmetica modulo P este relativ simpl dac este sunt necesare operaii de adunare i nmulire modulo P. Astfel avem:

(A mod P+ B mod P) mod P = (A + B) mod P

(A mod P* B mod P) mod P = (A * B) mod P

Nu este valabil o relaie similar i pentru mprire (la calculul combinrilor modulo P, aplicnd formula, putem calcula modulo P factorialul de la numrtor i pe cele de la numitor dar apoi este nevoie i de mprire). nainte de a arta cteva rezultate matematice care permit calcularea n mod optim a combinrilor, iat o modalitate alternativ ce solicit noiuni elementare de algoritmic:Deci, trebuie calculat mod P. Cunoatem c valoarea combinrilor este un numr ntreg. Nu putem efectua calculele ntruct valoarea facorialelor crete foarte rapid i ar aprea depiri. Vom proceda n felul urmtor: Realizm descpmpunerea n factori primi pentru N!. Pentru aceasta ne folosim de urmtorul rezultat:

Numrul prim p apare n descomputerea n factori primi a lui N factorial de e ori unde

e = Astfel, vom constui un vector P cu numerele primemai mici dect N. Construim apoi un vector E astfel: E[i] = puterea la care apare P[i] n descompunerea n factpri primi a lui N. Valorile lui E le calculm aplicnd rezultatul anterior pentru fiecare valoare din P. De exemplu, pentru N = 10, obinem cei 2 vectori asociai descompunerii n factori primi ai lui N! astfel:P2357

E8421

Putem aplica procedeul anterior pentru K! i (N-K)! dar valorile calculate le scdem din elementele lui E. Pentru a obine rezultatul rmne doar s construim valoarea ce are descompunerea n factori primi memorat n elementele lui E. Sunt necesare doar operaii de nmulire modular care se realizeaz uor.Costurile utilizrii acestei metode sunt:

Calculul numerelor prime mai mici dect N, complexitate O(). Calculul vectorului E, complexitate aproximativ O(). Memorie necesar, de ordinul NMetodele mai eficiente se bazeaz ns pe realizarea mpririi modulare.

Se pune astfel urmtoarea problem: Avem A i B dou valori, ambele modulo P (adic cuprinse ntre 0 i P-1). Noi trebuie s calculm valoarea (A/B) modulo P. Cunoatem de la matematic faptul c o mprire este o nmulire cu inversul numitorului. n arirmetica modulo P inversul unei valori A modulo P se numete invers modularul lui A modulo P. Deci, pentru P dat, invers modularul unei valori A, modulo P, este o valoare notat A-1 aa nct:

A * A-1 = 1 (modulo P)Iat cteva exemple. Pentru P = 7

AA-1Explicaie

0Nu existNu putem vorbi despre 1/0

11(1 * 1) mod 7 = 1

24(2 * 4) mod 7 = 8 mod 7 = 1

35(3 * 5) mod 7 = 15 mod 7 = 1

42(4 * 2) mod 7 = 8 mod 7 = 1

53(5 * 3) mod 7 = 15 mod 7 = 1

66(6 * 6) mod 7 = 36 mod 7 = 1

Astfel: (3 / 2) modulo 7 = (3 * 4) modulo 7 = 5Exist cteva rezultate matematice foarte utile n algritmic atunci cnd este necesar calcularea invers modularului.

1. Teorema lui Euler.

Dac A i N sunt numere prime ntre ele atunci: = 1 (modulo N), unde se numete indicatorul lui Euler i reprezint numrul de valori mai mici dect N i prime ntre ele cu N. De exemplu, = 2, = 4.Pentru a calcula se utilizeaz urmtorul rezultat:

, unde sunt factorii primi din descompunerea n factori primi a lui N. Se observ c pentru a calcula aceast valoare modulo, putem mai nti s mprim pe N la factorii primi ai si i abia apoi s efectum operaiile modulo care sunt doar nmuliri (scderile cu 1 se trateaz ur).

Aadar, revenind la teorema lui Euler obinem: modulo N, adic este invers modularul lui A, modulo N. Pentru a calcula puterea sunt necesare doar operaii de nmulire modular. Se folosete exponenierea logaritmic.Costurile utilizrii acestei metode sunt:

Calcul indicatorul lui Euler, complexitate O()

Calcul , complexitate O(log N). Nu este necesar memorie suplimentar (calculm indicatorul lui Euler odat cu descompunerea numrului n factori primi).n multe cazuri, N este prim. Pentru a calcula invers modularul lui A n raport cu N ne folosim de rezultatele anterioare astfel (n primul rnd, dac A este un numr modulo N, se garanteaz ca A i N sunt prime ntre ele):

(toate numerele mai mici dect N sunt prime ntre ele cu N).

Astfel, invers modularul lui A n raport cu N este . Nu mai este necesar calcularea divizorilor ci doar exponenierea logaritmic.2. Algoritmul lui Euclid extins.

Modalitatea cea mai eficient de gsire a invers modularului necesit memorie logaritmic (pe stiv) i timp de rulare logaritmic. Se folosete Algoritmul lui Euclid extins.

S artm modul n care realizm acest lucru:

Pornim de la algoritmul lui Euclid, care calculeaz cel mai mare divizor comun pentru dou numere naturale A i B. Ne intereseaz varianta recursiv:int cmmdc (int a, int b) {

if (b == 0)

return a;

else

return cmmdc(b, a%b);

}

Cunoatem c acest algoritm are ordinul de complexitate logaritmic, n funcie de valorile a i b. Vom prezenta acum algoritmul lui Euclid extins. Acesta rezolv ecuaii de forma ax + by = cmmdc(a,b)Se poate demonstra c aceast ecuaie admite o infinitate de soluii. Demonstraia este constructiv i rezult din algoritmul lui Euclid extins. S notm d = cmmdc (a,b).

ntruct cmmdc(a,b) = cmmdc (b,a%b), avem:

Exist x, y, x0, y0 astfel nct:

ax + by = d

bx0 + (a%b) y0 = dAdic

ax + by = bx0 + (a%b) y0

dar a%b = a a/b*b

Deci, ax + by = bx0 + (a a/b*b) y0Notnd c = a/b, ecuaia devine:a(x-y0) = b(x0-cy0-y)

adic x = y0 i y = x0- cy0

Am exprimat astfel pe x i y n funcie de x0 i y0, soluiile ecuaiei de la pasul anterior al recurenei.

n algritmul lui Euclid, de la un autoapel la altul trecem de la o pereche a,b (cu soluiile x,y) la perechea b,a%b (cu soluia x0,y0). ntruct am artat c putem exprima pe x i y n funcie de x0 i y0, vom proceda astfel:

Transmitem funciei recursive, alturi de parametrii a i b i pe x i y (prin referin), soluiile ecuaiei ax+by = cmmdc(a,b)

Procedm astfel:

Pe ramura fr autoapel (cnd b = 0, cmmdc este a) ecuaia este ax = a. Aadar o soluie este x = 1 i y=0 (y poate fi orict). Deci pe aceast ramur, calculm astfel pe x i y.

Pe ramura cu autoapelul, pe revenire, avem n x0 i y0 valorile calculate pentru ecuaia din autoapel i folosim formulele deduse pentru a obine x i y.La terminarea funciei, x i y sunt soluiile ecuaiei iniiale.

void cmmdc (int a, int b, int &x, int &y) {

if (b == 0){

x = 1;

y = 0;

}else {

int x0, y0;

return cmmdc(b, a%b, x0, y0);

x = y0;

y = x0 a/b*y0;

}

}

Folosind Algoritmul lui Euclid extins vom arta cum calculm invers modularul unui numr A, modulo N, cu A i N prime ntre ele.

Deoarece cmmdc(A,N) = 1, exist x i y astfel nct Ax + Ny = 1, modulo N

ntruct Ny este divizibil cu N, avem Ny este egal cu 0 modulo N. Ecuaia devine Ax = 1, modulo N, adic x este invers modularul lui A n raport cu N. Rezolvnd deci ecuaia Ax + Ny = 1 cu algoritmul lui Euclid extins, gsim n x invers modularul lui A n raport cu N.

Prof. Marius Nicoli