Sunteți pe pagina 1din 18

Polinoame

! Definirea no!iunii de polinom


! Forma algebric" a polinoamelor
! Reprezentarea polinoamelor n memoria calculatorului
! Implement"ri sugerate
! Probleme propuse
! Solu!iile problemelor
Capitolul
14


14.1. Definirea no!iunii de polinom
Fie mul!imea "irurilor (infinite) de numere complexe f = (a
0
, a
1
, a
2
, ..., a
n
, ...), care au
numai un num#r finit de termeni nenuli, adic# exist# un num#r natural m, astfel nct
a
i
= 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# mul!ime se definesc dou# opera!ii algebrice:

1. Adunarea
f + g = (a
0
+ b
0
, a
1
+ b
1
,

a
2
+ b
2
, ...).

2. nmul!irea
f ! g = (c
0
, c
1
, c
2
, ...), unde
c
0
= a
0
! b
0
c
1
= a
0
! b
1
+ a
1
! b
0

c
2
= a
0
! b
2
+ a
1
! b
1
+ a
2
! b
0
...
a
r
= a
0
! b
r
+ a
1
! b
r 1
+ a
2
! b
r 2
+...+ a
r
! b
0

Se observ# c# suma f + g "i produsul f ! g apar!in aceleia"i mul!imi.

Defini!ie
Fiecare element al mul!imii definite anterior pe care sunt definite cele dou# opera-
!ii, se nume"te polinom.
14. Polinoame 289

Dac# f = (a
0
, a
1
, a
2
, ..., a
n
,...) este un polinom, numerele a
0
, a
1
, a
2
, ...

se numesc coe-
ficien!ii lui f.

A. Propriet"!i ale adun"rii 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. Propriet"!i ale nmul!irii polinoamelor
1. nmul"irea este comutativ!: f ! g = g ! f.
2. nmul"irea este asociativ!: (f ! g) ! h = f ! (g ! h).
3. Element neutru pentru nmul!irea polinoamelor este polinomul constant 1 = (1, 0, ...).
Avem f ! 1 = 1 ! f = f.
4. nmul"irea 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 simplific!rii 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 conven!ie, vom nota polinomul (0, 1, 0, 0,...) cu X "i l vom citi nedeterminata X.
n urma nmul!irii polinoamelor va rezulta:
X
2
= X ! X = (0,1,0,...) ! (0,1,0,0,...) = (0,0,1,0,... )
X
3
= X ! X
2
= (0,1,0,...) ! (0,0,1,0,...) = (0,0,0,1,0,...)
...
X
n
= X ! X
n 1
= (0,1,0,...) ! (0,0,...,0,1,0,...) = (0,0,...,0,1,0,...)
n 1 n
...

Folosim nmul!irea "i adunarea pentru a scrie: f = a
0
+ a
1
X + a
2
X
2
+...+ a
m
X
m
, unde
a
0
, a
1
, a
2
, ..., a
m
sunt coeficien!ii polinomului f.

Polinoamele de forma aX
n
, unde a $ C (mul!imea numerelor complexe) "i n este
un num#r natural se numesc monoame.

290 14. Polinoame

n mul!imea polinoamelor cu coeficien!i complec"i se disting urm#toarele submul-
!imi importante:
R[X] = mul!imea polinoamelor cu coeficien!i reali;
Q[X] = mul!imea polinoamelor cu coeficien!i ra!ionali;
Z[X] = mul!imea polinoamelor cu coeficien!i ntregi.

14.3. Reprezentarea polinoamelor n memoria
calculatorului

