Sunteți pe pagina 1din 18

Polinoame Capitolul

14
! Definirea noiunii de polinom
! Forma algebric a polinoamelor
! Reprezentarea polinoamelor n memoria calculatorului
! Implementri sugerate
! Probleme propuse
! Soluiile problemelor

14.1. Definirea noiunii de polinom


Fie mulimea irurilor (infinite) de numere complexe f = (a0, a1, a2, ..., an, ...), care au
numai un numr finit de termeni nenuli, adic exist un numr natural m, astfel nct
ai = 0 pentru orice i > m.
Exemple
irul f = (1, -2, 8, 0, ..., 0...) are trei termeni nenuli;
irul g = (0, 1, -2, 0, ..., 0) are doi termeni nenuli.

Pe aceast mulime se definesc dou operaii algebrice:

1. Adunarea
f + g = (a0 + b0, a1 + b1, a2 + b2, ...).

2. nmulirea
f g = (c0, c1, c2, ...), unde
c0 = a0 b0
c1 = a0 b1 + a1 b0
c2 = a0 b2 + a1 b1 + a2 b0
...
ar = a0 br + a1 br 1 + a2 br 2 +...+ ar b0

Se observ c suma f + g i produsul f g aparin aceleiai mulimi.


Definiie
Fiecare element al mulimii definite anterior pe care sunt definite cele dou opera-
ii, se numete polinom.
14. Polinoame 289

Dac f = (a0, a1, a2, ..., an,...) este un polinom, numerele a0, a1, a2, ... se numesc coe-
ficienii lui f.

A. Proprieti ale adunrii polinoamelor


Fie f, g i h trei polinoame.
1. Adunarea este comutativ: f + g = g + f.
2. Adunarea este asociativ: (f + g) + h = f + (g + h).
3. Element neutru pentru adunarea polinoamelor este polinomul constant 0 = (0, 0, ...).
Avem f + 0 = 0 + f = f.
4. Orice polinom are un opus notat cu f, astfel nct f + (f) = (f) + f = 0.

B. Proprieti ale nmulirii polinoamelor


1. nmulirea este comutativ: f g = g f.
2. nmulirea este asociativ: (f g) h = f (g h).
3. Element neutru pentru nmulirea polinoamelor este polinomul constant 1 = (1, 0, ...).
Avem f 1 = 1 f = f.
4. nmulirea este distributiv fa de adunare: f (g + h) = f g + f h i
Avem (f + g) h = f h + g h.
5. Dac f i g sunt polinoame nenule, atunci produsul lor este un polinom nenul (f 0
i g 0 f g 0).
6. Posibilitatea simplificrii cu un factor nenul: dac f, g i h sunt polinoame astfel
nct f g = f h i f 0, atunci g = h.

14.2. Forma algebric a polinoamelor


Prin convenie, vom nota polinomul (0, 1, 0, 0,...) cu X i l vom citi nedeterminata X.
n urma nmulirii polinoamelor va rezulta:
X2 = X X = (0,1,0,...) (0,1,0,0,...) = (0,0,1,0,... )
3 2
X = X X = (0,1,0,...) (0,0,1,0,...) = (0,0,0,1,0,...)
...
Xn = X Xn 1 = (0,1,0,...) (0,0,...,0,1,0,...) = (0,0,...,0,1,0,...)
n1 n
...

Folosim nmulirea i adunarea pentru a scrie: f = a0 + a1X + a2X2 +...+ amXm, unde
a0, a1, a2, ..., am sunt coeficienii polinomului f.

Polinoamele de forma aXn, unde a C (mulimea numerelor complexe) i n este


un numr natural se numesc monoame.
290 14. Polinoame

n mulimea polinoamelor cu coeficieni compleci se disting urmtoarele submul-


imi importante:
R[X] = mulimea polinoamelor cu coeficieni reali;
Q[X] = mulimea polinoamelor cu coeficieni raionali;
Z[X] = mulimea polinoamelor cu coeficieni ntregi.

14.3. Reprezentarea polinoamelor n memoria


calculatorului

14.3.1. Reprezentarea prin irul coeficienilor


