! 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.
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.
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
{ 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.