Sunteți pe pagina 1din 6

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.

1
1
1
1
2
1
1
3
3
1
1
4
6
4
1
1
5
10
10
5
1
Sunt o mulime de relaii ntre elementele triunghiului lui Pascal. Iat cteva:

0
1
2
3
4
5

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:
P
2
3
5
7
E
8
4
2
1
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 N


Metodele 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
A
A-1
Explicaie
0
Nu
Nu putem vorbi despre
exist
1/0
1
1
(1 * 1) mod 7 = 1
2
4
(2 * 4) mod 7 = 8 mod 7
=1
3
5
(3 * 5) mod 7 = 15 mod
7=1
4
2
(4 * 2) mod 7 = 8 mod 7
=1
5
3
(5 * 3) mod 7 = 15 mod
7=1
6
6
(6 * 6) mod 7 = 36 mod
7=1
Astfel: (3 / 2) modulo 7 = (3 * 4) modulo 7 = 5
Exist 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,

Pentru a calcula

= 4.
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

Nu este necesar memorie suplimentar (calculm indicatorul lui Euler odat cu


descompunerea numrului n factori primi).

, complexitate O(log N).

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 = d
Adic
ax + by = bx0 + (a%b) y0
dar a%b = a a/b*b
Deci, ax + by = bx0 + (a a/b*b) y0
Notnd 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

S-ar putea să vă placă și