Coeficienii unui polinom se vor pstra ntr-un tablou unidimensional n ordine cresc-
toare (sau descresctoare) dup puterea lui X. Numim gradul polinomului puterea cea
mai mare a lui X, pentru care coeficientul este diferit de 0. n concluzie, irul cores-
punztor coeficienilor va avea cel puin attea elemente + 1 (pentru termenul liber),
ct este gradul polinomului.
Acest mod de reprezentare are avantajul c n cazul a dou polinoame coeficienii
acelorai puteri ale lui X sunt aezai n cei doi vectori pe poziii corespunztoare.

14.3.2. Exemplu de adunare i scdere a dou polinoame


Fie P1(X) = 4X5 3X4 + X2 8X + 1
i P2(X) = 3X4 X3 + X2 + 2X 1.
(P1 + P2)(X) = 4X5 3X4 + X2 8X + 1 + 3X4 X3 + X2 + 2X 1 =
= 4X5 X3 + 2X2 6X.
(P1 P2)(X) = 4X5 3X4 + X2 8X + 1 3X4 + X3 X2 2X + 1 =
= 4X5 6X4 + X3 10X + 2.

Reprezentnd polinoamele sub form de tablouri unidimensionale n care am aezat


coeficienii n ordine cresctoare dup puterile lui X, adunarea i scderea se efectuea-
z astfel:
indice 0 1 2 3 4 5
P1 1 8 1 0 3 4
P2 1 2 1 1 3 0
P 1 + P2 0 6 2 1 0 4
P1 P2 2 10 0 1 6 4

14.3.3. Exemplu de nmulire a dou polinoame


Fie P1(X) = 3X2 X + 1 0 1 2 3
i P2(X) = X 2.
14. Polinoame 291

P1 1 1 3
(3X2 X + 1) (X 2)
P2 2 1
3X3 X2 + X
6X2 + 2X 2 P1 X 0 1 1 3
3X 7X2 + 3X 2
3
P1 (2) 2 2 6
P1 P2 2 3 7 3

14.3.4. Valoarea unui polinom


Prin definiie numrul f() = a0 + a1 + a22 +...+ ann se numete valoarea polinomu-
lui f n .

Exemplu
Valoarea polinomului P1(X) = 3X2 X + 1 n punctul X = 2 este:
P1(2) = 3 22 2 + 1 = 3 4 2 + 1 = 12 2 + 1 = 11.

S-a demonstrat c cea mai rapid metod de a calcula valoarea unui polinom este
cea bazat pe schema lui Horner.
Polinomul P(X) se scrie sub forma:
P(X) = (...(((an x + an 1) x +...+ a2) x + a1) x + a0
i se aplic un algoritm simplu n care x este argumentul pentru care se calculeaz
valoarea polinomului P de coeficieni ai i grad n:

Subalgoritm Horner(n,x,P):
P a[n]
pentru i=n-1,0 execut:
P P*x + a[i]
sfrit subalgoritm

14.3.5. mprirea polinoamelor


Prezentm n continuare o serie de definiii i teoreme a cror cunoatere este necesar
n rezolvarea problemei propuse la sfritul acestui capitol*).

A. Teorema mpririi cu rest


Fiind date dou polinoame oarecare cu coeficienii compleci f i g, unde g 0, atunci
exist dou polinoame cu coeficieni de tip complex q i r, astfel nct f = g q + r, un-
de gradul polinomului r este mai mic dect gradul polinomului g.
Polinoamele q i r sunt unice dac satisfac aceast proprietate.

*)
Cei care simt nevoia unui studiu aprofundat pot consulta bibliografie de specialitate (de
exemplu, manualul de matematic pentru clasa a X-a).
292 14. Polinoame

Exemplu
Fie P1(X) = X3 2X2 + 6X 5 ( X3 2X2 + 6X 5) : (X2 1) = X 2
i P2(X) = X2 1. X3 + X
2X2 + 7X 5
2X2 2
7X 7
Observaie
Dac cele dou polinoame au coeficieni numere ntregi i coeficientul termenului
de grad maxim al mpritorului este 1 atunci ctul i restul sunt polinoame cu coefi-
cieni ntregi.

Fie f i g dou polinoame. Spunem c polinomul g divide polinomul f (sau f este


divizibil prin g, sau g este un divizor al lui f, sau f este un multiplu al lui g) dac exist
un polinom h, astfel nct f = g h.
Fie f un polinom nenul cu coeficieni de tip complex. Un numr complex a este r-
dcin a polinomului f, dac f(a) = 0.