14.3.1. Reprezentarea prin #irul coeficien!ilor
Coeficien!ii unui polinom se vor p#stra ntr-un tablou unidimensional n ordine cresc#-
toare (sau descresc#toare) 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-
punz#tor coeficien!ilor va avea cel pu!in attea elemente + 1 (pentru termenul liber),
ct este gradul polinomului.
Acest mod de reprezentare are avantajul c# n cazul a dou# polinoame coeficien!ii
acelora"i puteri ale lui X sunt a"eza!i n cei doi vectori pe pozi!ii corespunz#toare.

14.3.2. Exemplu de adunare #i sc"dere a dou" polinoame
Fie P
1
(X) = 4X
5
3X
4
+ X
2
8X + 1
"i P
2
(X) = 3X
4
X
3
+ X
2
+ 2X 1.
(P
1
+ P
2
)(X) = 4X
5
3X
4
+ X
2
8X + 1 + 3X
4
X
3
+ X
2
+ 2X 1 =
= 4X
5
X
3
+ 2X
2
6X.
(P
1
P
2
)(X) = 4X
5
3X
4
+ X
2
8X + 1 3X
4
+ X
3
X
2
2X + 1 =
= 4X
5
6X
4
+ X
3
10X + 2.

Reprezentnd polinoamele sub form# de tablouri unidimensionale n care am a"ezat
coeficien!ii n ordine cresc#toare dup# puterile lui X, adunarea "i sc#derea se efectuea-
z# astfel:
indice 0 1 2 3 4 5
P
1
1 8 1 0 3 4
P
2
1 2 1 1 3 0
P
1
+ P
2
0 6 2 1 0 4
P
1
P
2
2 10 0 1 6 4

14.3.3. Exemplu de nmul!ire a dou" polinoame
Fie P
1
(X) = 3X
2
X + 1
"i P
2
(X) = X 2.
0 1 2 3
14. Polinoame 291


(3X
2
X + 1) ! (X 2)
3X
3
X
2
+ X
6X
2
+ 2X 2
3X
3
7X
2
+ 3X 2
P
1
1 1 3
P
2
2 1
P
1
! X 0 1 1 3
P
1
! (2) 2 2 6
P
1
! P
2
2 3 7 3

14.3.4. Valoarea unui polinom
Prin defini!ie num#rul f(#) = a
0
+ a
1
# + a
2
#
2

+...+ a
n
#
n
se nume"te valoarea polinomu-
lui f n ".

Exemplu
Valoarea polinomului P
1
(X) = 3X
2
X + 1 n punctul X = 2 este:
P
1
(2) = 3 ! 2
2
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) = (...(((a
n
! x + a
n 1
) ! x +...+ a
2
) ! x + a
1
) ! x + a
0

"i se aplic# un algoritm simplu n care x este argumentul pentru care se calculeaz#
valoarea polinomului P de coeficien!i a
i
"i grad n:

Subalgoritm Horner(n,x,P):
P % a[n]
pentru i=n-1,0 execut!:
P % P*x + a[i]
sfr"it subalgoritm

14.3.5. mp"r!irea polinoamelor
Prezent#m n continuare o serie de defini!ii "i teoreme a c#ror cunoa"tere este necesar#
n rezolvarea problemei propuse la sfr"itul acestui capitol
*)
.

A. Teorema mp"r!irii cu rest
Fiind date dou# polinoame oarecare cu coeficien!ii complec"i f "i g, unde g " 0, atunci
exist# dou# polinoame cu coeficien!i 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 P
1
(X) = X
3
2X
2
+ 6X 5
"i P
2
(X) = X
2
1.
( X
3
2X
2
+ 6X 5) : (X
2
1) = X 2
X
3
+ X
2X
2
+ 7X 5
2X
2
2
7X 7
Observa!ie
Dac# cele dou# polinoame au coeficien!i numere ntregi "i coeficientul termenului
de grad maxim al mp#r!itorului este &1 atunci ctul "i restul sunt polinoame cu coefi-
cien!i 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 coeficien!i de tip complex. Un num#r complex a este r#-
d#cin# a polinomului f, dac# f(a) = 0.

Teorema lui Bzout:
Fie f " 0 un polinom nenul. Num#rul a $ C este r#d#cin# a polinomului f dac# "i
numai dac# X a l divide pe f.

Teorem"
Fie f = a
0
+ a
1
X + a
2
X
2
+...+ a
n
X
n
un polinom cu a
n
" 0, n ' 1. Dac# x
1
, x
2
, ..., x
n

sunt r#d#cinile lui f, atunci f = a
n
! (X x
1
) ! ( X x
2
) !...! ( X x
n
) "i, n plus, aceast#
descompunere a lui f n factori liniari este unic#.

Teorem"
Restul mp#r!irii 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 mp#r!irii po-
linomului f prin binomul X a. n cazul n care restul mp#r!irii este 0, a este r#d#cin#
a polinomului. Orice r#d#cin# a polinomului este divizor al num#rului a
0
/a
n
(din ultima
rela!ie a lui Vite ).

n tabelul urm#tor prezent#m schema lui Horner pentru mp#r!ire:
Fie a
i
coeficien!ii polinomului P. Efectu#m mp#r!irea la monomul X v.
14. Polinoame 293


