Sunteți pe pagina 1din 46

MINISTERUL EDUCA IEI AL REPUBLICII MOLDOV A

UNIVERSITATEA DE STA T DIN TIRASPOL


FACULTATEA FIZIC, MATEMATIC I TEHNOLOGII INFORMA IONALE
CATEDRA ALGEBR, GEO METRIE I TOPOLOGIE

Domeniul general de studiu:


tiine ale Educaiei

Specialitatea:
Matematic i Informatic

TEZ DE LICEN
Tema:

ELEMENTE DE TEORIE A DIVIZIBILITII


MODELATE NTR-UN SISTEM DE CALCUL ELECTRONIC

Autor:
studentul ciclului I, Dumitru Uzun

Conductor tiinific:
prof. univ., dr. conf. Valeriu Bordan

CHIINU, 2010
CUPRINS:
Introducere ..............................................................................................................................3
Capitolul I.TEOREMA DE BAZ A ARITMETICII.........................................................................8
Introducere ...........................................................................................................................8
I.1. Numr ntreg () noiunea matematic i cea a sistemelor de calcul.......................8
I.2. Numere sistematice. ntre valoare i reprezentare....................................................14
I.3. Numerele sistematice n sistemele de calcul electronice. .........................................18
I.4. Inele ale claselor de resturi dup modulul 2 n sau tipul INT n sistemele de calcul ....24
I.5. Noiunea de divizibilitate n . Teorema mpririi cu rest. .......................................27
Capitolul II. APLICAII N PROGRAMARE ...........................................................................29
II.1. Criterii de divizibilitate n baza 2.................................................................................29
II.2. Cel mai mare divizor comun i cel mai mic multiplu comun a dou numere ntregi. 33
II.3. Forma canonic a numerelor naturale (). ................................................................39
II.4. Descrierea aplicaiei PHP ............................................................................................40
CONCLUZII ..............................................................................................................................43
BIBLIOGRAFIE .........................................................................................................................45
ANEX ..............................................................................................................................46

Web App: http://duzun.teologie.net/math/

2
INTRODUCERE
Matematica n formele cele mai simple a aprut odat cu apariia omului (homo
sapiens = omul nelept), fr ns s existe tiina matematicii. La nceput oamenii
foloseau doar cteva numere naturale, care erau suficiente pentru rezolvarea
problemelor cu care se confruntau zi de zi (de ex., ci au plecat i ci s-au ntors de la
vntoare).
Descoperirea scrisului a constituit un salt enorm pentru dezvoltarea omenirii,
marcnd apariia civilizaiilor. Dar totodat scrisul a nsemnat i un salt pentru
matematic. n mod natural a aprut necesitatea sistemelor de numeraie pentru a
putea numra cantiti din ce n ce mai mari. A aprut posibilitatea nscrierii
numerelor, ceea ce permitea nu doar memorarea lor pe un suport material, fie nisip,
lut sau papirus, dar i operarea cu numerele n forma scris. Acest fapt a extins
posibilitile folosirii noiunii de numr i a matematicii de atunci n general.
Totui primele sisteme de numeraie operau cu o mulime finit de numere
naturale (de ex. numerele romane1). Adic exista o valoare maxim reprezentabil n
acel sistem, ceea ce nsemna c pe msur ce aprea necesitatea de a calcula cantiti
mai mari, trebuia de completat sistemul vechi de numeraie cu noi simboluri pentru
noi valori. Din acest motiv omenirea a fost n cutarea unui sistem de numeraie
universal, care s poat reprezenta orice valoare, orict de mare. Aa un sistem a fost
gsit sistemul poziional de numeraie2 de care ne folosim i astzi. Acest sistem, pe
lng faptul c poate reprezenta valori orict de mari, este convenabil i pentru
efectuarea operaiilor aritmetice cu numerele scrise, ceea ce aduce un automatism n
efectuarea calculelor, n sensul c avnd un set mic de reguli, poi efectua calcule cu
numere orict de mari folosind doar aceste reguli. Dar totui calculele sunt efectuate
de ctre om, care este o surs bun de erori. Odat cu dezvoltarea societii
(comerul, construciile, .a.), oamenii aveau nevoie de metode sau mijloace de calcul
care s permit efectuarea calculelor rapid i corect.

1Cifrele romane sunt: I=1, V=5, X=10, L=50, C=100, D=500, M=1000. Valoarea maxim n sistemului roman
este: MMMDCCCLXXXVIII = 3888
2 Se tie c nc babilonienii foloseau un sistem poziional de numeraie sexazecimal pentru calculele
calendaristice. ns sistemul lor avea un neajuns serios nu exista cifra zero, de aceea numerele 6 i 60 se scriau
la fel, valoare nelegndu-se din context.

3
Cu 4000 de ani n urm a aprut primul calculator numit abac. Iar n combinaie
cu sistemul poziional de numeraie, abacul a uurat cu mult utilizarea n calcule a
tabelelor de adunare i nmulire.
Datorit apariiei noiunii de logaritm, descoperit de ctre John Neper n 1617, a
fost posibil inventarea riglei de calcul de ctre matematicianul englez William
Oughtred n 1633, care permitea efectuarea operaiilor de nmulire i mprire cu
numere foarte mici sau foarte mari.
Primul calculator mecanic care efectua calcule aritmetice independent de agentul
uman a fost construit de ctre Blaisse Pascal n anul 1642. Calculatorul lui Pascal
folosea rotiele dinate pentru efectuarea adunrii i scderii. n 1671, Leibnitz a
construit un calculator mecanic care putea s efectueze i operaia de nmulire.
Matematica secolului XVII are pretenii mult mai mari dect calculul celor patru
operaii aritmetice. Din acest motiv, calculatorul lui Pascal i al lui Leibnitz n-au
rezolvat principalele dou probleme, cea a corectitudinii rezultatului i a timpului de
calcul, pentru c necesitau intervenia continu a agentului uman la fiecare pas al
calculului. Se simea nevoia automatizrii ntregului proces de calcul pentru diferite
probleme complexe, nu doar pentru efectuarea celor patru operaii aritmetice
(problem rezolvat de aceste dou exemple de calculatoare mecanice).
n 1801, Joseph Jacquard a dezvoltat primul rzboi de esut capabil s repete un
model n mod automat. Paii care trebuiau urmai n procesul de esut erau
determinai de modelul perforaiilor executate pe cartele de hrtie.
Inspirat de revoluia industrial de la sfritul secolului al XVII-lea i fiind
stpnit de ideea automatismului (n procesul de producie, i nu numai),
matematicianul i inginerul-inventator Charles Babbage n 1837 face prima descriere a
Motorului Analitic primul calculator digital mecanic de scop general care a anticipat
toate aspectele calculatoarelor moderne. Fiind ales n anul 1828 Profesorul Lucasian
de Matematic al Universitii Cambridge (aceeai funcie ocupat de Issac Newton),
Charles Babbage n 1839 prsete catedra pentru a se devota pe deplin crerii
Motorului Analitic. Dar moare n 1871 nainte de a finisa Motorul su. ns ideile lui au
marcat o nou er n istoria dezvoltrii omenirii era calculatoarelor.

4
n 1890, Herman Hollerith a folosit ideea reprezentrii informaiei sub forma
perforaiilor n cartele de hrtie i a realizat un calculator utilizat pentru nregistrarea
i prelucrarea datelor din recensmntul din SUA, care a durat astfel doar 3 ani.
Mainile electromagnetice i-au fcut apariia n anii 1920, astfel n aceast
perioad au fost perfecionate mainile cu cartele perforate.
n anul 1928 Taushek a descoperit principiul tamburului magnetic pentru
nregistrarea informaiei, principiu folosit i azi la calculatoarele PC 3, pentru memoria
extern cu dischete.
Profesorul Howard Aiken de la Universitatea Harvard mpreun cu specialitii
firmei IBM Corporation, n 1940 a construit prima main electromecanic complex de
calcul, numit Mark 1. Aceast main folosea relee electromagnetice controlate
electronic i folosea sistemul de introducere, stocare i prezentare a rezultatelor pe
cartele perforate.
Primul calculator integral electronic a fost creat la cererea armatei SUA in
perioada 1942-1945. La baza funcionrii lui st tehnologia lmpilor cu vid pentru
controlul circuitelor electrice.
n 1944 matematicianul John von Neumann a lansat ideea programului
nregistrat, pentru care o main de calcul trebuie s fie dotat cu un dispozitiv de
memorare a datelor i comenzilor, care trebuie s lucreze cu o vitez mare i trebuie s
permit nregistrarea simpl i rapid a informaiei. Astfel au aprut noiunile de
program de prelucrare a algoritmului de rezolvare a unei probleme, a secvenelor de
comenzi i memorare de date. Calculatoarele moderne din familia 80x86 (i nu numai)
folosesc structura propus de Neumann.
Corporaiei IBM i se datoreaz deschiderea pieei de calculatoare personale (PC -
IBM compatibile). Acest pas a marcat ptrunderea calculatoarelor n viaa oamenilor
de rnd.
Ca un fir rou prin istoria apariiei mainilor de calcul trece ideea automatizrii
procesului de calcul pentru economii de timp i obinerea rezultatelor corecte. Frumos

3Personal Computer Calculator Personal sau Microcalculator (are n calitate de Unitate Central de Procesare
un microprocesor)

5
a enunat aceast problem primul programator, contesa Ada Augusta, n notele sale
asupra mainii lui Babbage:
Acele munci care fac parte din diferite ramuri ale tiinelor matematice, dei la
prima vedere par a fi exclusiv din domeniul intelectului, pot totui s fie mprite n
dou seciuni distincte, dintre care una poate fi numit mecanic, pentru c
este supus unor legi precise i invariabile, care sunt capabile de a fi exprimate prin
intermediul operaiunilor cu materia, n timp ce cealalt, necesitnd intervenia
raionalului, ine n mod mai special de domeniul nelegerii. Admind acest lucru, am
putea propune s executm pe mijloace mecanice ramura mecanic a acestor munci,
rezervnd-o pentru intelectul pur pe cea care depinde de facultile raionalului. Astfel,
exactitatea rigid a acelor legi care reglementeaz calcule numerice trebuie adesea s
fi sugerat folosirea instrumentelor materiale, fie pentru a executa toate calculele de
acest fel sau doar pentru a le scurta (citat tradus din englez, sursa [3])
n zilele noastre exist aa un instrument calculatorul. Sub diferite forme i cu
diferite caracteristici, calculatoarele moderne l nsoesc pe om n aproape toate
activitile sale, nu doar n cercetare sau pentru a efectua calcule. Calculatoarele sunt
prezente n cele mai multe dispozitive electrice pe care le folosete omul (telefon
mobil, televizor, main de splat, automobil etc.). Indiferent de funciile ndeplinite
sau de structura fizic, toate calculatoarele moderne au un aspect comun ele pot fi
programate! Iar programele sunt scrise de oameni.
Dup cum a observat Ada Augusta, nu toate operaiile i concepiile mentale pot fi
efectuate de ctre calculator (programate). Un calculator idealizat este o main
Turing-complet, cu deosebirea c este limitat n memorie. Astfel, conform Conjecturii
Church-Turing, calculatorul poate rezolva orice problem bazat pe o procedur
algoritmic.
Calculatoarele electronice moderne sunt discrete, de aceea opereaz n mod
natural cu numere ntregi. Pentru a nelege mai bine modul n care un calculator
opereaz cu numerele i pentru a putea alctui algoritmi ct mai optimi, este absolut
indispensabil nelegerea implementrii numerelor sistematice n lumea
calculatoarelor electronice.

