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
| #include <vector>
#include <iostream>
class polynome {
public:
typedef int value_type;
typedef unsigned int size_type;
private:
std::vector<value_type> values;
public:
size_type degre() const {return values.size()-1;}
value_type operator[](size_type degre) const {return values[degre];}
value_type & operator[](size_type degre) {return values[degre];}
};
//PROCEDURE Produit_Dicho(P,Q:Poly; Var R:Poly; Degre:Integer);
void algo(polynome p, polynome q, polynome& R, int degre) {
// IF Degre=0
// THEN R[0]:=P[0]*Q[0]
if (degre==0) {
R[0]=p[0]*q[0];
//ELSE "tout le reste" équivaut à return.
return;
}
//VAR
// P2,Q1,Q2,S1,S2 : Poly;
// I,D,D1,D2 : INTEGER;
polynome p2;
polynome q1,q2;
polynome S1,S2;
// D1:=((Degre+1) DIV 2);
// D:=D1-1;
// I:=0;
polynome::size_type d1 = (degre+1)/2;
polynome::size_type d = d1-1;
//Boucle de décomposition du polynome //
// FOR I:=0 TO D DO
// BEGIN
// P2[I]:=P[I+D1];
// Q2[I]:=Q[I+D1];
// S1[I]:=P[I]+P2[I];
// S2[I]:=Q[I]+Q2[I];
// END;
for(polynome::size_type i=0; i<=d; i++) {
p2[i] = p[i+d1];
q2[i] = q[i+d1];
S1[i] = p[i]+p2[i];
S2[i] = q[i]+q2[i];
}
// Produit_Dicho(P,Q,P,D);
// Produit_Dicho(P2,Q2,P2,D);
// Produit_Dicho(S1,S2,S1,D);
algo(p,q, p, d);
algo(p2,q2, p2, d);
algo(S1,S2, S1, d);
// R:=P;
// D2:=2*D+2;
// R[D2-1]:=0;
R=p;
polynome::size_type d2 = 2 * (d+1);
R[d2-1]=0;
// FOR I:=0 TO 2*D DO R[I+D2]:=P2[I];
for(polynome::size_type i=0; i<=2*d; ++i) {
R[i+d2] = p2[i];
}
// FOR I:=0 TO 2*D DO R[I+D1]:=R[I+D1]+S1[I]-(P[I]+P2[I]);
for(polynome::size_type i=0; i<=2*d; ++i) {
R[i+d1] = R[i+d1] + S1[i] - (p[i]+p2[i]);
}
}
using namespace std;
int main() {
polynome P,Q,R;
int degre=3;
cout<<" Polynome P : " ;
for(int i=0;i<degre;i++) {
cout<<" P ["<<i<<"]";
cin>>P[i];
}
cout <<"\n****************************************" << endl;
for(int i=0;i<degre;i++) {
cout<<" Q ["<<i<<"]";
cin>>Q[i];
}
algo(P,Q,R,degre);
for(int i=0;i<2*degre-1;i++) cout<<R[i]<<" ";
} |
Partager