Teorema lui Bzout:


Fie f 0 un polinom nenul. Numrul a C este rdcin a polinomului f dac i
numai dac X a l divide pe f.

Teorem
Fie f = a0 + a1X + a2X2 +...+ anXn un polinom cu an 0, n 1. Dac x1, x2, ..., xn
sunt rdcinile lui f, atunci f = an (X x1) ( X x2) ... ( X xn) i, n plus, aceast
descompunere a lui f n factori liniari este unic.

Teorem
Restul mpririi unui polinom f 0 prin binomul X a este egal cu valoarea f(a) a
polinomului f n a.

Schema lui Horner ofer un procedeu de aflare a ctului i a restului mpririi po-
linomului f prin binomul X a. n cazul n care restul mpririi este 0, a este rdcin
a polinomului. Orice rdcin a polinomului este divizor al numrului a0/an (din ultima
relaie a lui Vite ).

n tabelul urmtor prezentm schema lui Horner pentru mprire:


Fie ai coeficienii polinomului P. Efectum mprirea la monomul X v.
14. Polinoame 293

puterile nedeterminatei n n1 n2 1 0
coeficieni an an 1 an 2 ... a1 a0
coeficienii ctului an an 1 + vbn 1 an 2 + vbn 2 ... a1 + vb1 a0 + vb0
i notm bn 1 bn 2 bn 3 ... b0 r

Acest tabel se completeaz astfel:


n rndul doi al tabelului se scriu coeficienii polinomului f ;
urmtoarea linie a tabelului va conine coeficienii b i se formeaz astfel:
bn 1 primete valoarea an;
pe celelalte coloane (de la n 1 la 0) elementele bi se calculeaz cu formula:
b i = ai + 1 + v b i + 1
Dac a0 + vb0 este 0, nseamn c v este rdcin a polinomului. Ctul mpririi
polinomului dat la acest monom (X v) este polinomul ai crui coeficieni sunt co-
eficienii bi nenuli (doar cu un grad mai mic), iar restul este a0 + vb0.

Exemplu
mprim polinomul 2X4 5X3 8X + 1 la X 2:

puterea v 4 3 2 1 0
coeficieni 2 5 0 8 1
ctul b 2 2 5 + 2 2 = 1 0 + 2(1) = 2 8 + 2(2) = 12 1 + 2(12) = 23
b3 b2 b1 b0 r

Ctul mpririi este 2X3 X2 2X 12, iar restul este 23.

Pentru a descompune un polinom cu coeficieni ntregi sub form de produs de bi-


noame se aplic schema lui Horner pentru fiecare divizor posibil al lui a0/an. n cazul
n care acesta este rdcin a polinomului, se reine i se continu procedeul cu polino-
mul ct. n final, pentru fiecare rdcin determinat avem un monom. Dac restul es-
te un polinom nenul nseamn c acesta nu se poate descompune n produs de monoa-
me n mulimea numerelor ntregi.

Exemplu
S se descompun polinomul X4 2X3 + 3X2 10X + 8.

Se determin rdcinile ntregi posibile, deci divizorii lui 8: 1, 1, 2, 2, 4, 4, 8, 8.


Aplicm schema lui Horner pentru aceste valori. Pot exista rdcini multiple, adic
putem gsi o valoare pentru care polinomul s se divid la (x v)k, unde k > 1.
294 14. Polinoame

puterea v 4 3 2 1 0
coeficieni 1 2 3 10 8
este rdcin 1 1 2 + 1 1 = 1 3 + ( 1) 1 = 2 10 + 1 2 = 8 8 +1 ( 8) = 0
dar nu dubl 1 1 1 + 1 1 = 0 2+10=2 8 + 1 2 = 6
nu este rdcin 1 1 1 + ( 1) 1 = 2 2 + (1 ) (2) = 4 8 + (1) 4 = 12
este rdcin 2 1 1 + 2 1 = 1 2+21=4 8 + 2 4 = 0
nu este rdcin 2 1 1+21=3 4 + 2 3 = 10
2 1 1 2 1 = 1 4 + (2) (1) = 6
4 1 1+14=5 4 + 4 5 = 24
4 1 1 + ( 4) 1 = 3 4 + (4) (3) = 16
8 1 1+81=9 4 + 8 9 = 76
8 1 1 8 1 = 7 4 + ( 8) ( 7) = 60