6
Mi-am propus s creez un sistem web extensibil care s permit vizitatorilor s
exploreze teoria mpririi cu rest i implementarea unor noiuni din aceast teorie n
sistemele de calcul, iar programatorilor s foloseasc i s extind acest sistem pentru
alte aplicaii. Sistemul const din dou pri mari importante:
1. bibliotecile de funcii i clase scrise n limbajul PHP;
2. aplicaia web care folosete aceste biblioteci prin funcii API 4.
Am ales limbajul PHP din urmtoarele motive: securitate, flexibilitate,
accesibilitate. Aplicaiile web sunt foarte uor de accesat, din orice sistem de operare
cu posibiliti de navigare web. Limbajul PHP este uor de nvat i de utilizat, iar
codul surs de pe server nu este accesibili vizitatorilor.
ns aplicaiile PHP sunt limitate n timp de execuie i memorie operativ
disponibil, de aceea bibliotecile trebuie s foloseasc la maxim instrumentele oferite
de limbaj pentru optimizarea algoritmilor. n acest scop se folosesc concepiile i
principiile descrise n lucrarea de fa.
Aceast lucrare reprezint un studiu al implementrii noiunilor teoriei mpririi
cu rest n sistemele de calcul din familia 80x86, care sunt cele mai rspndite n zilele
noastre. O deosebit atenie se acord noiunii de numr ntreg n sistemele de calcul i
a operaiilor cu aceste numere.

4 Application Programmable Interface Interfa Programabil de Aplicaie

7
CAPITOLUL I. TEOREMA DE BAZ A ARITMETICII

Introducere

n acest capitolul se studiaz concepiile de baz necesare pentru utilizarea


noiunii de numr ntreg n sistemele de calcul electronice i se prezint unele principii
folosite la crearea bibliotecilor de clase i funcii ale aplicaiei web menionate n
introducere. Fiecare concept nou este nsoit de exemple i descrieri. Dup caz, se
compar noiunea matematic cu cea a sistemelor de calcul, asemnrile i deosebirile
dintre acestea i specificul implementrii noiunii date pe calculator. Textul folosete
alternativ noiunile Unitatea Central de Procesare (UCP)5 i procesor, cifr binar i
bit6, cuvnt al procesorului i cuvnt, nelegndu-se aceeai noiune.

I.1. Numr ntreg () noiunea matematic i cea a sistemelor de calcul.

Mulimea numerelor ntregi este creaie a lui Dumnezeu,


iar restul matematicii este alctuit de oameni
Kroneker
Noiunea de numr, ca i majoritatea noiunilor n matematic, a aprut din
necesitile practice ale omului. Primele numere descoperite de om au fost cele
naturale, mai exact numerele: 1, 2, 3, (zero nc nu exista). n antichitate, grecii au
dat o interpretare i pentru numerele negative, motivnd necesitatea numerelor
ntregi i astfel extinznd mulimea numerelor cunoscute de ctre omenire.
La nceputul secolului XX, savantul i matematicianul Peano a axiomatizat
sistemul numerelor naturale, iar sistemul numerelor ntregi se obine ca o construcie
din elemente numere naturale (orice numr ntreg z poate fi scris ca diferena a dou
numere naturale u-v). Deci un numr ntreg reprezint o mbinare ntre numr i
algoritm.

5 Din eng. CPU Central Processing Unit. Este microprocesorul central n PC-uri care execut toate operaiile
aritmetice i logie. Conform Arhitecturii Von Newman, calculatorul trebuie sa aib o Unitate Central de
Procesare. Familia de calculatoare 80x86 folosete anume aceast arhitectur. Textul de fa folosete noiunea
de UCP referindu-se la familia de microprocesorul 80x86.
6Un bit este o cifr binar reprezentat de o celul de memorie care poate conine una din dou valori: 0 sau 1.
(eng. bit = binary digit)

8
n sistemele de calcul pentru reprezentarea unui numr se folosete o anumit
cantitate de memorie. Numerele pot fi reprezentate grafic, simbolic sau cantitativ.
Grafic poate fi reprezentat practic orice notaie folosit de ctre om, dar de
regul este destinat numai omului, calculatorul nefiind abil s opereze
cu coninutul semantic al acestor reprezentri.
Simbolic se poate reprezenta orice numr format din litere, cifre i alte simboluri
ASCII7, de ex. 256, 45, unsprezece, 2.56E+3 etc. Ca regul aceast
reprezentare se folosete pentru afiarea numerelor sau pentru citirea
de la consol8, dar nu i pentru operarea cu valoarea lor.
Cantitativ se pot reprezenta DOAR NUMERE NATURALE, n sensul c
reprezentarea numrului n baza 2 coincide cu secvena de bii din
memorie, fr nici o codificare sau transformare. De aceea voi numi
aceast reprezentare binar. Alte numere (precum cele ntregi sau reale)
sunt o combinaie dintre un algoritm i unul sau mai multe numere
naturale. De fapt toat memoria de n octei9 a unui calculator poate fi
privit ca un numr ntreg de 8n cifre binare.
Indiferent de modul cum interpretm numerele sau de felul cum sunt
reprezentate pe diferite dispozitive periferice, pentru UCP a unui calculator din familia
80x86 exist un singur fel de numere, i anume numere naturale binare cu o lungime
fixat. Un astfel de numr se numete cuvnt al procesorului (processor word) sau
simplu cuvnt. Un cuvnt al procesorului de lungimea n este un grup de n bii (sau
un numr din n cifre binare) care sunt procesai mpreun. De lungimea cuvntului
depinde arhitectura microprocesorului i multe aspecte de funcionare, de aceea
lungimea cuvntului se mai numete mrimea procesorului. Calculatoarele moderne
ca regul au UCP de 16, 32 sau 64 bii, dar se ntlnesc i alte mrimi.
Iat mulimea valorilor unui cuvnt de lungimea n: Nn={0, 1, 2, , 2n-1}.

7American Standard Codification for Information Interchange un tabel de 256 de simboluri codificate pe un
octet.
8 Sistem de dispozitive de intrare i de ieire (a datelor) conectat la un calculator.
9Un octet este o secven de opt bii consecutivi (de memorie). n familia de procesoare 80x86 este cantitatea
minim de informaie procesat ntr-o singur instruciune.

9
Cel mai mare numr binar format din n cifre este 2n-1. n tabelul de mai jos sunt
prezentate valorile maxime reprezentabile pe cuvntul procesorului de lungimea n:
n Binar Hexazecimal Zecimal
4 1111 F 15
8 11111111 FF 255
16 11111111 11111111 FF FF 65 535
32 11111111 11111111 11111111 11111111 FF FF FF FF 4 294 967 295
11111111 11111111 11111111 11111111 FF FF FF FF 18 446 744 073
64 11111111 11111111 11111111 11111111 FF FF FF FF 709 551 615

Aadar, orice operaie aritmetic (sau logic) efectuat de ctre microprocesor


este limitat la operanzi de valori nu mai mari dect cele specificate n tabelul de mai
sus (n funcie de lungimea cuvntului). Mai mult ca att, rezultatul operaiei la fel nu
trebuie s depeasc valoarea maxim reprezentabil pe cuvntul procesorului, n caz
contrar rezultatul fiind diferit de cel ateptat. S vedem cum UCP efectueaz operaiile
aritmetice de baz:
Adunarea: Vom considera cuvntul de opt bii (sau numere de maxim opt cifre
binare). Valoarea maxim coninut ntr-un cuvnt este 1111 11112 = 25510. Care va
fi rezultatul operaiei 255 + 1? Corect matematic ar fi 256 = 28, care este un numr
binar de nou cifre 1 0000 00002 i de aceea nu ncape n cuvntul procesorului
de capacitate opt bii. Din acest motiv ultima cifr care este 1 (n ordinea efecturii
operaiei de adunare) se ignor, rezultatul obinut fiind 0000 0000 (valoarea zero),
ceea ce ne ndreptete s scriem egalitatea: 255 + 1 = 0. Pentru a face distincie ntre
egalitatea matematic i egalitatea numerelor n calculator, pe ultima o voi nota prin
==, care este operatorul de comparaie n mai multe limbaje de programare precum
C, PHP, JS, .a. Astfel 255 + 1 == 0 i 255 + 1 = 256. Simbolul == la fel denot o
egalitate matematic a valorilor, ns se compar valorile care se conin n cuvntul
procesorului dat (sau variabila dat).
Cifra ignorat 1 se numete bitul de transport (carry bit), iar n situaia descris
mai sus operaia se numete cu transport. Uor se observ c la efectuarea operaiei de
adunare transportul poate fi doar 1 sau 0 (adic poate lipsi).
nmulirea i mprirea: O situaie similar este i n cazul operaiei de nmulire.
La nmulirea a dou numere de cte n cifre fiecare (indiferent de baza aleas) se poate

10
obine un numr de 2n cifre n aceeai baz. De aceea UCP folosete dou cuvinte
pentru reprezentarea rezultatului nmulirii a dou numere de lungimea cuvntului. La
fel pentru operaia de mprire folosete dou cuvinte: unul pentru ctul i altul
pentru restul mpririi. ns n limbajele de programare de nivel mediu i nalt este
accesibil doar un cuvnt din cele dou ale rezultatului operaiilor multiplicative. De
aceea pentru a obine ctul i restul mpririi se efectueaz operaia de mprire de
dou ori, pentru ct i rest cte o dat. Iar la nmulire cuvntul superior se ignor (de
ex., pe patru bii: 11112 11112 == 00012 sau 15 15 == 1).
Scderea: Scderea numerelor naturale nu este operaie algebric, deoarece
exist numere naturale diferena crora nu este un numr natural (a b < 0 a < b).
Calculatorul, ns, folosete o alt interpretare a noiunii de numr, astfel c scderea
este operaie algebric chiar i n mulimea numerelor naturale (ale cuvintelor
procesorului). Acest fapt se datoreaz modului de efectuare a operaiei de adunare,
scderea fiind operaia invers a adunrii. Conform definiiei operaiei de scdere care
se nva n coal, a b = c dac i numai dac c + b = a. Folosind exemplul de mai
sus, din egalitatea 255 + 1 == 0 obinem: 0 1 == 255, adic scznd un numr mai
mare din altul mai mic obinem un numr pozitiv, deci natural. Dac omitem
desczutul, obinem o egalitate stranie din punct de vedere matematic: 1 == 255.
Explicaia este simpl: cnd dintr-un numr mai mic se scade unul mai mare (de ex. 0
1), la numrul mai mic se adaug bitul de transport (care se ignor la operaia de
adunare), apoi se efectueaz scderea.
000000002 000000012 == 1 000000002 000000012 = 111111112
Se poate uor de verificat c mulimea numerelor naturale mpreun cu operaiile
de adunare i nmulire definite mai sus formeaz inel (c, unde c = 2n, n lungimea
cuvntului procesorului).
Dac considerm numerele ntregi ca o extindere a numerelor naturale pe baza
operaiei de scdere, putem identifica numerele naturale cu cele ntregi, i anume:
orice numr ntreg z poate fi scris ca diferena u v a dou numere naturale. Dar
pentru c diferena u v a dou cuvinte ale UCP la fel este un numr natural, apare
necesitatea definirii numerelor negative. Mulimea valorilor unui cuvnt este 2n. E
natural ca jumtate din aceste valori s reprezinte numere negative i jumtate