puterile nedeterminatei n n 1 n 2 1 0
coeficien!i a
n
a
n 1
a
n 2
... a
1
a
0

coeficien!ii ctului a
n
a
n 1
+ vb
n 1
a
n 2
+ vb
n 2
... a
1
+ vb
1
a
0
+ vb
0

i not#m b
n 1
b
n 2
b
n 3
... b
0
r

Acest tabel se completeaz# astfel:
( n rndul doi al tabelului se scriu coeficien!ii polinomului f ;
( urm#toarea linie a tabelului va con!ine coeficien!ii b "i se formeaz# astfel:
*
b
n 1
prime"te valoarea a
n
;

*
pe celelalte coloane (de la n 1 la 0) elementele b
i
se calculeaz# cu formula:

b
i
= a
i + 1
+ v ! b
i + 1
( Dac# a
0
+ vb
0
este 0, nseamn# c# v este r#d#cin# a polinomului. Ctul mp#r!irii
polinomului dat la acest monom (X v) este polinomul ai c#rui coeficien!i sunt co-
eficien!ii b
i
nenuli (doar cu un grad mai mic), iar restul este a
0
+ vb
0
.

Exemplu
mp#r!im polinomul 2X
4
5X
3
8X + 1 la X 2:

puterea 4 3

2 1 0
coeficien!i
v
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
b
3
b
2
b
1
b
0
r

Ctul mp#r!irii este 2X
3
X
2
2X 12, iar restul este 23.

Pentru a descompune un polinom cu coeficien!i ntregi sub form# de produs de bi-
noame se aplic# schema lui Horner pentru fiecare divizor posibil al lui a
0
/a
n
.

n cazul
n care acesta este r#d#cin# a polinomului, se re!ine "i se continu# procedeul cu polino-
mul ct. n final, pentru fiecare r#d#cin# determinat# avem un monom. Dac# restul es-
te un polinom nenul nseamn# c# acesta nu se poate descompune n produs de monoa-
me n mul!imea numerelor ntregi.

Exemplu
S# se descompun# polinomul X
4
2X
3
+ 3X
2
10X + 8.

Se determin# r#d#cinile ntregi posibile, deci divizorii lui 8: 1, 1, 2, 2, 4, 4, 8, 8.
Aplic#m schema lui Horner pentru aceste valori. Pot exista r#d#cini multiple, adic#
putem g#si 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
coeficien!i 1 2 3 10 8
este r#d#cin# 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 + 1 ! 0 = 2 8 + 1 ! 2 = 6
nu este r#d#cin# 1 1 1 + ( 1) ! 1 = 2 2 + (1 ) ! (2) = 4 8 + (1) ! 4 = 12
este r#d#cin# 2 1 1 + 2 ! 1 = 1 2 + 2 ! 1 = 4 8 + 2 ! 4 = 0
nu este r#d#cin# 2 1 1 + 2 ! 1 = 3 4 + 2 ! 3 = 10
2 1 1 2 ! 1 = 1 4 + (2) ! (1) = 6
4 1 1 + 1 ! 4 = 5 4 + 4 ! 5 = 24
4 1 1 + ( 4) ! 1 = 3 4 + (4) ! (3) = 16
8 1 1 + 8 ! 1 = 9 4 + 8 ! 9 = 76
8 1 1 8 ! 1 = 7 4 + ( 8) ! ( 7) = 60

Coeficien!ii polinomului ct sunt:

X
2
X
1
X
0

nu este r#d#cin#
1 1 4

n concluzie X
4
2X
3
+ 3X
2
10X + 8 = (X
2
+ X + 4) ! (X 1) ! (X 2).

14.3.6. Reprezentarea polinoamelor prin monoamele sale
Dac# un polinom are mul!i coeficien!i egali cu 0, reprezentarea prin "irul coeficien!ilor
nu mai este avantajoas#. n acest caz, se prefer# reprezentarea prin "irul monoamelor.
De asemenea, dac# aceste monoame nu sunt accesibile n ordinea cresc#toare (sau des-
cresc#toare) a puterii lui X, nu vor ap#rea probleme, deoarece n cazul fiec#rui monom
se precizeaz# dou# informa!ii: 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 coeficien!ii diferi!i de 0 ai polinomului "i unul pentru
gradele corespunz#toare ale termenilor;
( cu un "ir de articole
*)
;
( cu ajutorul unei liste liniare, alocat# dinamic
**)
.


*)
Tipul record se va nv#!a la sfr"itul clasei a 9-a
**)
Alocarea dinamic# o vom nv#!a n clasa a 10-a.
14. Polinoame 295

14.4. Implement"ri sugerate
Pentru a v# familiariza cu implementarea opera!iilor cu polinoame v# recomand#m s#
rezolva!i urm#toarele exerci!ii prin care s# realiza!i opera!iile:
1. citirea unui polinom dat prin grad "i coeficien!i;
2. citirea unui polinom dat prin monoame;
3. valoarea unui polinom pentru un argument dat;
4. adunarea a dou# polinoame;
5. nmul!irea a dou# polinoame;
6. mp#r!irea 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. Opera!ii cu polinoame
n func!ie de cerin!a precizat# n fi"ierul de intrare, se va efectua una dintre urm#toare-
le opera!ii asupra unor polinoame cu coeficien!i ntregi:
( adunarea a dou# polinoame;
( sc#derea a dou# polinoame;
( nmul!irea a dou# polinoame;
( mp#r!irea a dou# polinoame;
( calcularea valorii unui polinom ntr-un punct (num#r ntreg) dat;
( descompunerea unui polinom n produs de binoame.

Date de intrare
De pe prima linie a fi"ierului de intrare POL.IN se cite"te un caracter care comunic#
opera!ia care trebuie efectuat#. Caracterele posibile sunt:
( '+': se solicit# adunarea a dou# polinoame;
( '-': se solicit# sc#derea celui de-al doilea polinom din primul;
( '*': se solicit# produsul a dou# polinoame;
( '/': se solicit# ctul "i restul dup# ce primul polinom s-a mp#r!it 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 dore"te o opera!ie aritmetic#, coeficien!ii celor dou# polinoame
se vor afla pe liniile a doua "i respectiv a treia a fi"ierului.


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 fi"ierului, pe linia a tre-
ia aflndu-se coeficien!ii polinomului dat.
Dac# op!iunea este 'd', coeficien!ii polinomului de descompus se afl# pe a doua
linie a fi"ierului.
Coeficien!ii polinoamelor se vor citi din fi"ierul POL.IN n ordine cresc#toare du-
p# puterile nedeterminatei. (Astfel, avnd "i coeficien!ii nuli, gradul polinomului se
va determina pe baza num#rului coeficien!ilor).

Date de ie#ire
n fi"ierul POL.OUT se va scrie, n func!ie de opera!ia solicitat#:
( pentru opera!iile '+', '-' "i '*' se va afi"a polinomul rezultat n urma efectu#rii
opera!iei respective;
( n urma opera!iei de mp#r!ire (/) vor rezulta dou# polinoame (ctul "i restul); coefi-
cien!ii acestor polinoame se vor scrie pe prima (ctul) "i respectiv a doua linie a fi-
"ierului rezultat (restul);
( valoarea unui polinom cu coeficien!i ntregi ntr-un punct dat (num#r ntreg) este
un num#r ntreg care va fi scris n fi"ierul de ie"ire;
( n urma descompunerii unui polinom ca produs de binoame rezult# o expresie de
forma (polinom
1
)(polinom
2
)...(polinom
k
).

Polinoamele se vor afi"a n form# algebric#, n ordinea descresc#toare a gradelor
termenilor. Puterile lui X se vor afi"a sub forma:
* X'^'putere (dac# putere > 1);
* X
1
se va afi"a X;
* X
0
nu se va afi"a (apare doar coeficientul);
* termenii ai c#ror coeficien!i sunt 0 nu se vor scrie, excep!ie f#cnd polinomul nul.

Restric!ii #i preciz"ri
( toate polinoamele au coeficien!i ntregi;
( datele de intrare sunt corecte "i conforme cu descrierea din enun!;
( coeficientul termenului de grad maxim a polinomului mp#r!itor n cazul opera!iei
'/' este 1.

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

14. Polinoame 297

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

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

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

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

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

14.6. Solu!iile problemelor propuse

14.6.1. Opera!ii cu polinoame
Complexitatea acestei aplica!ii oblig# la utilizarea subprogramelor, unele dintre ele fi-
ind necesare n cazul realiz#rii mai multor opera!ii. Din subprogramele care prelucrea-
z# polinoamele am construit un unit. n acest unit am definit tipul polinom "i subpro-
gramele care realizeaz# opera!iile de care vom avea nevoie. Unele subprograme sunt
apelate doar de subprograme "i nu se v#d din programul utilizator al unit-ului.
Interfa!a 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 fi$ier $i gradul lui }
298 14. Polinoame

procedure Afiseaza(p:polinom; gradp:Byte; var g:Text);
{ afi$eaz! 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);
{ ini"ializeaz! coeficien"ii polinomului p de grad g cu 0-uri }

procedure Ori_X(var p:polinom; var g:Byte);
{ nmul"e$te polinomul p cu X }

procedure Inmulteste_cu_scalar(var p:polinom; g:Byte;
constanta:Integer);
{ returneaz! polinomul rezultat din nmul"irea 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! sc!derea 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 nmul"irea 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 mp!r"irea a dou! polinoame }

procedure Descompune(p:polinom; g:Byte; var g:Text);
{ descompune polinomul n produs de binoame }

Subalgoritmul Cite!te cite"te de pe linia curent# a fi"ierului de intrare coeficien-
!ii unui polinom "i determin# gradul acestuia (n func!ie de num#rul de coeficien!i).

Subalgoritm Cite!te(pol,gradp):
gradp % 0
ct timp nu urmeaz! marca de sfr$it de linie execut!:
cite"te pol[gradp]
gradp % gradp+1
sfr"it ct timp
gradp % gradp - 1
sfr"it subalgoritm
14. Polinoame 299

n subalgoritmul care afi"eaz# un polinom sub form# algebric# "i conform cerin!e-
lor enun!ate s-au separat urm#toarele situa!ii:
( dac# polinomul are grad 0, se afi"eaz# termenul liber;
( dac# polinomul are grad mai mare dect 0:
* se afi"eaz# primul termen (de grad maxim);
* se afi"eaz# termenii de grad gradp-1, ..., 1;
* se afi"eaz# termenul liber.

De asemenea:
( n fa!a coeficien!ilor pozitivi vom scrie '+' (avem de afi"at o sum# de monoame),
pe cnd n fa!a celor negativi semnul '-' se afi"eaz# implicit (nu este cazul s# se
adauge nimic);
( dac# coeficientul este 0, termenul respectiv nu se afi"eaz#.

Subalgoritm Afi!eaz"_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]
sfr"it dac!
dac! gradp > 1 atunci { termen de tipul ...x^k }
scrie 'X^',gradp)
altfel scrie 'X' { termen de tipul ...x }
sfr"it 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]
sfr"it dac!
sfr"it dac!
sfr"it dac!
dac! i > 1 atunci scrie 'X^',i
altfel scrie 'X'
sfr"it dac!
sfr"it dac!
sfr"it pentru
300 14. Polinoame

dac! p[0] > 0 atunci
scrie '+',p[0] { afi$area termenului liber }
sfr"it dac!
dac! p[0] < 0 atunci
scrie p[0]
sfr"it dac!
sfr"it subalgoritm

Urmeaz# acum prezentarea subalgoritmilor care corespund op!iunilor posibile din
fi"ierul de intrare.

Op!iunea '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]
sfr"it pentru
Valp % v
sfr"it subalgoritm

Op!iunea '+'
n vederea adun#rii a dou# polinoame (p
1
de grad g
1
"i p
2
de grad g
2
), acestea mai
nti se aduc la aceea"i lungime (a celui de grad maxim grad) cu subalgoritmul Com-
pleteaz"(p,g,grad). Acest lucru nseamn# ad#ugare de 0-uri pn# la lungimea
mai mare (coeficien!i de rang mai mare), deoarece "irul coeficien!ilor este ordonat
cresc#tor dup# puterile lui X. n continuare adunarea const# ntr-o simpl# adunare a "i-
rurilor coeficien!ilor.

Subalgoritm Completeaz"(p,g,grad):
{ completeaz! polinomul p cu 0-uri pn! la noul grad }
pentru i=g+1,grad execut!:
p[i] % 0
sfr"it 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)
sfr"it dac!
pentru i=0,g3 execut!:
p3[i] % p1[i] + p2[i] { se adun! termen cu termen }
{ dac! n urma adun!rii 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
sfr"it ct timp
sfr"it subalgoritm

Dac# vrem s# evit#m aceast# opera!ie de completare cu 0-uri, care cauzeaz# cre"te-
rea opera!iilor elementare de adunare, putem proceda n felul urm#tor:

Subalgoritm Adun"(p1,p2,g1,g2,p3,g3):
{ adun!m p1 cu p2 }
dac! g1 < g2 atunci
pentru i=0,n execut!:
p2[i] % p2[i] + p1[i]
sfr"it pentru
p3 % p2
g3 % g2
altfel
pentru i=0,n execut!:
p1[i] % p1[i] + p2[i]
sfr"it pentru
p3 % p1
g3 % g1
sfr"it dac!
sfr"it subalgoritm

Aceast# rezolvare are dezavantajul c# l modific# pe p
1
, respectiv pe p
2
, dup# caz.
Dac# ns# i-am transmite prin valoare, dup# revenirea din apel, i-am reg#si nemodifi-
cate.

Op!iunea '-'
Sc#derea a dou# polinoame poate fi privit# ca o adunare a primului polinom cu po-
linomul rezultat din nmul!irea celui de-al doilea polinom cu 1:
p
1
p
2
= p
1
+ (1) ! p
2


Subalgoritm Scade(p1,p2,g1,g2,p3,g3):
nmul#e!te_cu_scalar(p2,g2,-1)
Adun"(p1,p2,g1,g2,p3,g3);
302 14. Polinoame

{ dac! n urma sc!derii 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
sfr"it ct timp
sfr"it subalgoritm

Op!iunea '*'
nmul!irea poate fi privit# ca adunarea polinoamelor ob!inute din nmul!irea lui p
1

cu cte un monom de-al lui p
2
. Polinomul produs l vom ini!ializa:

Subalgoritm Ini#ializeaz"(p,g):
{ ini"ializeaz! coeficien"ii polinomului p de grad g cu 0-uri }
pentru i=0,g execut!:
p[i] % 0
sfr"it pentru
sfr"it subalgoritm

Monoamele cu care se va nmul!i p
1
le ob!inem din p
2
sub form# de coeficien!i. n
consecin!# ne trebuie un subalgoritm care nmul!e"te un polinom cu un num#r ntreg:

Subalgoritm nmul#e!te_cu_scalar(p,g,constanta):
{ returneaz! polinomul rezultat din nmul"irea lui cu constanta }
pentru i=0,g execut!:
p[i] % constanta*p[i]
sfr"it pentru
sfr"it subalgoritm

n subalgoritmul nmul#e!te(p1,p2,g1,g2,p3,g3) vom utiliza trei polinoa-
me de lucru: paux de grad gaux, termen1 "i termen2. Polinomul paux prime"te va-
loarea polinomului p
1
, n termen1 strngem polinomul rezultat (p
3
), iar n ter-
men2 p#str#m temporar polinomul paux care la fiecare pas se nmul!e"te cu X. De ase-
menea, la fiecare pas (n num#r de c!i termeni sunt n p
2
) vom nmul!i p
1
cu coeficien-
tul corespunz#tor din p
2
"i rezultatul se adun# la p
3
(p#strat n termen1).

Subalgoritm nmul#e!te(p1,p2,g1,g2,p3,g3):
{ returneaz! polinomul rezultat din nmul"irea a dou! polinoame }
g3 % g1 + g2
Ini#ializeaz"(p3,g3) { se ini"ializeaz! 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
nmul#e!te_cu_scalar(termen2,gaux,p2[i2])
Adun"(termen1,termen2,g3,gaux,p3,g3)
Ori_X(paux,gaux) { se preg!te$te paux pentru pasul urm!tor }
sfr"it pentru
sfr"it subalgoritm

Efectul subalgoritmului Ori_X(p,g) este echivalent cu nmul!irea polinomului
p cu X. De fapt se deplaseaz# coeficien!ii n "ir cu o pozi!ie la dreapta, elibernd astfel
locul termenului liber care se ini!ializeaz# cu 0 "i n final se m#re"te gradul polinomu-
lui cu 1:

Subalgoritm Ori_X(p,g):
{ nmul"e$te polinomul p cu X }
pentru i=g,0 execut!: { se deplaseaz! coeficien"ii cu o pozi"ie spre dreapta }
p[i+1] % p[i]
sfr"it pentru
p[0] % 0
g % g + 1
sfr"it subalgoritm

Dac# ntr-o problem# am avea nevoie de un subalgoritm simplu de nmul!ire, am
putea folosi urm#torul:

Subalgoritm nmul#e!te(p1,p2,g1,g2,p3,g3):
g3 % g1 + g2
Ini#ializeaz"(p3,g3) { se ini"ializeaz! rezultatul }
pentru i=0,g1 execut!:
pentru j=0,g2 execut!:
p3[i+j] % p3[i+j] + p1[i]*p2[j]
sfr"it pentru
sfr"it pentru
sfr"it subalgoritm

Op!iunea '/'
Deoarece aceast# aplica!ie determin# ctul "i restul a dou# polinoame cu coeficien!i
ntregi, conform unui rezultat prezentat n suportul teoretic al lec!iei, coeficientul de
grad maxim al polinomului mp#r!itor 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 mp!r"irea a dou! polinoame }
gcat % g1 - g2{ gradul polinomului ct este diferen"a gradelor polinoamelor }
{ se ini"ializeaz! coeficien"ii polinomului pct cu 0 }
Ini#ializeaz"(pct,gct)
{ ctul $i restul vor fi polinoame cu coeficien"i ntregi }
dac! (p2[g2] = 1) sau (p2[g2] = -1) atunci
{ gradul demp!r"itului ' gradul mp!r"itorului }
ct timp g1 ' g2 execut!:
{ coeficientul termenului de grad g1-g2 va fi rezultatul mp!r"irii }
pcat[g1-g2] % [p1[g1]/p2[g2]]
nmul#e!te(pcat,p2,g1-g2,g2,paux,gaux)
Scade(p1,paux,g1,gaux,prest,grest)
p1 % prest { se repet! procesul, mp!r"ind restul actual la p2 }
g1 % grest
sfr"it ct timp
sfr"it dac!
sfr"it subalgoritm

Op!iunea 'd'
Pe rnd, pentru fiecare posibil divizor se construie"te polinomul p
2
, conform schemei
lui Horner.

Subalgoritm Descompune(p,g,gg):
dac! rest[p[0]/p[g]] = 0 atunci { numai dac! are coeficien"i 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
sfr"it dac!
sfr"it pentru
grad % g { variabil! auxiliar! n care se p!streaz! gradul polinomului }
k % 1 { indice n $irul divizorilor }
nr"d % 0 { num!rul r!d!cinilor g!site }
repet! { se construie$te 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]
sfr"it pentru
14. Polinoame 305

dac! p2[0] = 0 atunci { divi[k] este r!d!cin! a lui p1 }
nr"d % nr"d + 1
r"d[nr"d] % divi[k] { p!str!m r!d!cina n $irul r!d!cinilor }
pentru i=1,g execut!:
p[i-1] % p2[i]
sfr"it pentru
g % g - 1 { scade gradul polinomului p1 }
altfel
k % k + 1
sfr"it dac!
pn! cnd (k > nd) sau (nr"d = grad)
{ pn! cnd nu mai sunt divizori sau am g!sit toate r!d!cinile }
Afi!eaz"_Produs_de_Binoame
sfr"it dac!
sfr"it subalgoritm

Subalgoritmul de mai sus apeleaz# o procedur# special# de afi"are. Procedura face
parte din zona de declara!ii a subprogramului Descompune(p,g,gg).

Subalgoritm Afi!eaz"_Produs_de_Binoame:
{ se afi$eaz! produsul de polinoame determinat }
dac! g > 0 atunci
{ se afi$eaz! p1 care nu mai are r!d!cini n mul"imea numerelor ntregi }
scrie '('
Afi!eaz"(p,g,gg)
scrie ')'
sfr"it dac!
pentru k=1,nrad execut!:
p[0] % -r"d[k]
p[1] % 1
scrie '('
Afi!eaz"(p,1,gg)
scrie ')'
sfr"it pentru
sfr"it algoritm

Aceste subprograme sunt toate ncorporate n unit-ul p#strat n fi"ierul Poli.pas,
care trebuie inclus n programul care l va utiliza. Programul principal cuprinde citirea
caracterului care codific# opera!ia de efectuat. n func!ie de valoarea acestui caracter
se execut# secven!a de instruc!iuni care cite"te datele de intrare, efectueaz# opera!ia
precizat# "i afi"eaz# rezultatele n forma solicitat#. p1, p2, p3 "i p4 sunt polinoame de
grade g1, g2, g3 "i respectiv g4.