Coeficienii polinomului ct sunt:

nu este rdcin X2 X1 X0
1 1 4

n concluzie X4 2X3 + 3X2 10X + 8 = (X2 + X + 4) (X 1) (X 2).

14.3.6. Reprezentarea polinoamelor prin monoamele sale


Dac un polinom are muli coeficieni egali cu 0, reprezentarea prin irul coeficienilor
nu mai este avantajoas. n acest caz, se prefer reprezentarea prin irul monoamelor.
De asemenea, dac aceste monoame nu sunt accesibile n ordinea cresctoare (sau des-
cresctoare) a puterii lui X, nu vor aprea probleme, deoarece n cazul fiecrui monom
se precizeaz dou informaii: valoarea coeficientului i gradul termenului. Reprezen-
tarea prin monoame, se poate realiza cu mai multe tipuri de structuri de date.
cu dou iruri: unul pentru coeficienii diferii de 0 ai polinomului i unul pentru
gradele corespunztoare ale termenilor;
cu un ir de articole*);
cu ajutorul unei liste liniare, alocat dinamic**).

*)
Tipul record se va nva la sfritul clasei a 9-a
**)
Alocarea dinamic o vom nva n clasa a 10-a.
14. Polinoame 295

14.4. Implementri sugerate


Pentru a v familiariza cu implementarea operaiilor cu polinoame v recomandm s
rezolvai urmtoarele exerciii prin care s realizai operaiile:
1. citirea unui polinom dat prin grad i coeficieni;
2. citirea unui polinom dat prin monoame;
3. valoarea unui polinom pentru un argument dat;
4. adunarea a dou polinoame;
5. nmulirea a dou polinoame;
6. mprirea a dou polinoame;
7. determinarea acelui polinom dintre n polinoame care pentru un argument dat are
valoare maxim.

14.5. Probleme propuse

14.5.1. Operaii cu polinoame


n funcie de cerina precizat n fiierul de intrare, se va efectua una dintre urmtoare-
le operaii asupra unor polinoame cu coeficieni ntregi:
adunarea a dou polinoame;
scderea a dou polinoame;
nmulirea a dou polinoame;
mprirea a dou polinoame;
calcularea valorii unui polinom ntr-un punct (numr ntreg) dat;
descompunerea unui polinom n produs de binoame.

Date de intrare
De pe prima linie a fiierului de intrare POL.IN se citete un caracter care comunic
operaia care trebuie efectuat. Caracterele posibile sunt:
'+': se solicit adunarea a dou polinoame;
'-': se solicit scderea celui de-al doilea polinom din primul;
'*': se solicit produsul a dou polinoame;
'/': se solicit ctul i restul dup ce primul polinom s-a mprit la al doilea;
'v': se solicit calcularea valorii unui polinom ntr-un punct dat;
'd': se solicit descompunerea polinomului n binoame.

n cazul n care se dorete o operaie aritmetic, coeficienii celor dou polinoame


se vor afla pe liniile a doua i respectiv a treia a fiierului.
296 14. Polinoame

Pentru calculul valorii unui polinom, valoarea numeric ntreag pentru care se ce-
re calcularea valorii polinomului se va citi de pe a doua linie a fiierului, pe linia a tre-
ia aflndu-se coeficienii polinomului dat.
Dac opiunea este 'd', coeficienii polinomului de descompus se afl pe a doua
linie a fiierului.
Coeficienii polinoamelor se vor citi din fiierul POL.IN n ordine cresctoare du-
p puterile nedeterminatei. (Astfel, avnd i coeficienii nuli, gradul polinomului se
va determina pe baza numrului coeficienilor).

Date de ieire
n fiierul POL.OUT se va scrie, n funcie de operaia solicitat:
pentru operaiile '+', '-' i '*' se va afia polinomul rezultat n urma efecturii
operaiei respective;
n urma operaiei de mprire (/) vor rezulta dou polinoame (ctul i restul); coefi-
cienii acestor polinoame se vor scrie pe prima (ctul) i respectiv a doua linie a fi-
ierului rezultat (restul);
valoarea unui polinom cu coeficieni ntregi ntr-un punct dat (numr ntreg) este
un numr ntreg care va fi scris n fiierul de ieire;
n urma descompunerii unui polinom ca produs de binoame rezult o expresie de
forma (polinom1)(polinom2)...(polinomk).