11
numere pozitive i zero. Putem construi mulimea de valori ntregi pentru o lungime
dat a cuvntului procesorului astfel:
Zn = {-2n-1, -2n-1+1, -2n-1+2, , -1, 0, 1, , 2n-1-1}.
De ex.:
N8 = {0, 1, 2, , 255},
Z8 = {-128, -127, , -1, 0, 1, , 127},
ord(N8) = ord(Z8) = 28 = 256.
Observm c ord(Nn) = ord(Zn) = 2n, adic Nn Zn.
Fie aplicaia : Nn Zn, definit astfel:
(x) = x, dac x < 2n-1 i (x) = x - 2n, dac x 2n-1;
-1(y) = y, dac y 0 i -1(y) = y + 2n, dac y < 0.
Funcia este izomorfism i reprezint legtura dintre valoarea unui numr
ntreg pe un cuvnt (valoarea totdeauna este numr natural) i interpretarea acesteia.
Mai sus am menionat c 1 == 255. Apare ntrebarea: Cum de identificat
numerele negative? Observam c toate numerele negative sunt mai mari sau egale cu
-2n-1, adic au bitul superior 1. Pentru numerele ntregi, prin convenie, dac bitul
superior este 1, numrul se consider negativ, altfel numrul se consider nenegativ.
S examinm reprezentarea binar a Z8:
Zecimal Binar Zecimal Binar
0 0000 0000 128 == -128 1000 0000
1 0000 0001 129 == -127 1000 0001

126 0111 1110 254 == -2 1111 1110
127 0111 1111 255 == -1 1111 1111

Observm c 0 == 0 i 2n-1 == 2n-1. De aceast proprietate se bucur doar


aceste dou valori.
Se poate demonstra c operaiile de adunare i scdere astfel definite pe cuvintele
procesorului nu depind de interpretarea valorii acestora (fie c numrul se consider
ntreg sau natural).
ns operaiile de nmulire i mprire se efectueaz diferit n funcie de
interpretarea valorilor. Astfel, daca se dorete nmulirea a dou numere naturale, se
alege o instruciune a UCP (n limbajul ASM este mul), iar dac se dorete nmulirea

12
acelorai valori, dar ca numere ntregi, se alege alt instruciune a UCP (imul).
Analogic pentru mprire (instruciunile div i idiv).
n limbajele de programare de nivel mediu sau nalt de alegerea operaiei
corespunztoare pentru numere ntregi sau naturale se ocup compilatorul 10 sau
interpretorul, n funcie de tipul de date al operanzilor. Deci tipul de date este o
construcie a limbajului respectiv, dar nu a UCP. Pentru UCP conteaz doar
dimensiunea datelor i instruciunea de efectuat, iar instruciunile simple (care se
execut la un singur tact al ceasului procesorului) se efectueaz doar asupra datelor de
dimensiuni nu mai mari dect mrimea procesorului.
Indiferent de instruciunea aleas pentru operaia multiplicativ, n limbajele de
nivel mediu i nalt, operaia se efectueaz conform descrierii de mai sus. i anume: la
nmulire, cuvntul superior al produsului se trunchiaz, iar la mprire rezultatul e
format din dou cuvinte unul pentru ct i altul pentru rest.
n baza acestor reguli se poate afirma c n sistemele de calcul moderne nu exist
numere naturale/ntregi autentice, dar exist clase de resturi dup modulul 2n, unde n
este lungimea cuvntului UCP.

10Un program special care transform codul surs scris ntr-un limbaj de programare accesibil omului n
cod-main.

13
I.2. Numere sistematice. ntre valoare i reprezentare.

Pentru ca omul s poat nelege i folosi o noiune abstract are nevoie de o


experien de interaciuni cu obiecte concrete din volumul noiunii date. Apoi, n baza
experienei, poate opera mintal cu noiunea abstract format/nvat prin
experien. De altfel aa au aprut majoritatea cuvintelor din orice limb, prin
abstractizarea unor obiecte des ntlnite n viaa cotidian. Spre exemplu, n limba
strmoilor notri existau noiunile mr, pr, nuc, ns nu exista noiunea copac,
care a aprut mai trziu.
Orice numr este o abstracie. Iar noiunea de numr este o abstracie i mai
mare. De aceea, pentru ca omul s nsueasc i s poat folosi numerele are nevoie de
o experien de interaciuni cu fiecare numr. Numerele mici se nsuesc foarte uor,
fiind cel mai des ntlnite n viaa de zi cu zi, ceea ce nu se poate spune despre
numerele mari. ns chiar dac omul nu poate percepe o valoare mare, totui el poate
efectua operaii concrete cu aceast valoare i o poate comunica i altor oameni ca
entitate de informaie. Omul nu ar putea opera cu numere mari fr un sistem de
numeraie, datorit naturii abstracte a acestora i a cantitii de numere existente.
Se poate spune c un sistem de numeraie este un set de reguli i de numere
cunoscute care permite reprezentarea sau/i efectuarea unor operaii cu o mulime
mai mare de numere, finit sau infinit. Numerele cunoscute se numesc cifre i de
regul numrul lor este foarte mic (cel puin una). Fiecare cifr, prin convenie, poate
fi reprezentat de un simbol (grafic, sonor, electronic etc.) n mod univoc. Operaiile
asupra cifrelor la fel trebuie s fie cunoscute/definite.
O trstur important a operaiilor asupra numerelor este faptul c operaiile nu
depind de sistemul de numeraie ales. Sistemul are grij de reprezentarea sub o
anumit form a numrului, dar nu atinge valoarea acestuia. De exemplu, doi plus doi
este patru n orice sistem de numeraie. ns n funcie de sistemul ales, putem defini i
regula de efectuare a operaiei date. Anume regula de efectuare a operaiei depinde de
sistemul ales, dar nu i rezultatul operaiei.
Cel mai rspndit sistem de numeraie din zilele noastre este sistemul poziional
de numeraie, n care valoarea fiecrei cifre este determinat de poziia acesteia n

14
numr. Cantitatea de cifre dintr-un sistem poziional de numeraie se numete baza
sistemului i este proprietatea caracteristic a sistemului poziional. Dat fiind natura
acestui sistem, baza trebuie s fie nu mai mic dect doi.
S notm baza sistemului poziional prin i setul de cifre prin = {0, 1, ,
1}. Atunci , se reprezint n baza astfel:
= an n
+ an-1 n-1
+ + a1 + a0, ai , i{0, 1, , n}. (1)
Vom numi an prima cifr a numrului , iar a0 ultima cifr. Numrul i este
poziia cifrei ai. Poziia n o vom numi poziia superioar, iar 0 poziia inferioar.
Dac notm = ( ), obinem o expresie de forma unui polinom peste , pe
care formal o putem nota astfel:
( )= an n
+ an-1 n-1
+ + a1 + a0, ai . (2)

Desigur ( )nu e polinom, deoarece nu e domeniu de integritate. Coeficienii


ai n baza sunt de aceeai natur cu necunoscuta , adic numere, ns ai< . Dup
cum am menionat mai sus, valoarea numrului nu depinde de baz, ns pentru a
desemna anumite proprieti ale numrului scris ntr-o anumit baz, vom nota
( ) = . Numrul scris n baza se numete numr sistematic. n mod obinuit,

numrul n baza se scrie astfel: (


anan-1a1a0) .
Exemplu: 3528 = (382 + 58 + 2)16 = (EA)16 = (1416 + 10)10 = 23410
Folosind un sistem poziional de numeraie, dac sunt definite operaiile de
adunare i nmulire a cifrelor (sunt date tabelele de adunare i de nmulire), poate fi
calculat suma i produsul oricror numere sistematice.
nc un avantaj important al numerelor sistematice este posibilitatea manipulrii
cifrelor numrului, folosirea criteriilor de divizibilitate specifice unei baze, definirea de
alte operaii asupra cifrelor distincte i aplicarea algoritmilor asupra numrului pe
baza cifrelor acestuia (de ex., nmulirea cu n se obine prin deplasarea cifrelor cu n
poziii la stnga).
Pentru a folosi avantajele numerelor sistematice n sistemele de calcul,
considerm urmtoarele principii:
Principiul 1 (recursivitatea reprezentrii): Deoarece cifrele la fel sunt numere,
acestea la fel pot fi scrise ntr-o anumit baz conform regulilor de mai sus i invers

15
orice numr sistematic scris n baza poate servi drept cifr pentru nscrierea altui
numr (mai mare) ntr-o anumit baz, respectnd restricia de nscriere < , unde
> n este noua baz, iar numrul este cifr n baza . Acest principiu poate fi
aplicat recursiv ori de cte ori dorim.
Noua baz poate deveni destul de mare i incomod la aplicarea n practic de
ctre om din cauza numrului mare de simboluri necesare pentru fiecare cifr.
Sistemele de calcul, ns, nu au nevoie de simboluri speciale pentru a opera cu
numerele sistematice i principiul recursiv de reprezentare a numrului n alt baz
poate fi aplicat cu succes.
n cazul cnd noua baz are forma x, fiecare grup de x cifre consecutive ale
formeaz o cifr a numrului x . De exemplu, pentru x = 4 i n = 4k+2 avem:
4 2 3 2 3 4
( ) = (a0+a1 +a2 +a3 ) + (a4+a5 +a6 +a7 ) + +
2 3 4 k-1 2 4 k
+ (an-6+an-5 +an-4 +an-3 )( ) + (an-2+an-1 +an )( )
Dac deschidem parantezele, obinem reprezentarea .
Este mai uor de operat cu asemenea numere, deoarece poziia cifrelor la diferite
operaii se calculeaz simplu.
Principiul 2 (pstrarea structurii): Dac numrul sistematic se obine n
rezultatul efecturii unei operaii i pe poziia i a numrului se obine un
numr ci (s zicem, din neatenia algoritmului), atunci din nscrierea numrului ci
n baza ultima cifr se plaseaz pe poziia i a , iar numrul format din restul
cifrelor ci se adun la cifra urmtoare ci+1, respectnd acest principiu i pentru poziia
i+1.
Regula aceasta este valabil pentru orice operaie n rezultatul creia pe o
anumit poziie se obin cifre mai mari sau egale cu baza. Astfel operaiile de adunare
i de nmulire a dou numere sistematice pot fi efectuate asemntor cu operaiile
omoloage pentru polinoame, aplicnd principiul de mai sus.
Prin analogie cu polinoamele, n nscrierea (2) a numrului sistematic vom
considera an 0 i notm grad( ) = n.

