Documente Academic
Documente Profesional
Documente Cultură
0914 Polinoame PDF
0914 Polinoame PDF
14
! Definirea noiunii de polinom
! Forma algebric a polinoamelor
! Reprezentarea polinoamelor n memoria calculatorului
! Implementri sugerate
! Probleme propuse
! Soluiile problemelor
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
Dac f = (a0, a1, a2, ..., an,...) este un polinom, numerele a0, a1, a2, ... se numesc coe-
ficienii lui f.
Folosim nmulirea i adunarea pentru a scrie: f = a0 + a1X + a2X2 +...+ amXm, unde
a0, a1, a2, ..., am sunt coeficienii polinomului f.
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
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
*)
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.
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 ).
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
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
Exemplu
S se descompun polinomul X4 2X3 + 3X2 10X + 8.
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
nu este rdcin X2 X1 X0
1 1 4
*)
Tipul record se va nva la sfritul clasei a 9-a
**)
Alocarea dinamic o vom nva n clasa a 10-a.
14. Polinoame 295
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.
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).
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
interface
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
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
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
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
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
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
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