Polinoamele se vor afia n form algebric, n ordinea descresctoare a gradelor


termenilor. Puterile lui X se vor afia sub forma:
X'^'putere (dac putere > 1);
X1 se va afia X;
X0 nu se va afia (apare doar coeficientul);
termenii ai cror coeficieni sunt 0 nu se vor scrie, excepie fcnd polinomul nul.

Restricii i precizri
toate polinoamele au coeficieni ntregi;
datele de intrare sunt corecte i conforme cu descrierea din enun;
coeficientul termenului de grad maxim a polinomului mpritor n cazul operaiei
'/' este 1.

Exemple
POL.IN POL.OUT
+ X^3+X^2-3X
1 2 0 1
-1 -1 1
14. Polinoame 297

POL.IN POL.OUT
- X^3-X^2-X+2
1 2 0 1
-1 -1 1

POL.IN POL.OUT
* X^5-X^4-3X^3+3X^2+X-1
1 2 0 1
-1 -1 1

POL.IN POL.OUT
/ X+1
1 2 0 1 2
-1 -1 1

POL.IN POL.OUT
v 116
5
1 2 0 1

POL.IN POL.OUT
d (X^2+X+4)( X-1)( X-2)
8 10 3 2 1

14.6. Soluiile problemelor propuse

14.6.1. Operaii cu polinoame


Complexitatea acestei aplicaii oblig la utilizarea subprogramelor, unele dintre ele fi-
ind necesare n cazul realizrii mai multor operaii. Din subprogramele care prelucrea-
z polinoamele am construit un unit. n acest unit am definit tipul polinom i subpro-
gramele care realizeaz operaiile de care vom avea nevoie. Unele subprograme sunt
apelate doar de subprograme i nu se vd din programul utilizator al unit-ului.
Interfaa acestui unit:

interface

type polinom=array[0..30] of Integer;

function Valp(p:polinom; gradp:Byte; x:Integer):Integer;


{ calculeaz valoarea polinomului p ntr-un punct dat x cu schema lui Horner }

procedure citeste(var pol:polinom; var gradp:Byte; var f:Text);


{ returneaz polinomul citit din fiier i gradul lui }
298 14. Polinoame

procedure Afiseaza(p:polinom; gradp:Byte; var g:Text);


{ afieaz un polinom n forma sa algebric }
procedure Completeaza(var p:polinom; g:Byte; var grad:Byte);
{ completeaz polinomul p cu 0-uri pn la noul grad }
procedure Initializeaza(var p:polinom; g:Byte);
{ iniializeaz coeficienii polinomului p de grad g cu 0-uri }
procedure Ori_X(var p:polinom; var g:Byte);
{ nmulete polinomul p cu X }
procedure Inmulteste_cu_scalar(var p:polinom; g:Byte;
constanta:Integer);
{ returneaz polinomul rezultat din nmulirea lui cu o constant }
procedure Aduna(p1,p2:polinom; g1,g2:Byte; var p3:polinom;
var g3:Byte);
{ adunarea a dou polinoame (p1 i p2 de grad g1 respectiv g2) }
procedure Scade(p1,p2:polinom; g1,g2:Byte; var p3:polinom;
var g3:Byte);
{ efectueaz scderea a dou polinoame (p1 i p2 de grad g1 respectiv g2) }
procedure Inmulteste(p1,p2:polinom; g1,g2:Byte; var p3:polinom;
var g3:Byte);
{ returneaz polinomul rezultat din nmulirea a dou polinoame }
procedure Imparte(p1,p2:polinom; g1,g2:Byte;
var pcat,prest:polinom; var gcat,grest:Byte);
{ returneaz polinomul ct i rest rezultate din mprirea a dou polinoame }
procedure Descompune(p:polinom; g:Byte; var g:Text);
{ descompune polinomul n produs de binoame }

Subalgoritmul Citete citete de pe linia curent a fiierului de intrare coeficien-


ii unui polinom i determin gradul acestuia (n funcie de numrul de coeficieni).
Subalgoritm Citete(pol,gradp):
gradp 0
ct timp nu urmeaz marca de sfrit de linie execut:
citete pol[gradp]
gradp gradp+1
sfrit ct timp
gradp gradp - 1
sfrit subalgoritm
14. Polinoame 299