16
Iat cteva proprieti ale numerelor sistematice:
1. , , grad( )= m, grad( )= n, grad( + ) = k,
(k = max{m, n}) (k = max{m, n} + 1);
2. , , grad( )= m, grad( )= n, grad( ) = k,
k = m + n.
Proprietile de mai sus rezult direct din regulile de adunare i de nmulire a
dou numere sistematice.
Se cunosc mai multe reguli de conversie a numerelor sistematice dintr-o baz n
alta. Dac conversia este efectuat de ctre om, de regul se folosete baza zece ca
intermediar, dat fiind faptul c cei mai muli dintre oameni cunosc bine numerele
zecimale i operaiile aritmetice cu acestea. n general, ns, nu e nevoie de o baz
intermediar.
La esena conversiei bazei numerelor sistematice st relaia dintre cifrele
numrului n baza nou i nsi noua baz: ai` < `.
Cu ajutorul unor operaii de mprire succesive, se pot obine cifrele numrului
sistematic n baza nou. i anume, mprind numrului la baza nou `, obinem
ultima cifr a0` a numrului n baza `, iar ctul mpririi q1 = [ / `] reprezint
numrul n baza ` fr ultima cifr. Repetnd procedeul pentru numrul q1,
obinem a1` i q2, apoi a2` i q3, .a.m.d. n sfrit se obine qm+1 = 0 i reprezentarea
numrului ( `) = an` n` + an-1` n-1` + + a1` ` + a0`.
Observaie: Pentru conversia unei baze mai mare n alta mai mic, poate fi aplicat
principiul 2 de mai sus.

17
I.3. Numerele sistematice n sistemele de calcul electronice.

Sistemele de calcul electronice moderne folosesc impulsul electric pentru


codificarea informaiei. Din mai multe motive tehnice i tehnologice, informaia se
codific binar. Valoarea 1 corespunde impulsului electric, iar valoarea 0 corespunde
lipsei impulsului electric. Analogic se procedeaz la codificarea datelor memorate: o
celul de memorie se numete bit i poate avea dou stri nchis pentru 1 i deschis
pentru 0. De aceea sistemul de numeraie folosit de ctre astfel de sisteme de calcul
este cel binar.
Sistemul poziional de baza doi, pe lng faptul c este minim, mai are ceva
special fa de celelalte baze, i anume poate folosi ca cifre valorile booleene ADEV i
FALS, corespunztoare valorilor numerice 1 i 0, respectiv. Folosind avantajul
nscrierii poziionale a numerelor sistematice, putem aplica operaiile logice asupra
numerelor cifr cu cifr.
S considerm numerele = 15510 i = 13210 pe un cuvnt al procesorului de 8
bii. Vom efectua urmtoarele operaii logice asupra numerelor i cifr cu cifr (bit
cu bit): i (&), sau (|), sau exclusiv (^), negaia (~).
Notaia Valoarea binar Valoarea zecimal
1001 1011 155
1000 0100 132
& 1000 0000 128
| 1001 1111 159
^ 0001 1111 31
~ 0110 0100 100
~ 0111 1011 123

Operaiile bit cu bit au echivalente logice. Prin convenie (dar i regul a unor
limbaje de programare de tipul C, Modulo-2, PHP, .a.), n operaiile logice valoarea 0
se evalueaz FALS, iar orice valoare diferit de 0 se evalueaz ADEVR.

18
Operaii cu cifrele numerelor binare:
UCP a unui sistem de calcul electronic efectueaz operaii logice i aritmetice cu
numere binare de lungimea cuvntului procesorului. n afar de operaiile aritmetice,
UCP mai efectueaz i alte operaii de manipulare a datelor. ns nu toate instruciunile
procesorului sunt disponibile n limbajele de programare de nivel mediu sau nalt. n
afar de instruciunile enumerate mai sus, limbajele de programare de nivel mediu i
nalt mai implementeaz un tip de instruciuni pentru manipularea numerelor
sistematice n baza doi: deplasrile logice i aritmetice.
Deplasrile logice sunt de dou tipuri: la stnga i la dreapta. O deplasare la
stnga cu n poziii (binare) adaug la dreapta numrului n cifre de 0, iar primele n
cifre ale numrului (cifrele superioare) se trunchiaz, pstrndu-se astfel lungimea
cuvntului. Deplasarea logic la dreapta este analogic.
De exemplu, s deplasm numrul 21110 cu 3 poziii la stnga:
111010012 3 == 010010002
Deplasrile aritmetice sunt asemntoare cu cele logice, cu unica deosebire c
deplasarea aritmetic la dreapta pstreaz semnul numerelor ntregi, adic nu adaug
totdeauna cifra 0 la stnga numrului, ci bitul de semn, care poate fi 0 sau 1.
100010102 4 == 111110002, (118 4 = 3)10
011101102 4 == 000001112, ( 118 4 = 3)10
Observm c n deplasri la stnga sunt echivalente cu nmulirea numrului cu 2n,
iar n deplasri la dreapta cu mprirea la 2n. Din punct de vedere aritmetic,
deplasrile aritmetice se deosebesc de cele logice prin faptul c pstreaz semnul
numerelor negative i deci pot fi folosite pentru operaia de nmulire i mprire cu
2n, n conformitate cu reprezentarea numerelor negative.
Operaiile multiplicative aritmetice consum cele mai multe cicluri ale UCP din
familia de procesoare 80x86. n special operaia de mprire consum cel mai mult
timp al UCP. Deplasrile, ns, sunt dintre cele mai rapide instruciuni. Astfel, de fiecare
dat cnd este posibil, se recomand folosirea deplasrilor n locul operaiilor
multiplicative.
nmulirea cu ajutorul deplasrilor uor se efectueaz mai ales cnd avem
constante. De ex., pentru a nmuli un numr cu 10, procedm astfel:

19
10 = 2 + 23 = ( 1) + ( 3)
Chiar dac se efectueaz trei operaii n loc de o nmulire, totui acestea trei
mpreun (dou deplasri i o adunare) se execut mai repede ntr-un sistem din
familia 80x86.
Cu ajutorul operaiilor logice bit cu bit i a operaiilor de deplasare putem
manipula cifrele numrului sistematic n baza doi.

Citirea unei cifre binare din cuvnt:


n unele situaii este nevoie de citit o cifr a numrului binar, adic de determinat
dac cifra de pe poziia i este 0 sau 1. Cu acest scop se folosete un numr auxiliar m
numit masc i operaia & (i bit cu bit). Masca are pe poziia i cifra 1, iar restul
cifrelor egale cu 0.
01101101 01101101
00100000 & 00000010 &
00100000 00000000
TRUE FALSE

Masca m uor poate fi obinut aplicnd deplasarea la stnga. n concluzie, pentru a


obine cifra de pe poziia n a numrului , procedm astfel: & (1 n).

Scrierea unei cifre binare n cuvnt:

1. Dac se dorete scrierea cifrei 0 pe o anumit poziie a numrului binar, se


poate folosi acelai procedeu ca i la citirea unui bit, ns n acest caz masca are toi
biii 1, cu excepia bitului de pe poziia unde se scrie 0:
01101101 01101101
11011111 & 11111101 &
01001101 01101101
Masca poate fi obinut printr-o deplasare i o negaie:
~(1 5) == ~00100000 == 11011111

2. Scrierea cifrei 1 pe o poziie dorit a numrului binar se face cu ajutorul


operaiei | (sau bit cu bit):
01101101
00010000 |
01111101

20
3. Algoritmul ce urmeaz scrie o cifr arbitrar b pe o poziie arbitrar n a
numrului binar 2:
& ~(1 n); // scriem 0 pe poziia n
^ (b n); // scriem b pe poziia n. 0 ^ b == b

Obinerea unei secvene de cifre binare consecutive:


Deseori este nevoie de obinut un numr cu o secven de bii 0 sau 1 consecutivi
de o lungime dat, pe o poziie dat. Dac avem o secven de bii 1, prin negaie se
obine aceeai secven de bii 0 (~00111000 = 11000111). Deci e suficient s gsim
un algoritm pentru generarea unei secvene de n cifre consecutive de 1.
Observm c (2n1)10 = (2n-1+2n-2+2n-3++4+2+1)10 = 1111112, iar
2n = 1 n. De aici avem algoritmul de generare a numrului format din n cifre de 1:
(1 n) 1.
Dac e specificat poziia p pe care se dorete de obinut secvena, se aplic
aceste instruciuni: ((1n)-1) p.

Proprieti ale negaiei bit cu bit:


1. ~0 == 1
Ex. pe 8 bii: ~00000000 = 11111111 = 1 00000000 1 = -1
2. ~ == ~0
Ex. pe 8 bii: ~10101011 = 11111111 - 10101011 = 01010100
3. ~( + ) == ~ + ~ + 1
ntr-adevr: ~(+) == (~0--)+(11) == ~0- + ~0- + 1
4. ~( ) == (~)(~) .

n baza celor expuse mai sus, se poate spune c pentru operaii cu numere ntr-un
sistem de calcul electronic cel mai convenabil este s considerm numerele n
sistemul binar de numeraie. ns sistemul binar este incomod pentru om, nscrierea
numerelor n aceast baz fiind prea lung. Iar conversia din baza doi n baza zece
ascunde structura numrului binar. De aceea programatorii cel mai des folosesc
numere sistematice n baze puteri ale lui doi, cu ar fi 8 sau 16. Aceste numere se

21
bucur de proprietile reprezentrii recursive a numerelor sistematice de forma 2n
(8 = 23, 16 = 24).
Astfel se obin numere ntr-o baz apropiat de cea familiar nou (10), dar din
care uor se vede structura numrului bina pe care l reprezint, i anume: n baza 8
fiecare grup de trei cifre binare consecutive formeaz o cifr octal, iar n baza 16
fiecare grup de patru cifre binare constituie reprezint o cifr hexazecimal.
Prezentm tabelul de conversie din baza 2 n baza 8 i 16:
Binar Octal Binar Hexazecimal Zecimal
000 0 0000 0 0
001 1 0001 1 1
010 2 0010 2 2
011 3 0011 3 3
100 4 0100 4 4
101 5 0101 5 5
110 6 0110 6 6
111 7 0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15
Exemplu de conversie:
011011012 = 01_101_1012 = 1558
011011012 = 0110_11012 = 6D16

Cu ajutorul acestor tabele conversia se efectueaz fr calcule aritmetice. Se fac


doar nite manipulri cu nscrierea sistematic a numrului. Deoarece tabelele conin
cte un set mic de cifre (8 i 16, respectiv), sunt uor de memorizat (la fel cum am
memorizat cndva cifrele zecimale).
Nu numai pentru om este comod reprezentarea numerelor binare n baze de
forma 2n. Procesoarele din familia 80x86 implementeaz un ir de instruciuni pentru
manipularea cifrelor binare (mai sus au fost expuse cele de baz). Cea mai mic unitate
de informaie pe care o poate prelucra ntr-o instruciune un astfel de procesor este
octetul opt bii consecutivi, care conin un numr binar de opt cifre. Un octet poate fi

22
afiat la consol folosind exact dou cifre hexazecimale: 0110_1101 6D. Astfel,
pentru a obine reprezentarea unui numr binar de k octei n baza 16 (e valabil 2n),
se fac 2k conversii consecutive, separate. Deci algoritmul are complexitate liniar.
Conversia din baza 16 n 2 se face analogic.
Desigur, pot fi utilizate i alte reprezentri, cum ar fi cea zecimal, care ne este
mult mai familiar. ns conversia n alte baze necesit calcule aritmetice, ceea ce
consum timp de execuie a UCP. Conversia unui numr binar ntr-o baz arbitrar cu
ajutorul operaiilor aritmetice se face prin mprirea numrului la noua baza pn
numrul devine zero. Dac numrul are o lungime mai mare dect lungimea cuvntului
procesorului, la fiecare mprire se efectueaz un numr de operaii direct
proporional cu lungimea numrului. Astfel de algoritm are o complexitate ptratic.
Conversia n sens opus se efectueaz n mod analogic, fiind de aceeai complexitate.
Indiferent de natura operaiilor efectuate cu numerele n sistemele de calcul
electronice, folosind proprietile numerelor binare putem alctui algoritmi optimi. De
multe ori, n condiii concrete, deosebirea ntre alegerea algoritmului optim sau unuia
neoptim este echivalent cu posibilitatea sau imposibilitatea realizrii sarcinii.

23
I.4. Inele ale claselor de resturi dup modulul 2n sau tipul INT n sistemele de calcul

n paragraful I.1 am artat c n sistemele de calcul electronice moderne nu exist


numere autentice, dar exist clase de resturi dup modulul 2n, unde n este mrimea
procesorului. La fel am artat c adunarea i nmulirea cuvintelor procesorului ca
numere naturale coincid cu adunarea i nmulirea claselor de resturi dup modulul 2n.
Aadar mulimea valorilor cuvntului unui procesor mpreun cu operaiile de
adunare i nmulire a cuvintelor formeaz inelul claselor de resturi dup modulul 2n
(c, unde c = 2n). Legtura dintre numerele ntregi ntr-un sistem de clacul i clasele de
resturi dup un modul ne permite s operm cu structura algebric cunoscut de inel
al claselor de resturi pentru a studia proprietile numerelor i a operaiilor UCP.
Direct din aceast legtur rezult urmtoarele aspecte:
1. att timp ct operanzii i rezultatul operaiei sunt mai mici dect modulul,
rezultatul obinut este acelai ca i pentru numere n matematic. n caz
contrar, rezultatul obinut este un reprezentant al aceleiai clase de resturi,
ns mai mic ca modulul;
2. deoarece o clas de resturi conine o infinitate de elemente, inclusiv numere
negative, unele clase de resturi reprezentate de valori pozitive pot fi
considerate negative.
Dup cum tim, n calculator exist doar valori numere naturale, celelalte numere
fiind o mbinare ntre careva numere naturale i careva algoritmi. Dac privim
numerele ntregi dintr-un sistem de calcul cu UCP de mrimea n ca clase de resturi
dup modulul 2n, n baza proprietilor claselor de resturi uor putem explica din
punct de vedere matematic operaiile cu numerele ntregi i reprezentarea lor ca valori
numere naturale n memorie.
Egalitatea valorilor a dou cuvinte ale procesorului se identific cu congruena
dup modul a numerelor ntregi sau naturale corespunztoare acestor valori. De
exemplu, pe un procesor de 8 bii, egalitatea 255 == 1 se explic prin congruena
255 1 (256), unde 256 = 28. n acest exemplu ambele cuvinte conin aceeai
valoare 255, ns sunt interpretate diferit: prima ca numr natural (255), iar a doua ca
numr ntreg (-1).

24
Pentru simplitate voi omite modulul n notaia congruenelor dup modulul 2n,
corespunztor mrimii procesorului n.
S deducem regula de obinere a opusului unui numr ntreg:
1 2n1
Numerele sistematice de forma ( n1) sunt formate din n cifre cu valoarea (
1). Pentru = 2, acest numr este format din n cifre de 1, adic pentru n cifre binare
avem: 2n1 = ~0. Astfel 1 == ~0 pentru orice lungime a cuvntului procesorului.
Folosind aceast proprietate i proprietatea negaiei ~ == ~0 , avem:
= 1 - 1 - ~0 + 1 ~ + 1.
Am obinut ~ + 1.
Daca considerm o cifr a unui numr destul de mare, n baza principiului
recursivitii reprezentrii numerelor sistematice, relaia de mai sus poate fi folosit
pentru a obine opusul unui numr orict de mare.
n multe limbajele de programare procedurale exist mai multe tipuri de date
pentru numerele ntregi i naturale, ele deosebindu-se doar prin mrime. De exemplu,
n limbajul C++ exist tipuri de date pentru numere ntregi i naturale de 8, 16, 32 i
64 de bii. n ordinea enumerat, tipurile de date pentru numerele ntregi sunt:
signed char, short, long, long long.
Din punct de vedere matematic, fiecare din aceste tipuri de date reprezint cte
un inel al claselor de resturi dup modulul 256, 65536, 4294967295, i
18446744073709551615, respectiv. Ceea ce nseamn c variabilele de aceste tipuri
pot opera cu valori nu mai mari dect modulul corespunztor tipului variabilei.
Dac n unele limbaje nu sunt disponibile toate aceste tipuri de date, cele mai
multe limbaje procedurale au cel puin tipul INT, care are mrimea procesorului i
reprezint un cuvnt al acestuia interpretat ca numr ntreg. Astfel, pentru a opera cu
numere i mai mari dect cele disponibile ntr-un limbaj sau altul, pot fi compui
algoritmi care folosesc principiile de reprezentare a numerelor sistematice. n calitate
de cifre se pot considera grupri a cte n bii, astfel ca n s nu fie mai mare dect
jumtate din lungimea cuvntului procesorului, ca s nu se piard din valoare n
rezultatul efecturii operaiilor aritmetice. De exemplu, fiecare octet poate fi
considerat ca cifr. Pentru UCP sunt cunoscute toate operaiile aritmetice pentru

25
cifrele-octei. Dac se cunosc operaiile aritmetice cu cifrele, aceste operaii pot fi
extinse i asupra numerelor sistematice care folosesc aceste cifre. Mrimea numerelor
astfel obinute poate fi una fixat/static sau poate fi flexibil/dinamic.

26
I.5. Noiunea de divizibilitate n . Teorema mpririi cu rest.

Noiunea de divizibilitate se definete prin noiunea de nmulire. n sistemele de


calcul electronice, ns, pentru a verifica divizibilitatea numerelor se aplic un criteriu
de divizibilitate (de regul n baza doi), iar n caz general se compar cu zero restul
mpririi. Deci la verificarea divizibilitii a dou numere se utilizeaz operaia de
mprire, pe care UCP o efectueaz puin diferit pentru numerele ntregi fa de
convenia matematic.
Pentru calcularea ctului i restului mpririi, UCP execut o singur
instruciune, ns voi nota aceast instruciune prin dou simboluri: / se va referi la
ct i simbolul % la rest (n conformitate cu notaia din limbajul C).
Conform Teoremei mpririi cu Rest, restul totdeauna este nenegativ:
a, b , b 0, !q , !r , r < |b|: a = qb + r
Pentru a respecta teorema suntem nevoii s avem dou reguli diferite pentru
mprire una pentru numere naturale i una pentru numere ntregi.
mprirea numerelor naturale se consider definit:
a, b , q = a / b, r = a % b: q, r .
Pe baza mpririi numerelor naturale, se definete mprirea numerelor ntregi:
Dac a < 0 i b < 0, atunci q = |a| / |b|, r = |a| % |b|.
Dac a > 0 i b < 0, atunci q = (|a| / |b|), r = |a| % |b|.
Dac a < 0 i b > 0, atunci avem dou cazuri:
1: |a| % |b| = 0 q = (|a| / |b|), r = 0;
2: |a| % |b| 0 q = (|a| / |b| + 1), r = b |a| % |b|.
n celelalte cazuri a i b coincid cu numere naturale, la fel i operaia de mprire
asupra lor.
Regula de mprire a numerelor ntregi pare a fi complicat, ns garanteaz c
restul niciodat nu e negativ. Unde ceva se ctig, altceva se pierde
UCP la fel are dou instruciuni diferite pentru operaia de mprire una pentru
numere naturale i alta pentru numere ntregi ns deosebirea ntre acestea este n
interpretarea valorii, nu n regula operaiei. Iar regula e una, i anume: instruciunea
de mprirea a numerelor nenegative coincide cu mprirea numerelor naturale. Iar

27
dac unul din operanzi este negativ, valoarea absolut a ctului i a restului se
calculeaz la fel ca i pentru numerele pozitive, iar semnele se aleg conform egalitilor
de mai jos:
Fie a, b, q, r : a = qb + r.
a / b = q, a % b = r;
(a) / (b) = q, (a) % (b) = r;
(a) / b = q, (a) % b = r;
a / (b) = q, a % (b) = r;

Tabelele de repartizare a semnelor pentru ctul i restul mpririi UCP:


Ctul Restul
b b
a/b + a%b +
+ + + + +
a a
+

n baza celor expuse mai sus, se poate de formulat teorema mpririi cu rest
pentru sistemele de calcul electronice:
a, b , b 0, !q, r , |r|<|b|, abq0, ar0: a= qb + r.
Aceast teorem permite restului s fie negativ. ns cazul cnd restul este nul
coincide pentru ambele teoreme (a = qb). Astfel noiunea de divizibilitate pentru
sistemele de calcul coincide cu cea matematic.
Pentru utilizarea n practic, instruciunea de mprire a UCP este mai
convenabil dect operaia matematic de mprire. Cred c anume din acest motiv
designer-ii microprocesoarelor au ales anume acest mod de efectuare a mpririi.

28
CAPITOLUL II. APLICAII N PROGRAMARE

II.1. Criterii de divizibilitate n baza 2

n coal, dup nsuirea noiunii de divizibilitate, se nva unele criterii de


divizibilitate pentru unele numere mici. Aceste criterii se bazeaz pe nscrierea
sistematic a numerelor n baza zece (opereaz cu cifrele zecimale), deci pot fi aplicate
doar n aceast baz. Ele sunt bune pentru oameni, care folosesc sistemul zecimal de
numeraie, ns sunt absolut inutile pentru calculatoarele binare.
Calculatoarele moderne (familia 80x86) folosesc sistemul binar de numeraie
pentru reprezentarea numerelor naturale i ntregi n memorie, astfel pot folosi criterii
de divizibilitate a numerelor n baza doi i alte avantaje ale reprezentrii binare a
numerelor.
Pentru ce oamenii folosesc criterii de divizibilitate? Oare nu este mai simplu s
mprim un numr la altul i s aflm restul dect s inem minte attea criterii? Nu.
Desigur cu ajutorul mpririi putem verifica dac orice dou numere sunt divizibile,
ns pentru numere mari este mai greu de efectuat mprirea dect de aplicat un
criteriu (dac e posibil).
Analogic este situaia i n lumea calculatoarelor: dintre toate instruciunile
aritmetice (i nu numai) ale UCP din familia 80x86, mprirea se execut cel mai lent.
De aceea sunt binevenite unele criterii de divizibilitate n sistemul binar care permit
evitarea mpririi.

a. Criteriul de divizibilitate cu 2:
Analogic cu criteriul de divizibilitate cu 10 n baza 10 este criteriul de
divizibilitate cu 2 n baza 2 (i pentru orice baz), adic ultima cifr trebuie s fie 0.
Acest criteriu rezult din reprezentarea numerelor sistematice. Ultimul bit al
numrului poate fi verificat astfel:
( & 1 == 0) sau ( 1 1 == ). (3)

Prima expresie verific ultima cifr aplicnd masca 1 i este preferabil pentru
performan. A doua expresie anuleaz ultima cifr a numrului apoi compar
numrul obinut cu iniial i dac sunt egale, ultima cifr e zero. S observm c

29
( & 1 == % 2) i ( 1 1 == [ / 2] * 2 = % 2). Adic
egalitatea a doua din (3) este echivalent cu prima.

b. Criteriul de divizibilitate cu 2k:


Criteriul de divizibilitate cu 2 poate fi extins i pentru 2k foarte simplu, i anume:
urmtoarele expresii sunt criterii de divizibilitate cu 2 k:
( & (2k-1) == 0) sau ( k k == ). (4)

Din nscrierea sistematic n baza 2 se observ uor c:


( & (2k-1) == % 2k) i ( k k == [ / 2k] * 2k).
n mod natural apar urmtoarele ntrebri: avnd un numr dat , cum de
verificat dac = 2k i cum de aflat k = log2 fr a apela funcia logaritm?
S comparm reprezentarea binar a numerelor = 25 i 1:
25 = 001000002,
251 = 000111112.
Dac aplicm conjuncia bit cu bit, n rezultat obinem: & ( 1) == 0.
Aceast egalitate are loc numai pentru numerele de forma = 2k, n baza egalitii:
2k1 = 2k-1 + 2k-2 + 2k-3 + + 2 + 1.
Dac notm cu 02s termenii nuli din = 2k, obinem:
& ( 1) = (12k + 02k-1 + 02k-2 + 02k-3 + + 02 + 01) &
& (02k + 12k-1 + 12k-2 + 12k-3 + + 12 + 11) =
= (1&0)2k+(0&1)2k-1+(0&1)2k-2+ +(0&1)2 + (0&1)1 = 0.
Pe fiecare poziie se obine conjuncia (1&0). Dac ar avea alt form, neaprat
s-ar obine pe careva poziii i conjuncia (1&1), iar expresia de mai sus ar fi diferit
de 0.
Observm c 0 == 2n, pentru n lungimea cuvntului procesorului (sau mrimea
n bii a tipului de date INT). De aceea 0 & (01) = 0. De fapt 0 & x = 0, x ,
ns n contextul divizibilitii acest caz trebuie examinat aparte.
Astfel am rspuns la prima ntrebare:
== 2k & ( 1) == 0. (5)

S presupunem c = 2k i s gsim un algoritm pentru calcularea k = log2


fr ajutorul funciei log.

30
Calcularea k se reduce la determinarea poziiei bitului 1 n numr, care poate fi
calculat cu ajutorul mtilor i a deplasrilor. Fie $b == 2k numrul cercetat.
$m = 1; // masca
$k = 0; // numrtorul poziiilor binare
while($b & $m == 0) {
$m = $m << 1; // trecem la urmtoarea poziie
$k++; // incrementm poziia
}
La sfritul ciclului while, $k conine valoarea cutat. Observm c pentru
$b == 0, se obine un ciclu infinit. Acest caz trebuie prelucrat cu o condiie
suplimentar.
Algoritmul de mai sus poate fi scris i ntr-o form mai concis:
for($k=1; $b; $b>>=1, $k++); (6)

Aceast form modific variabila iniial $b, ceea ce nu reprezint o problem n


cazul cnd codul de mai sus apare n corpul unei funcii. n schimb se prelucreaz i
cazul $b == 0 $k == 1, ceea ce este destul de convenabil. Apare ns o alt
problem: pentru unica valoare $b == 2n-1, pentru care $b == $b, se obine un
ciclu infinit. Numrul n este lungimea cuvntului procesorului. Problema const n
faptul c n PHP deplasrile sunt aritmetice i dac $b < 0, atunci ($b VAL) < 0,
pentru orice numr de deplasri VAL. Cazul este unic i n general se prelucreaz cu
condiia suplimentar la nceput: if($b<0) $k = NR_BIT_IN_INT; else
n practica de programare aceste criterii au o larg ntrebuinare. De exemplu, al
doilea criteriu poate fi aplicat n programarea dinamic pentru extinderea dinamic a
memoriei alocate pentru o list de elemente de lungime arbitrar. n urma unor
cercetri costisitoare ale Microsoft, s-a constatat c pentru extinderea dinamic a
memoriei alocate pentru un obiect/tablou cnd numrul de elemente crete liniar este
cel mai eficient de realocat 160% din memoria curent alocat pentru acest obiect. Astfel
bibliotecile standard din diferite medii de programare folosesc aceste rezultate pentru
dirijarea procesului de alocare dinamic de memorie folosind dou variabile diferite
asociate fiecrui obiect cu alocare dinamic de memorie pentru un numr arbitrar de
elemente: una pentru numrul de elemente i alta pentru capacitatea alocat. Cnd

31
numrul de elemente se apropie de capacitatea alocat, algoritmul mrete capacitatea
obiectului cu factorul 1,6.
Exist o soluie mai simpl pentru problema realocrii dinamice de memorie
pentru un numr arbitrar de elemente. S-ar putea de gsit un algoritm de calculare a
urmtoarei valori a capacitii n funcie de numrul de elemente, fr necesitatea de a
pstra o variabil destinat monitorizrii capacitii. Algoritmul trebuie s fie foarte
simplu i rapid. Pentru simplitate, n calitate de factor se ia numrul 2, care este
aproximativ egal cu 1,6. Astfel capacitatea obiectului totdeauna reprezint o putere a
lui 2 (0, 1, 2, 4, 8, 16, ) i la fiecare realocare de memorie capacitatea pur i simplu se
dubleaz. Rmne de verificat cnd este nevoie de mrit capacitate. Aici vin n ajutor
algoritmii descrii la criteriul de divizibilitate cu 2 k. Dac numrul de elemente n crete
cu o unitate la fiecare pas, n va trece prin toate valorile de forma 2k, consecutiv. Cnd
n = 2k (se depisteaz cu ajutorul (5)), capacitatea se dubleaz (2n) i problema este
rezolvat simplu i eficient. Dac numrul de elemente crete cu un pas s > 1, dar
constant, realocarea se poate face pentru numerele de forma s 2k i n acest caz
problema se rezolv simplu. Dac numrul de elemente crete cu un pas arbitrar,
tiind numrul vechi de elemente i numrul nou de elemente pentru care se cere
memorie, cu ajutorul algoritmului (6) se depisteaz capacitile corespunztoare
fiecrui numr de elemente i dac difer, se face realocarea de memorie.
Criteriile de divizibilitate n baza 2 k pot fi aplicate cu succes la soluionarea
eficient i a multor altor probleme des ntlnite n practica de programare.

32
II.2. Cel mai mare divizor comun i cel mai mic multiplu comun a dou numere ntregi.

Dup cum am constatat n capitolul precedent, noiunea de divizibilitate pentru


sistemele de calcul coincide cu cea matematic, ceea ce ne ndreptete s aplicm
Algoritmul lui Euclid la determinarea celui mai mare divizor comun (CMMDC) a dou
sau mai multe numere ntregi pe calculator.
Dac se cunoate CMMDC a dou numere, uor se poate calcula i cel mai mic
multiplu comun (CMMMC) al acestor numere. Voi nota CMMDC al numerelor i
prin (, ), iar CMMMC [, ]. Iat o formul simpl pentru calcularea CMMMC a dou
numere, dac se cunoate CMMDC al lor: [, ] = () / (, ).
n acest paragraf vom analiza comparativ civa algoritmi pentru determinarea
CMMDC a dou numere ntregi. Fiecare algoritm va fi prezentat n cte o funcie11 PHP.
Toi algoritmii au fost testai la consumul de timp pe un server Apache, cu UCP de
marca Intel Pentium D 3.00GHz, sistem de operare pe 32 bii. La testare s-a aplicat
algoritmul testa de 100, de 1000, apoi de 10000 ori pe aceleai perechi de numere.
Evident, timpul de execuie nu depinde de numrul de repetri ale algoritmului, dar
pentru a diminua influena altor factori care ar putea influena rezultatele testului, am
ales anume aceast schem.

1) Algoritmul Greedy iterativ:


function divCom($a, $b)
{
$r = 1;
if($a < $b) $min = $a; else $min = $b;
for($i=$min; $i>1; $i--)
if(($a%$i==0) && ($b%$i==0) && ($r%$i!=0)) $r *= $i;
return $r;
}
Acest algoritm este diferit de algoritmul lui Euclid. Algoritmul folosete structura
aritmetic a numerelor naturale n baza teoremei de baz a aritmeticii.
Variabila $r acumuleaz divizorii comuni ai $a i $b. Divizorii comuni sunt
cutai printre toate numerele naturale mai mici sau egale dect $a i $b. Condiia

11 O funcie ntr-un limbaj de programare este un subprogram care efectueaz ceva (calcule sau alte instruciuni)
i poate returna o valoare, deci este un algoritm care poate fi parte component a altui algoritm de un nivel mai
mic de granulare. Textul prezent folosete n multe locuri termenul de algoritm cu referire la o funcie.

33
$r % $i 0 filtreaz divizorii care deja se conin n $r. Aceast condiie necesit ca
numerele s fie parcurse n ordine invers, pentru a obine n $r cei mai mari divizori.
Algoritmul se numete Greedy, deoarece caut divizorii ntr-un set de numere i
astfel consum mult timp de execuie. Acest algoritm are dou mari neajunsuri:
1. Parcurge toate numerele de la min($a, $b) pn la 2;
2. Caut divizorii ncepnd cu numerele mai mari.
Evident c este suficient de cutat divizorii comuni doar printre numerele prime
i de verificat la ce putere acestea sunt divizori comuni.
O optimizare ar fi cutarea divizorilor comuni ncepnd cu numerele mai mici.
Dac $min este un numr compus, atunci primul divizor comun se afl pe o poziie nu
mai mare ca rdcin din $min. Deci divizorii comuni ai $a i $b n caz general sunt
mai aproape de nceputul liste de numere parcurse.
Ambele optimizri ar fi posibile dac am avea o list de numere prime suficient de
mare. ns nu e garantat c algoritmul se va executa mai rapid, n special n limbaje de
programare de tipul PHP, deoarece timpul de acces la lista de numere prime poate fi
destul de mare ca s nu obinem nici un ctig de timp.
O optimizare semnificativ ar fi s utilizm Algoritmul lui Euclid de aflare a
CMMDC a dou numere. Esena Algoritmului lui Euclid este relaia ( a, b) = (b, r), unde
r = a % b i r < b. n caz general numrul a poate fi mai mic dect b, ns aceasta
doar mai adaug un pas la procedeu.
E suficient s descriem algoritmul pentru numere nenegative, iar pentru cele
negative se aplic acelai algoritm asupra valorilor absolute ale numerelor.
Pot fi compuse funcii de cteva feluri: din punctul de vedere al structurii funciei,
putem folosi algoritmi recursivi sau iterativi, iar din punctul de vedere al operaiilor
utilizate putem folosi algoritmi multiplicativi sau aditivi. Astfel avem patru cazuri
posibile:

34
2) Algoritmul iterativ-multiplicativ
function divCom($a, $b)
{
while($b) {
$r = $a % $b;
$a = $b;
$b = $r;
}
return $a;
}
Funcia iterativ-multiplicativ repet ntocmai modelul matematic al Algoritmului
lui Euclid. Dintre toate funciile prezentate n paragraful curent aceasta este cea mai
optim din toate punctele de vedere (vitez, consum de memorie i valorile acceptate).
Numrul de instruciuni este minim. Rezultatele testelor de vitez sunt prezentate
ntr-un tabel mai jos. Consumul de memorie se reduce doar la trei variabile de tip INT
($a, $b i $r). Avnd n vedere modul de efectuare a instruciunii de mprire de
ctre UCP, aceast funcie accept ca valori orice pereche de numere ntregi.
O mic optimizare poate fi obinut cu excluderea primului pas al iteraiei n cazul
$a < $b, prin schimbul cu locul al acestor dou variabile:
if($a < $b) { $r = $a; $a = $b; $b = $r; }
ns ctigul de timp este doar diferena dintre o operaia de mprire i una de
atribuire, ceea ce n general este nesemnificativ.

3) Algoritmul recursiv-multiplicativ:
function divCom($a, $b)
{
if($b == 0) return $a;
return divCom ($b, $a % $b);
}
Funciile recursive n general se deosebesc prin elegan i simplitate (de multe
ori aparent). Muli autori de manuale nu recomand utilizarea funciilor recursive
dect n cazuri excepionale, deoarece greelile i erorile legate de acestea sunt adesea
depistate foarte greu.
Problema ns mai are i alt aspect consumul resurselor calculatorului,
memorie i timp. Fiecare apel recursiv al funciei aloc memorie pentru nc un set de
variabile folosite de ctre aceasta i memorie pentru adresa de revenire a indicatorului

35
de instruciuni12 la adresa precedent. PHP este un limbaj de tip interpretor i, spre
deosebire de limbajele de tip compilator, fiecare apel de funcie consum mai multe
resurse i fiecare declaraie de variabil consum extra-memorie. Din acest punct de
vedere, funcia recursiv-multiplicativ rmne cu un pas n urm fa de sora iterativ.

4) Algoritmul iterativ-aditiv($a > 0 && $b > 0)


function divCom($a, $b)
{
while($a != $b)
if($a>$b) $a=$a-$b;
else $b=$b-$a;
return $a;
}
La prima vedere s-ar prea c aceast funcie trebuie s fie mai rapid dect
echivalentul multiplicativ, deoarece operaia de scdere necesit mai puine cicluri ale
UCP. Aparena ns este fals. Aceasta o demonstreaz i rezultatele testrilor
efectuate. Cauza este numrul mare de operaii efectuate. n anumite cazuri, n loc de o
mprire se efectueaz cteva mii (milioane, miliarde) de operaii de scdere,
comparaie i salt condiionat. Totui pentru numere de ordinul miilor funcia este mai
rapid dect cea recursiv-multiplicativ, ceea ce demonstreaz nc o dat ineficiena
recursiei n PHP.
Un alt punct slab al acestei funcii este domeniul valorilor admisibile (DVA). Uor
se observ c pentru $a < 0 sau $b < 0 algoritmul reprezint o iteraie infinit, deci
numerele negative se exclud din DVA. Aceast problem se rezolv uor cu ajutorul
urmtoarelor instruciuni plasate la nceputul funciei:
$a = abs($a); $b = abs($b);
ns perechile de numere ce conin un singur 0 rmn n afara DVA. Ele pot fi
adugate la DVA prin secvena: if(!$a ^ !$b) return 1;
Funcia iterativ-aditiv este o bun alternativ pentru cea recursiv-multiplicativ
n cazul cnd din anumite motive nu putem folosi instruciunea de mprire asupra
valorilor date.

12n limbajele de tip compilator, indicatorul de instruciuni este un registru al UCP (IP = Instruction Pointer),
care indic adresa de memorie a instruciunii curente i care auto-avanseaz pe msur ce se execut
instruciunile din segmentul de cod (CS). Un apel de funcie se efectueaz printr-un salt al IP la adresa funciei i
apoi revenirea IP la adresa precedent.

36
5) Algoritmul recursiv-aditiv ($a > 0 && $b > 0)
function divCom($a, $b)
{
if($a > $b) return divCom($a - $b, $b);
if($a < $b) return divCom($a, $b - $a);
return $a;
}
Aceast funcie motenete toate dezavantajele surorilor recursiv-multiplicativ
i iterativ aditiv. Totui pot fi gsite dou avantaje i pentru aceast funcie:
Pentru valorile nepozitive, funcia nu intr ntr-un ciclu infinit, deoarece fiind
recursie, umple repede memoria operativ disponibil i se oprete execuia cu o
eroare, care dac nu e fatal (n alte limbaje), poate fi prelucrat de funcia apelant. n
orice caz, utilizatorul nu va fi nevoit s atepte rezultatul, spre deosebire de funcia
iterativ-aditiv.
Un alt avantaj este forma grafic frumoas a codului funciei, astfel c se
memorizeaz uor .
Rezultatele testrilor algoritmilor de aflare a CMMDC a dou numere:
(Numerele testate: 15657, 88638)
Repetri
100 1000 10000
Algoritmul
Greedy iterativ 0.330 3.340 34.100

recursiv-aditiv 0.0035 0.036 0.362

recursiv-multiplicativ 0.001 0.011 0.104

iterativ-aditiv 0.0007 0.0065 0.066

iterativ-multiplicativ 0.0004 0.0035 0.033

6) Algoritmul CMMMC:
Cu ajutorul uneia din funciile analizate mai sus, putem scrie funcia pentru
aflarea celui mai mic multiplu comun a doua numere:
function mulCom($a, $b)
{
return (int)( $a*$b / divCom($a, $b) );
}

37
Evident (, , ) = ((, ), ) i [, , ] = [[, ], ]. Aceste proprieti rezult din
reprezentarea n forma canonic a CMMDC i a CMMMC a trei numere i pot fi aplicate
la o cantitate orict de mare de numere. Funciile pentru calcularea CMMDC i a
CMMMC a unei liste arbitrare de numere sunt prezentate n anexe. Ambele funcii au la
baz algoritmul de aflare a CMMDC a dou numere.

38
II.3. Forma canonic a numerelor naturale ().

De multe ori reprezentarea n forma canonic a numerelor naturale uureaz cu


mult rezolvarea unor probleme aritmetice. Procesul de obinere a acestei reprezentri
se numete factorizarea numrului. Acest proces este destul de complicat din punct de
vedere computaional i necesit determinarea primalitii unor numere problem
mai simpl, dar totui i ea de un nivel nalt de dificultate. Exist mai muli algoritmi de
determinare a primalitii. Unii sunt determiniti, iar alii probabilistici. Algoritmii
determiniti ca regul necesit mai mult timp de lucru, ns dau un rspuns exact:
numrul dat n este prim sau compus. Algoritmii probabilistici, pe de alt parte,
consum mai puin timp de execuie i pentru unele numere determin cu exactitate c
sunt compuse, iar celelalte rmn ca posibil prime. Probabilitatea primalitii poate fi
msurat, iar cu un numr ales de iteraii poate fi obinut o probabilitate arbitrar de
mic.
n cadrul aplicaiei web dezvoltate, folosesc un algoritm determinist de
factorizare a numerelor ntregi mici (pn la mrimea unui numr ntreg pe 32/64
bii). Algoritmul este determinist, pentru c se bazeaz pe un algoritm determinist de
testare a primalitii numerelor. La factorizare se parcurge o list de numere prime
cunoscute i se verific dac numrul cercetat se mparte la acestea i de cte ori. Lista
se extinde automat dup necesitate. Pentru extinderea listei de numere prime se
folosete un algoritm bazat la fel pe lista cunoscut de numere prime.
Sunt muli algoritmi mai sofisticai de determinare a primalitii numerelor
ntregi, ns pentru scopul aplicaie, algoritmii descrii sunt suficieni.
Astfel, n cadrul aplicaie poate fi obinut reprezentarea n forma canonic a
oricrui numr ntreg de mrimea procesorului i invers din forma canonic a
numrului se poate de obinut nsui numrul.

39
II.4.Descrierea aplicaiei PHP

Aplicaia are dou pri mari:


a. bibliotecile de funcii i clase scrise n limbajul PHP;
b. aplicaia web care folosete aceste biblioteci prin funcii API.
A doua parte este strns dependent de prima. Iar prima a fost creat integral n
baza concepiilor descrise n aceast lucrare.
Elementele cheie ale bibliotecilor PHP sunt urmtoarele:
1. Clasa PkInts (Packed Integers):
Instanele13 acestei clase sunt nite containere de numere ntregi pstrate n
forma binar ntr-un ir continuu de octei. Fiecare numr ntreg se reprezint pe 1,
2, 4 sau 8 octei, dup necesitate. Clasa introduce metode pentru accesare numerelor
n diferite feluri (ca numere ntregi sau naturale) i a fiecrui octet n parte, metode
pentru manipularea listei de numere: scrierea/citirea listei n/din fiier, selectarea
unei submulimi de numere, sortarea listei, cutarea unui element, ataarea i
eliminarea unui element, deplasarea cu un numr de bii a listei, proprieti de
accesare secvenial, .a.
n PHP sunt destule instrumente pentru lucrul cu listele, n baza tipului de date
array, ns au un minus semnificativ: pentru fiecare element al listei se aloc
extra-spaiu de memorie (~60 octei), deoarece lista poate conine elemente de orice
tip n mod arbitrar. Astfel numrul de elemente pe care le poate conine un array n
PHP este destul de mic (de ordinul miilor, n funcie de memoria disponibil). Clasa
PkInts se specializeaz pe liste de numere ntregi, astfel poate prelucra liste de pn
la cteva milioane elemente (limit n funcie de timpul de execuie, nu de memoria
disponibil). Un dezavantaj al clasei este timpul de acces al elementelor. ns acest
dezavantaj este compensat de timpul de scriere/citire n fiier, care poate fi ignorat
(106 numere de 64bii ocup un ir de 8Mo, care se scrie/citete fr transformri
n/din fiier).

13O instan a clasei este un obiect al clasei respective, reprezentat de un sau mai multe (sau nici una) variabile
de tipul clasei.

40
2. Clasa Prims:
Clasa Prims este un Singleton14. Folosete clasa PkInts pentru a prelucra i a
pstra pe server o list de numere prime, care la necesitate se folosesc n unele metode
ale clasei Prims (i nu mai). Folosind metodele Prims, lista de numere prime se
extinde n mod automat dup necesitate, calculndu-se numere prime din ce n ce mai
mari. ncrcarea n memorie a listei la execuia aplicaiei nu se observ, chiar dac lista
este foarte mare (dup msurile PHP).
La momentul de fa, lista conine 270000 numere prime, ultimul prim fiind
3800201 (al 270000-lea). Aceasta este mai mult dect suficient pentru testul de
primalitate a numerelor ntregi reprezentate pe 32 bii n baza listei de numere prime.
i aceasta nu e limita! Lista poate fi extins printr-o comand API la server. n 30 de
secunde (timpul oferit de serverul gazd actual http://duzun.teologie.net/), la list se
pot aduga n jur de 10000 numere prime noi.
De asemenea clasa conine metode pentru determinarea CMMDC i a CMMMC a
unei liste arbitrare de numere ntregi, testarea primalitii unui numr ntreg dat,
gsirea celui mai apropiat prim mai mare sau mai mic dect numrul dat (se folosete
cutarea prin metoda njumtirii de complexitate O(log n), oferit de clasa PkInts),
descompunerea numrului n forma canonic, .a.
3. Clasa LongNum (Long Numbers):
Este o extindere a clasei Pkints care introduce metode pentru efectuarea
operaiilor aritmetice cu numere ntregi de lungime arbitrar (multi-precizie) fr
pierderea valorii (ca n cazul numerelor de lungime fixat). Clasa garanteaz c
lungimea numerelor se modific n funcie de valoarea coninut astfel ca rezultatul
operaiilor aritmetice s coincid cu valoarea matematic (nu a claselor de resturi
dup modulul 2n).
Clasa la fel introduce metode de citire i scriere a numerelor sistematice
reprezentate n orice baz de la 2 pn la 36 (se poate de extins). n calitate de cifre se
folosesc cifrele zecimale i literele alfabetului englez. Cel mai mult timp de execuie se
consum la convertirea numerelor (reprezentate binar n memorie) ntr-o baz

14 Clase care pot avea o singur instan.

41
arbitrar, diferit de 2k. Operaiile aritmetice, ns, se efectueaz foarte rapid. Fiind o
extensie a clasei PkInts, numerele reprezentate binar pot fi pstrate n fiiere. Astfel
practic nu se pierde timp pentru convertirea din reprezentarea sistematic n cea
binar. Iar dac baza este de forma 2 k, clasa folosete algoritmi optimi de convertire
n/din baza respectiv, fcnd uz de principiile descrise n lucrare de fa.

n afar de aceste clase, biblioteca mai conine i alte funcii PHP pentru operarea
cu numerele ntregi. De asemenea sunt funcii JavaScript (JS) care fac uz de tehnologia
AJAX (folosit i de Google) pentru comunicarea dinamic dintre server i browser.
Funciile JS folosesc interfaa API a bibliotecii pentru a comanda cu operaiile care se
execut pe server.
nsi aplicaia const din module independente care folosesc biblioteca pentru
operaii cu numerele. Modulele pot fi adugate sau eliminate fr a defecta
funcionarea aplicaiei n ntregime.
Codul bibliotecilor folosesc instrumentele i posibilitile oferite de POO15, astfel
fiind comode n utilizare de ctre programatori. Iat, de exemplu, cum se efectueaz
adunarea unui numr ntreg $i la o instan a clasei LongNum $o, cu ajutorul
proprietilor de accesare secvenial ale clasei PkInts:
function add_int_i($o, $i) {
$carry = 0; // transportul initial lipseste
$o->current = add_carry($o->reset, $i, $carry);
$g = ($i & INT_SIGN) ? -1 : 0;
$v = $o->next;
while($v !== false && (($carry ^ $g) & 1)) {
$o->current = add_carry($v, $g, $carry);
$v = $ o->next;
} return $carry;
}
Proprietile reset, current i next sunt motenite de la PkInts, i sunt
folosite pentru parcurgerea listei. Alte variabile contor nu se utilizeaz.

15 Programarea Orientat pe Obiecte

42
CONCLUZII
Nu putem nega faptul c n zilele noaste calculatoarele au o influen foarte mare
asupra tuturor aspectelor vieii noastre. Calculatoarele au schimbat modul nostru de a
percepe realitatea i de a interaciona cu realitatea i cu oamenii din jur. Aceasta se
simte n mod accentuat n ultimele 2-3 decenii. Cercetarea i dezvoltarea de mai
departe a matematicii i a tiinei n general este n strns legtur cu dezvoltarea
sistemelor de calcul. Pan nu demult capacitatea calculatoarelor personale (memoria
i viteza de operare) se dubla n fiecare 1-2 ani. Acum ns se observ o cretere mai
lent n ceea ce privete viteza de operare a calculatoarelor, deoarece s-a atins limita
fizic a capacitii circuitelor integrate. Pentru mbuntirea performanelor
calculatorului se merge pe alte ci. O cale este mrirea numrului de procesoare (UCP
cu 2, 4 sau 8 nuclee) ale unui calculator, iar alta este folosirea mai multor calculatoare
interconectate ntr-o reea foarte rapid numit cluster, astfel ca toate s lucreze
pentru soluionarea aceleiai probleme. Aceste ci, ns, necesit soft mai sofisticat
care s foloseasc avantajele interconectrii mai multor procesoare/nuclee.
O alt cale de dezvoltare este folosirea algoritmilor ct mai optimi pentru fiecare
problem n parte. Aceast cale este actual ncepnd cu apariia sistemelor de calcul i
pn n zilele noastre. ns pentru a crea i a folosi cu succes algoritmi optimi este
nevoie de cunotine matematice i de nelegerea implementrii noiuni de numr n
sistemul de calcul dat (sistemul de calcul i se numete de calcul, pentru c opereaz
cu numere). O piedic n nelegerea modului de operare a calculatorului electronic
este faptul c nu suntem obinuii cu sistemul binar de numeraie i cunoatem prea
puine proprieti ale numerelor i operaiilor binare.
n lucrarea de fa am ncercat s analizez principiile de baz de implementare a
teoriei divizibilitii n sistemele de calcul din familia 80x86. De asemenea am descris
unele principii i metode computaionale care permit extinderea noiunii de numr n
sistemele de calcul. Aplicnd aceste principii i metode am reuit s creez o structur
programatic de numr ntreg de lungime variabil, n funcie de valoarea coninut.
Ca dovad a succesului concepiilor descrise servete aplicaia web despre care s-a
vorbit mai sus. Fr aceste noiuni ar fi imposibil de realizat aplicaia dat n forma n

43
care este, considernd limitele de memorie i de timp de execuie ale aplicaiilor PHP
(~128Mb RAM, 30-60sec).
Bibliotecile PHP ale aplicaiei pot fi extinse, la fel ca i aplicaia n ntregime. Clasa
PkInts poate fi extins ntr-o clas care ar reprezenta polinoamele peste inelul
numerelor ntregi. Clasa Prims poate fi completat cu metode pentru rezolvarea
congruenelor i mai apoi pentru rezolvarea ecuaiilor liniare cu dou necunoscute cu
ajutorul congruenelor. Lista de numere prime poate fi utilizat i n alte aplicaii web
chiar de pe alte servere-gazd, prin intermediul interfeei API, astfel oferind un
serviciu web de nivel aplicaie. n acest fel poate fi utilizat toat biblioteca pentru
crearea de noi aplicaii.
Aplicaia bibliotecilor, ct i a teoriei divizibilitii n sistemele de calcul este
larg, iar aici este descris doar o mic parte a posibilitilor. ns prima condiie este
studierea i nelegerea n esen a fiecrei noiuni n domeniul n care se utilizeaz.

44
BIBLIOGRAFIE
1. Achour M., Betz F., Dovgal A., Lopes N, Magnusson H., Richter G., Seguy D., Vrana
J., .a., PHP: Manual PHP, 2010 (http://php.net/manual/ )
2. Hyde R., The Art of Assembly Language Programming, California 1996. 1426 p.
(http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/toc.html)
3. Menabrea L. F., Sketch of The Analythical Engine invented by Charles Babbage
with notes by translator Ada Lovelace, from the Bibliothque Universelle de
Genve, October, 1842, No. 82 (http://www.fourmilab.ch/babbage/sketch.html)
4. Rustem P., Analiza i sinteza sistemelor numerice, Galai, 2002. 180 p.
5. Valu I., Schie de istorie a matematicii. Chiinu, 2004.

45
ANEX

CMMDC i CMMMC a unei liste arbitrare de numere ntregi


/*! Cel mai mare divizor comun.
*
* Sintaxa: CMMDC(mixed $arr[, mixed $arr1[, mixed $arr2...]])
*/
function CMMDC($arr)
{
if(is_array($arr)) {
// daca toate sunt pozitive si exista 1,
// nu se vor mai parcurge celelalte elemente
sort($arr, SORT_NUMERIC);
$r = array_pop($arr);
foreach($arr as &$v) {
if($r == 1 || $r == -1) break;
$r = divCom($r, CMMDC($v));
}
$arr = $r;
}
if(func_num_args()==1) return $arr;
for($i=1; $i < func_num_args(); $i++) {
if($arr == 1 || $arr == -1) break;
$v = func_get_arg($i);
$arr = divCom($arr, CMMDC($v));
}
return $arr;
}

/*! Cel mai mic multiplu comun.


*
* Sintaxa: CMMMC(mixed $arr[, mixed $arr1[, mixed $arr2...]])
*/
function CMMMC($arr)
{
if(is_array($arr)) {
$r = array_pop($arr);
foreach($arr as &$v) $r = mulCom($r, CMMMC($v));
$arr = $r;
}
if(func_num_args()==1) return $arr;
for($i=1; $i < func_num_args(); $i++) {
$v = func_get_arg($i);
$arr = mulCom($arr, CMMMC($v));
}
return $arr;
}

46

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