Documente Academic
Documente Profesional
Documente Cultură
Teza Licenta DUzun
Teza Licenta DUzun
Specialitatea:
Matematic i Informatic
TEZ DE LICEN
Tema:
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
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.
7
CAPITOLUL I. TEOREMA DE BAZ A ARITMETICII
Introducere
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
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
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.
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)
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.
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.
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
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
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
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.
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;
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
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.
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)
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.
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.
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
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 ().
39
II.4.Descrierea aplicaiei PHP
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
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.
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
46