1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
PROGRAM polynomes;
USES
crt;
TYPE
p_monome = ^monome;
monome = RECORD
coef : INTEGER;
degres : INTEGER;
suivant : p_monome;
END;
FUNCTION creerNoeud (coef, degres : INTEGER):p_monome;
VAR
nv_mon : p_monome;
BEGIN
new(nv_mon);
nv_mon^.coef := coef;
nv_mon^.degres := degres;
nv_mon^.suivant := NIL;
creerNoeud := nv_mon;
END;
FUNCTION ajouteTete (p : p_monome;coeff,puiss : INTEGER): p_monome;
VAR
l : p_monome;
BEGIN
l := creerNoeud(coeff,puiss);
l^.suivant := p;
ajouteTete := l;
END;
FUNCTION ajouteFin(p : p_monome;coeff,puiss : INTEGER): p_monome; //Ajoute Fin de liste
VAR
l : p_monome;
BEGIN
IF (p = NIL) THEN ajouteFin := creerNoeud(coeff,puiss)
ELSE BEGIN
l := p;
WHILE (l^.suivant <> NIL) DO
BEGIN
l := l^.suivant;
END;
l^.suivant := creerNoeud(coeff,puiss);
ajouteFin := p;
END;
END;
FUNCTION additionner(p,q : p_monome): p_monome; //Addition de p avec q
VAR
add : p_monome;
deg_p, deg_q : INTEGER;
BEGIN
add := NIL;
deg_p := p^.degres;
deg_q := q^.degres;
IF (deg_p = deg_q) THEN BEGIN
WHILE (p <> NIL) AND (q <> NIL) DO BEGIN
IF (p^.degres = q^.degres) THEN add := ajoutefin(add,p^.coef+q^.coef,p^.degres);
p := p^.suivant;
q := q^.suivant;
END;
END
ELSE IF (deg_p > deg_q) THEN BEGIN
WHILE (p^.degres <> q^.degres) DO BEGIN
add := ajoutefin(add,p^.coef,p^.degres);
p := p^.suivant;
END;
WHILE (p <> NIL) AND (q <> NIL) DO BEGIN
IF (p^.degres = q^.degres) THEN add := ajouteFin(add,p^.coef+q^.coef,p^.degres);
p := p^.suivant;
q := q^.suivant;
END;
END
ELSE BEGIN
WHILE (p^.degres <> q^.degres) DO BEGIN
add := ajouteTete(add,q^.coef,q^.degres);
q := q^.suivant;
END;
WHILE (p <> NIL) AND (q <> NIL) DO BEGIN
IF (p^.degres = q^.degres) THEN add := ajouteFin(add,p^.coef + q^.coef,p^.degres);
p := p^.suivant;
q := q^.suivant;
END;
END;
additionner := add;
END;
FUNCTION multipq(p,q : p_monome): p_monome;
VAR
tmp1,tmp3,res : p_monome;
prems : BOOLEAN;
BEGIN
prems := TRUE;
res := NIL;
tmp3 := q;
WHILE (p <> NIL) DO BEGIN
tmp1 := NIL;
q := tmp3;
WHILE (q <> NIL) DO BEGIN
tmp1 := ajoutefin(tmp1,p^.coef * q^.coef,p^.degres + q^.degres);
q := q^.suivant;
END;
IF prems <> TRUE THEN BEGIN
res := additionner(tmp1,res);
END
ELSE BEGIN
res := tmp1;
END;
prems := FALSE;
p := p^.suivant;
END;
multipq := res;
END; |
Partager