n subalgoritmul care afieaz un polinom sub form algebric i conform cerine-


lor enunate s-au separat urmtoarele situaii:
dac polinomul are grad 0, se afieaz termenul liber;
dac polinomul are grad mai mare dect 0:
se afieaz primul termen (de grad maxim);
se afieaz termenii de grad gradp-1, ..., 1;
se afieaz termenul liber.

De asemenea:
n faa coeficienilor pozitivi vom scrie '+' (avem de afiat o sum de monoame),
pe cnd n faa celor negativi semnul '-' se afieaz implicit (nu este cazul s se
adauge nimic);
dac coeficientul este 0, termenul respectiv nu se afieaz.
Subalgoritm Afieaz_polinom(p,gradp):
dac gradp = 0 atunci scrie p[gradp] { avem numai termen liber }
altfel
dac p[gradp] = -1 atunci scrie '-' { termen de tipul -x }
altfel
dac p[gradp] 1 atunci { termen de tipul Coef*x }
scrie p[gradp]
sfrit dac
dac gradp > 1 atunci { termen de tipul ...x^k }
scrie 'X^',gradp)
altfel scrie 'X' { termen de tipul ...x }
sfrit dac
pentru i=gradp-1,1 execut:
dac p[i] 0 atunci { dac termenul are coeficient nenul }
dac p[i] = -1 atunci scrie '-'
altfel
dac p[i] = 1 atunci scrie '+'
altfel
dac p[i] > 1 atunci scrie '+',p[i]
altfel scrie p[i]
sfrit dac
sfrit dac
sfrit dac
dac i > 1 atunci scrie 'X^',i
altfel scrie 'X'
sfrit dac
sfrit dac
sfrit pentru
300 14. Polinoame

dac p[0] > 0 atunci


scrie '+',p[0] { afiarea termenului liber }
sfrit dac
dac p[0] < 0 atunci
scrie p[0]
sfrit dac
sfrit subalgoritm

Urmeaz acum prezentarea subalgoritmilor care corespund opiunilor posibile din


fiierul de intrare.

Opiunea 'v'
Subalgoritm Valp(p,gradp,x)
{ calculeaz valoarea polinomului p ntr-un punct dat x cu schema lui Horner }
v 0
pentru i=gradp,0 execut:
v v*x + p[i]
sfrit pentru
Valp v
sfrit subalgoritm

Opiunea '+'
n vederea adunrii a dou polinoame (p1 de grad g1 i p2 de grad g2), acestea mai
nti se aduc la aceeai lungime (a celui de grad maxim grad) cu subalgoritmul Com-
pleteaz(p,g,grad). Acest lucru nseamn adugare de 0-uri pn la lungimea
mai mare (coeficieni de rang mai mare), deoarece irul coeficienilor este ordonat
cresctor dup puterile lui X. n continuare adunarea const ntr-o simpl adunare a i-
rurilor coeficienilor.

Subalgoritm Completeaz(p,g,grad):
{ completeaz polinomul p cu 0-uri pn la noul grad }
pentru i=g+1,grad execut:
p[i] 0
sfrit subalgoritm

Subalgoritm Adun(p1,p2,g1,g2,p3,g3)
{ se completeaz cu 0-uri polinomul mai scurt pn la lungimea celuilalt }
{ i se determin gradul rezultatului }
dac g1 > g2 atunci
g3 g1
Completeaz(p2,g2,g1)
altfel
g3 g2
14. Polinoame 301

Completeaz(p1,g1,g2)
sfrit dac
pentru i=0,g3 execut:
p3[i] p1[i] + p2[i] { se adun termen cu termen }
{ dac n urma adunrii celor dou polinoame s-a redus gradul }
{ polinomului rezultat, se modific gradul polinomului sum }
ct timp (g3 > 0) i (p3[g3] = 0) execut:
g3 g3 - 1
sfrit ct timp
sfrit subalgoritm

Dac vrem s evitm aceast operaie de completare cu 0-uri, care cauzeaz crete-
rea operaiilor elementare de adunare, putem proceda n felul urmtor:

Subalgoritm Adun(p1,p2,g1,g2,p3,g3):
{ adunm p1 cu p2 }
dac g1 < g2 atunci
pentru i=0,n execut:
p2[i] p2[i] + p1[i]
sfrit pentru
p3 p2
g3 g2
altfel
pentru i=0,n execut:
p1[i] p1[i] + p2[i]
sfrit pentru
p3 p1
g3 g1
sfrit dac
sfrit subalgoritm

