coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 14 nov. 2008 à 01:30
salut...
tu viens de trouver un programme complet.
#include
#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 ((ab)?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 a;
std::cout << "Entrez le nombre de variables :";
std::cin >> 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