
coucou747
|
salut...
tu viens de trouver un programme complet.
#include <iostream> #include <vector>
int pow(int a, int b){ if (b==0) return 1; return a*pow(a, b-1); }
int min(int a, int b){ return ((a<b)?a:b);} int max(int a, int b){ return ((a>b)?a:b);}
int pgcd_(int c, int d){ int e=d%c; if (e==0){ return c; }else{ return pgcd_(e, c); } }
int pgcd(int a, int b){ if (a<0){ return pgcd(-a, b); }else if(b<0){ return pgcd(a, -b); } int c=min(a,b), d=max(a,b); return pgcd_(c, d); }
class Fraction{ public: Fraction(int a){ num=a; den=1; } Fraction(){ num=0; den=1; } Fraction(int a, int b){ num=a; den=b; } Fraction operator*(Fraction a) const{ Fraction b(num, den); b.num*=a.num; b.den*=a.den; b.simplifie(); return b; }; Fraction operator+(Fraction a) const{ Fraction b; b.num=num*a.den+a.num*den; b.den=den*a.den; b.simplifie(); return b; }; Fraction operator-(Fraction a) const{ Fraction b; b.num=num*a.den-a.num*den; b.den=den*a.den; b.simplifie(); return b; }; void operator-=(Fraction a){ num=num*a.den-a.num*den; den*=a.den; simplifie(); }; void operator+=(Fraction a){ num=num*a.den+a.num*den; den*=a.den; simplifie(); }; void operator/=(Fraction a){ num*=a.den; den*=a.num; simplifie(); }; void operator*=(Fraction a){ num*=a.num; den*=a.den; simplifie(); }; Fraction operator/(Fraction a) const{ Fraction b(num, den); b.num*=a.den; b.den*=a.num; b.simplifie(); return b; }; bool operator!=(int a){ simplifie(); if (den!=1){ return true; }else if (num==a){ return false; } return true; }; bool operator==(int a){ simplifie(); if (den!=1){ return false; }else if (num==a){ return true; } return false; }; int simplifie(){ if (num==0) return 0; if (den<0){ den*=-1; num*=-1; } int a=pgcd(num, den); den/=a; num/=a; return a; } friend std::ostream& operator<< (std::ostream &, Fraction f); private: int long long num, den; };
std::ostream& operator<< (std::ostream& o, Fraction f){ f.simplifie(); if (f.num==0 || f.den==1) o<<f.num; else o<<f.num<<"/"<<f.den; return o; }
template <class T> class System{ public: System(){ Hnext=false; coefsnbr=0; solved=false; } ~System(){} void addcoef(int eq, T coef){ if (eq==0){ coefs.push_back(coef); coefsnbr++; }else{ next->addcoef(eq-1, coef); } } int addEQ(){ if (Hnext){ return 1+next->addEQ(); }else{ next=new System; Hnext=true; return 1; } } void pivot(int r, T val_rang, int rang_suppr, T suppr_val){ //print(); coefs[r]=coefs[r]*suppr_val-coefs[rang_suppr]*val_rang; if (Hnext){ next->pivot(r, val_rang, rang_suppr, suppr_val); } } void pivot(int rang_suppr, T val_suppr, T valeur){ Value=Value*val_suppr-valeur*coefs[rang_suppr]; if (Hnext){ next->pivot(rang_suppr, val_suppr, valeur); } } void pivot(){ if (Hnext){ int h; for (int i=coefsnbr-1;i>=0;i--){ if (coefs[i]!=0){ h=i;break; } } next->pivot(h, coefs[h], Value); for (int i=0;i<coefsnbr;i++){ next->pivot(i, coefs[i], h, coefs[h]); } //print(); //Afficher les etapes intermediaires next->pivot(); hauteur_coef=h; } } void solve(){ pivot(); } void print(){ for (int i=0;i<coefsnbr;i++){ if (coefs[i]!=0){ if (coefs[i]!=1) std::cout << coefs[i] << "*" << (char)('a'+i); else std::cout << (char)('a'+i); if (i!=coefsnbr-1) std::cout << "\t+"; }else{ // if (i!=coefsnbr-1) std::cout << "\t\t"; } } std::cout << "\t=" << Value << "\n"; if (Hnext){ return next->print(); }else{ std::cout << "\n\n"; } } T get(int rang){ if (hauteur_coef==rang){ if (solved){ return valeur_coef; }else{ solved=true; valeur_coef=Value; for (int i=0;i<hauteur_coef;i++){ valeur_coef-=coefs[i]*get(i); } valeur_coef/=coefs[hauteur_coef]; return valeur_coef; } }else{ return next->get(rang); } } void setresult(int p, T r){ if (p==0) Value=r; else next->setresult(p-1, r); } private: bool Hnext; T Value; std::vector<T> coefs; System *next; int coefsnbr; int hauteur_coef; T valeur_coef; bool solved; };
void test1(){ // Calcule les coefs du polynome de degre 4 qui donne, en fonction de n, la somme des cubes des n premiers nombres naturels int i; System<Fraction> a; i=0; a.addcoef(i, 1); a.addcoef(i, 1); a.addcoef(i, 1); a.addcoef(i, 1); a.setresult(i, 1); i=a.addEQ(); a.addcoef(i, 16); a.addcoef(i, 8); a.addcoef(i, 4); a.addcoef(i, 2); a.setresult(i, 9); i=a.addEQ(); a.addcoef(i, 81); a.addcoef(i, 27); a.addcoef(i, 9); a.addcoef(i, 3); a.setresult(i, 36); i=a.addEQ(); a.addcoef(i, 256); a.addcoef(i, 64); a.addcoef(i, 16); a.addcoef(i, 4); a.setresult(i, 100); a.print(); a.solve(); std::cout << "\n\nPIVOT\n\n"; a.print(); std::cout << "\n\ta = " << a.get(0) << "\n\tb = " << a.get(1) << "\n\tc = " << a.get(2) << "\n\td =" << a.get(3) << "\n\n" ; }
void test2(){ int i, j, k, p, s=1; System<Fraction> a; std::cout << "Entrez la puissance :"; std::cin >> p; p++; for (i=0;i<p;i++) a.addcoef(0, 1); a.setresult(0, 1); for (i=2;i<=p;i++){ k=a.addEQ(); s+=pow(i, p-1); for (j=1;j<=p;j++){ a.addcoef(k, pow(i, j)); } a.setresult(k, s); } a.print(); a.solve(); std::cout << "\n\nPIVOT\n\n"; a.print(); std::cout << "Somme des k^p de k variant de 0 a n=\n\t"; for (i=0;i<p;i++){ if (a.get(i)!=0){ std::cout << a.get(i) << "*n^"<< (i+1) << "\t"; if (i!=p-1) std::cout << "+"; } } std::cout << "\n\n"; }
void test3(){ int i, j, k=0, l, n; System<Fraction> a; std::cout << "Entrez le nombre de variables :"; std::cin >> n;
for (i=0;i<n;i++){ if (i!=0) k=a.addEQ(); std::cout << "Equation : " << (i+1) << "\n"; for (j=0;j<n;j++){ std::cout << "coef " << (char)(j+'a') << " de l'equation " << (i+1) << " :"; std::cin >> l; a.addcoef(k, l); } std::cout << "resultat de l'equation " << (i+1) << " :"; std::cin >> l; a.setresult(k, l); } a.print(); a.solve(); std::cout << "\n\nPIVOT\n\n"; a.print(); for (i=0;i<n;i++){ std::cout << "\n\t" << ((char)('a'+i)) << " = " << a.get(i); } std::cout << "\n\n"; }
int main(){ /* Condition de resolution : La diagonale doit etre non nulle (diagonale haut/droite => bas/gauche) sinon, ca provoaue des divisions par zero...
faudrait que j'ajoute une simplification des equations par pgcd, ajouter un tri des lignes pour obtennir une diagonalle non nulle, et le mettre sous forme de template pour permettre des coefs et valeurs complexes
Exemple 1 : Dans cet exemple, on sait que la somme de k varie de 0 a n de k^a en fonction de n (a entier naturel) est un polynome de degre a+1 exemple : la somme des carres est n(n+1)/2, la somme des n cubes est n(n+1)(2n+1)/6 Cet exemple cherche la somme des cubes, c'est donc un polynome de degre 4... P(n)=a*x^4 + b*x^3+c*x^2+d*x+e p(0)=0 p(1)=1 p(2)=9 p(3)=81 p(4)=256 Ce qui nous forme le systeme donne en exemple, et qui donne : domme de k=0 a n des k^3 = 1/4 * ( n^2 * (n+1)^2 ) Grace a ce genre de systemes, on peut avoir des valeurs pour tout degres Exemple 2 : C'est une generalisation de l'exemple 1 mais a tout les degres Exemple 3 : C'est un calcul du pivot sur des valeurs entrees manuellement
*/ //test1(); test2(); test3(); return 0; }
|