Aceast rezolvare are dezavantajul c l modific pe p1, respectiv pe p2, dup caz.
Dac ns i-am transmite prin valoare, dup revenirea din apel, i-am regsi nemodifi-
cate.

Opiunea '-'
Scderea a dou polinoame poate fi privit ca o adunare a primului polinom cu po-
linomul rezultat din nmulirea celui de-al doilea polinom cu 1:
p1 p2 = p1 + (1) p2

Subalgoritm Scade(p1,p2,g1,g2,p3,g3):
nmulete_cu_scalar(p2,g2,-1)
Adun(p1,p2,g1,g2,p3,g3);
302 14. Polinoame

{ dac n urma scderii celor dou polinoame s-a redus gradul }


{ polinomului rezultat, se modific gradul polinomului diferen }
ct timp (g3 > 0) i (p3[g3] = 0) execut:
g3 g3-1
sfrit ct timp
sfrit subalgoritm

Opiunea '*'
nmulirea poate fi privit ca adunarea polinoamelor obinute din nmulirea lui p1
cu cte un monom de-al lui p2. Polinomul produs l vom iniializa:
Subalgoritm Iniializeaz(p,g):
{ iniializeaz coeficienii polinomului p de grad g cu 0-uri }
pentru i=0,g execut:
p[i] 0
sfrit pentru
sfrit subalgoritm

Monoamele cu care se va nmuli p1 le obinem din p2 sub form de coeficieni. n


consecin ne trebuie un subalgoritm care nmulete un polinom cu un numr ntreg:
Subalgoritm nmulete_cu_scalar(p,g,constanta):
{ returneaz polinomul rezultat din nmulirea lui cu constanta }
pentru i=0,g execut:
p[i] constanta*p[i]
sfrit pentru
sfrit subalgoritm

n subalgoritmul nmulete(p1,p2,g1,g2,p3,g3) vom utiliza trei polinoa-


me de lucru: paux de grad gaux, termen1 i termen2. Polinomul paux primete va-
loarea polinomului p1, n termen1 strngem polinomul rezultat (p3), iar n ter-
men2 pstrm temporar polinomul paux care la fiecare pas se nmulete cu X. De ase-
menea, la fiecare pas (n numr de ci termeni sunt n p2) vom nmuli p1 cu coeficien-
tul corespunztor din p2 i rezultatul se adun la p3 (pstrat n termen1).

Subalgoritm nmulete(p1,p2,g1,g2,p3,g3):
{ returneaz polinomul rezultat din nmulirea a dou polinoame }
g3 g1 + g2
Iniializeaz(p3,g3) { se iniializeaz rezultatul }
paux p1 { paux = polinom de lucru }
gaux g1
{ se adun la fiecare pas polinomul paux la polinomul rezultat p3 }
14. Polinoame 303

pentru i2=0,g2 execut: { pentru fiecare coeficient al polinomului p2 }


termen1 p3
termen2 paux
nmulete_cu_scalar(termen2,gaux,p2[i2])
Adun(termen1,termen2,g3,gaux,p3,g3)
Ori_X(paux,gaux) { se pregtete paux pentru pasul urmtor }
sfrit pentru
sfrit subalgoritm

Efectul subalgoritmului Ori_X(p,g) este echivalent cu nmulirea polinomului


p cu X. De fapt se deplaseaz coeficienii n ir cu o poziie la dreapta, elibernd astfel
locul termenului liber care se iniializeaz cu 0 i n final se mrete gradul polinomu-
lui cu 1:

Subalgoritm Ori_X(p,g):
{ nmulete polinomul p cu X }
pentru i=g,0 execut: { se deplaseaz coeficienii cu o poziie spre dreapta }
p[i+1] p[i]
sfrit pentru
p[0] 0
g g + 1
sfrit subalgoritm

Dac ntr-o problem am avea nevoie de un subalgoritm simplu de nmulire, am


putea folosi urmtorul:

Subalgoritm nmulete(p1,p2,g1,g2,p3,g3):
g3 g1 + g2
Iniializeaz(p3,g3) { se iniializeaz rezultatul }
pentru i=0,g1 execut:
pentru j=0,g2 execut:
p3[i+j] p3[i+j] + p1[i]*p2[j]
sfrit pentru
sfrit pentru
sfrit subalgoritm

Opiunea '/'
Deoarece aceast aplicaie determin ctul i restul a dou polinoame cu coeficieni
ntregi, conform unui rezultat prezentat n suportul teoretic al leciei, coeficientul de
grad maxim al polinomului mpritor trebuie s fie 1 sau 1.
304 14. Polinoame

Subalgoritm mparte(p1,p2,g1,g2,pct,prest,gct,grest):
{ returneaz polinomul ct i rest, rezultate din mprirea a dou polinoame }
gcat g1 - g2{ gradul polinomului ct este diferena gradelor polinoamelor }
{ se iniializeaz coeficienii polinomului pct cu 0 }
Iniializeaz(pct,gct)
{ ctul i restul vor fi polinoame cu coeficieni ntregi }
dac (p2[g2] = 1) sau (p2[g2] = -1) atunci
{ gradul dempritului gradul mpritorului }
ct timp g1 g2 execut:
{ coeficientul termenului de grad g1-g2 va fi rezultatul mpririi }
pcat[g1-g2] [p1[g1]/p2[g2]]
nmulete(pcat,p2,g1-g2,g2,paux,gaux)
Scade(p1,paux,g1,gaux,prest,grest)
p1 prest { se repet procesul, mprind restul actual la p2 }
g1 grest
sfrit ct timp
sfrit dac
sfrit subalgoritm

Opiunea 'd'
Pe rnd, pentru fiecare posibil divizor se construiete polinomul p2, conform schemei
lui Horner.

Subalgoritm Descompune(p,g,gg):
dac rest[p[0]/p[g]] = 0 atunci { numai dac are coeficieni ntregi }
nd 0 { se introduc n irul divi divizorii lui p[0] }
pentru i=1,Abs(p[0]) execut:
dac rest[p[0]/i] = 0 atunci{ i i -i se introduc n irul divizorilor }
nd nd+1
divi[nd] i
nd nd+1
divi[nd] -i
sfrit dac
sfrit pentru
grad g { variabil auxiliar n care se pstreaz gradul polinomului }
k 1 { indice n irul divizorilor }
nrd 0 { numrul rdcinilor gsite }
repet { se construiete polinomul p2 conform schemei lui Horner, }
p2[g] p[g] { coeficientul termenului de grad maxim }
pentru i=g-1,0 execut:
p2[i] p[i] + p2[i+1]*divi[k]
sfrit pentru
14. Polinoame 305

dac p2[0] = 0 atunci { divi[k] este rdcin a lui p1 }


nrd nrd + 1
rd[nrd] divi[k] { pstrm rdcina n irul rdcinilor }
pentru i=1,g execut:
p[i-1] p2[i]
sfrit pentru
g g - 1 { scade gradul polinomului p1 }
altfel
k k + 1
sfrit dac
pn cnd (k > nd) sau (nrd = grad)
{ pn cnd nu mai sunt divizori sau am gsit toate rdcinile }
Afieaz_Produs_de_Binoame
sfrit dac
sfrit subalgoritm

Subalgoritmul de mai sus apeleaz o procedur special de afiare. Procedura face


parte din zona de declaraii a subprogramului Descompune(p,g,gg).

Subalgoritm Afieaz_Produs_de_Binoame:
{ se afieaz produsul de polinoame determinat }
dac g > 0 atunci
{ se afieaz p1 care nu mai are rdcini n mulimea numerelor ntregi }
scrie '('
Afieaz(p,g,gg)
scrie ')'
sfrit dac
pentru k=1,nrad execut:
p[0] -rd[k]
p[1] 1
scrie '('
Afieaz(p,1,gg)
scrie ')'
sfrit pentru
sfrit algoritm

Aceste subprograme sunt toate ncorporate n unit-ul pstrat n fiierul Poli.pas,


care trebuie inclus n programul care l va utiliza. Programul principal cuprinde citirea
caracterului care codific operaia de efectuat. n funcie de valoarea acestui caracter
se execut secvena de instruciuni care citete datele de intrare, efectueaz operaia
precizat i afieaz rezultatele n forma solicitat. p1, p2, p3 i p4 sunt polinoame de
grade g1, g2, g3 i respectiv g4.

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