[C++] Program wykonujący operacje na wielomianach

zaksakk
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 19 lis 2011, o 23:14
Płeć: Kobieta
Lokalizacja: Krk

[C++] Program wykonujący operacje na wielomianach

Post autor: zaksakk »

Pilnie potrzebuję programu (gdyż sama już nie zdążę go napisać, a wcześniej nauczyć się odpowiednich rzeczy) lub gruntownej pomocy w jego napisaniu wykonujący podstawowe operacie na wielomianach napisany w C++

Będę wdzięczna za każdą pomoc, za każdą, nawet najmniejszą, część programu lub wskazówki do nich.
Bardzo proszę o pomoc!
Ostatnio zmieniony 9 sty 2012, o 22:41 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Kartezjusz
Użytkownik
Użytkownik
Posty: 7330
Rejestracja: 14 lut 2008, o 08:31
Płeć: Mężczyzna
Lokalizacja: Z Bielskia-Białej
Podziękował: 6 razy
Pomógł: 961 razy

[C++] Program wykonujący operacje na wielomianach

Post autor: Kartezjusz »

Algorytmy podam.
1.Wpisz stopień wielomianu
2.Wpisz współczynniki wielomianu
3.Podaj działanie jakie ma wykonać
A.Dodawanie(odejmowanie)
Jeśli stopnie są równe dodaj(odejmij) po współrzędnych
Jeśli nie to do tego wielomianu dodaj sztucznie 0 razy odpowiedni jednomian
4.Mnożenie.pomnóż współczynniki każdy z każdym i dodaj stopnie jednomianów przed którymi stoją te współczynniki.Iloczyny dla których mamy taką samą liczbę stopni dodajemy
5.Jeżeli stopień wielomianu-dzielnika jest większy niż stopień wielomianu-dzielnej piszesz
iloraz 0 i reszta 0
6.Jeśli nie Najwyższy współczynnik wielomianu-dzielnej dzielisz przez najwyższy dzielnik wielomianu- dzielnikawynik piszesz do schowka. Teraz ten element ze schowka mnożysz przez wielomian -dzielnik - wynik odejmujesz od wielomianu dzielnej.
Robisz to do momentu,aż masz sytuację z punktu 5.
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

[C++] Program wykonujący operacje na wielomianach

Post autor: Mariusz M »

Jeżeli chcesz kodu to

dodawanie/odejmowanie

Kod: Zaznacz cały

void addpoly(int deg,double* a,double* b,double* c){
int i;
for(i=0;i<=deg;i++)
c[i]=a[i]+b[i];
}
mnożenie

Kod: Zaznacz cały

void mulpoly(int deg1,deg2,double* a,double* b,double* c){
int i,j;
for(i=0;i<=deg1+deg2;i++)
c[i]=0;
for(i=0;i<=deg1;i++)
for(j=0;j<=deg2;j++)
c[i+j]+=a[i]*b[j];
}

dzielenie

Kod: Zaznacz cały

  
void divpoly(double* u, int n, double* v, int nv, double* q, double* r)
{
int k,j;
for (j=0;j<=n;j++) {
r[j]=u[j];
q[j]=0.0;
}
for (k=n-nv;k>=0;k--) {
q[k]=r[nv+k]/v[nv];
for (j=nv+k-1;j>=k;j--) r[j] -= q[k]*v[j-k];
}
for (j=nv;j<=n;j++) r[j]=0.0;
}
pierwiastki

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <complex>
#include <conio.h>

using namespace std;

double eps=1e-12;

complex<double> horner(int,complex<double>[],complex<double>);

int linear(complex<double>[],complex<double>[]);
int quadratic(complex<double>[],complex<double>[]);
int cubic(complex<double>[],complex<double>[]);
int quartic01(complex<double>[],complex<double>[]);
int quartic02(complex<double>[],complex<double>[]);

int main(){
char ch;
int i,w,n;
complex<double> a[5],x[5];
do{
cout.precision(12);
cout<<"Rozwiazywanie rownan czwartego stopnia"<<endl;
cout<<"1.                   Metoda Niccolo Fontany "<<endl;
cout<<"2.                   Metoda Lodovico Ferrariego"<<endl;
cout<<endl;
cin>>w;
switch(w){
case 1:{
     cout<<"Podaj wspolczynniki"<<endl;
     for(i=4;i>=0;i--){
     cout<<"a["<<i<<"]=";
     cin>>a[i];
     }
     cout<<endl;
     n=quartic01(a,x);
     for(i=1;i<=n;i++)
     cout<<"x["<<i<<"]="<<x[i]<<endl;
     cout<<endl;
     break;
     }
case 2:{
cout<<"Podaj wspolczynniki"<<endl;
     for(i=4;i>=0;i--){
     cout<<"a["<<i<<"]=";
     cin>>a[i];
     }
     cout<<endl;
     n=quartic02(a,x);
     for(i=1;i<=n;i++)
     cout<<"x["<<i<<"]="<<x[i]<<endl;
     cout<<endl;
break;
}
default : cout<<"Brak metody . Podaj liczbe od 1 do 2"<<endl;
}
ch=getch();
}
while(ch!=27);
return 0;
}

complex<double> horner(int n,complex<double> a[],complex<double> x){
int i;
complex<double> s=complex<double>(0.0,0.0);
for(i=n;i>=0;i--)
s=s*x+a[i];
return s;                
}

int linear(complex<double> a[],complex<double> x[]){
int n=0;

if(a[1]!=complex<double>(0.0,0.0)){
x[1]=complex<double>(-a[0]/a[1]);
n=1;
}
return n;
}

int quadratic(complex<double> a[],complex<double> x[]){
int i,n;
complex<double> delta;

if(a[2]==complex<double>(0.0,0.0)) return linear(a,x);
else{

for(i=1;i<=2;i++)
x[i]=complex<double>(-a[1]/(2.0*a[2]));

delta=pow(a[1],2)-4.0*a[2]*a[0];

x[1]-=complex<double>(sqrt(delta)/(2.0*a[2]));
x[2]+=complex<double>(sqrt(delta)/(2.0*a[2]));

n=2;
return n;
}
}

int cubic(complex<double> a[],complex<double> x[]){
int i,j,n;
complex<double> p,q;
complex<double> b[3],t[3],e[3];

if(a[3]==complex<double>(0.0,0.0)) return quadratic(a,x);
else{

for(i=0;i<3;i++)
e[i]=exp(complex<double>(0.0,2.0*i*M_PI/3.0));

for(i=1;i<=3;i++)
x[i]=complex<double>(-a[2]/(3.0*a[3]));

p=complex<double>((3.0*a[3]*a[1]-pow(a[2],2))/(9.0*pow(a[3],2)));
q=complex<double>((2.0*pow(a[2],3)-9.0*a[3]*a[2]*a[1]+27.0*pow(a[3],2)*a[0])/(54.0*pow(a[3],3)));

b[2]=complex<double>(1.0,0.0);
b[1]=2.0*q;
b[0]=-pow(p,3);

quadratic(b,t);

t[1]=pow(t[1],1.0/3.0);
t[2]=pow(t[2],1.0/3.0);

j=0;

while(abs(e[j/3]*t[1]*e[j%3]*t[2]+p)>=eps) j++;

t[1]*=e[j/3];
t[2]*=e[j%3];

x[1]+=(t[1]+t[2]);
x[2]+=(e[1]*t[1]+e[2]*t[2]);
x[3]+=(e[2]*t[1]+e[1]*t[2]);

n=3;
return n;
}
}

int quartic01(complex<double> a[],complex<double> x[]){
int i,n;
complex<double> p,q,r;
complex<double> b[4],t[4];

if(a[4]==complex<double>(0.0,0.0)) return cubic(a,x);
else{

for(i=1;i<=4;i++)
x[i]=complex<double>(-a[3]/(4.0*a[4]));

p=complex<double>((8.0*a[4]*a[2]-3.0*pow(a[3],2))/(8.0*pow(a[4],2)));
q=complex<double>((pow(a[3],3)-4.0*a[4]*a[3]*a[2]+8.0*pow(a[4],2)*a[1])/(8.0*pow(a[4],3)));
r=complex<double>((16.0*a[4]*pow(a[3],2)*a[2]+256.0*pow(a[4],3) *a[0]-3.0*pow(a[3],4)-64.0*pow(a[4],2)*a[3]*a[1])/(256.0*pow(a[4],4)));


if(abs(q)<eps){

b[2]=complex<double>(1.0,0.0);
b[1]=p;
b[0]=r;

quadratic(b,t);

x[1]-=sqrt(t[1]);
x[2]+=sqrt(t[1]);
x[3]-=sqrt(t[2]);
x[4]+=sqrt(t[2]);

}
else{
     
b[3]=complex<double>(1.0,0.0);
b[2]=2.0*p;
b[1]=pow(p,2)-4.0*r;
b[0]=-pow(q,2);

cubic(b,t);

for(i=1;i<=3;i++)
t[i]=sqrt(t[i]);

if(abs(t[1]*t[2]*t[3]+q)>eps) t[3]=-t[3];

x[1]+=0.5*(t[1]+t[2]+t[3]);
x[2]+=0.5*(t[1]-t[2]-t[3]);
x[3]+=0.5*(-t[1]+t[2]-t[3]);
x[4]+=0.5*(-t[1]-t[2]+t[3]);
}
n=4;
return n;
}
}

int quartic02(complex<double> a[],complex<double> x[]){
int i,n;
complex<double> p,q,r;
complex<double> ua[4],ux[4];
complex<double> b1[3],x1[3];
complex<double> b2[3],x2[3];

if(a[4]==complex<double>(0.0,0.0)) return cubic(a,x);
else{

p=complex<double>((8.0*a[4]*a[2]-3.0*pow(a[3],2))/(8.0*pow(a[4],2)));
q=complex<double>((pow(a[3],3)-4.0*a[4]*a[3]*a[2]+8.0*pow(a[4],2)*a[1])/(8.0*pow(a[4],3)));
r=complex<double>((16.0*a[4]*pow(a[3],2)*a[2]+256.0*pow(a[4],3)* a[0]-3.0*pow(a[3],4)-64.0*pow(a[4],2)*a[3]*a[1])/(256.0*pow(a[4],4)));

for(i=1;i<=4;i++)
x[i]=complex<double>(-a[3]/(4.0*a[4]));

ua[3]=complex<double>(1.0,0.0);
ua[2]=-p;
ua[1]=-4.0*r;
ua[0]=4.0*p*r-pow(q,2);

cubic(ua,ux);

if(abs(ux[1]-p)<eps){

b1[2]=complex<double>(1.0,0.0);
b1[1]=p;
b1[0]=r;

quadratic(b1,x1);

x[1]-=sqrt(x1[1]);
x[2]+=sqrt(x1[1]);
x[3]-=sqrt(x1[2]);
x[4]+=sqrt(x1[2]);

}
else{

b1[2]=complex<double>(1.0,0.0);
b1[1]=-sqrt(ux[1]-p);
b1[0]=complex<double>(ux[1]/2.0)+complex<double>(q*sqrt(ux[1]-p)/(2.0*(ux[1]-p)));

b2[2]=complex<double>(1.0,0.0);
b2[1]=sqrt(ux[1]-p);
b2[0]=complex<double>(ux[1]/2.0)-complex<double>(q*sqrt(ux[1]-p)/(2.0*(ux[1]-p)));

quadratic(b1,x1);
quadratic(b2,x2);

x[1]+=x1[1];
x[2]+=x1[2];
x[3]+=x2[1];
x[4]+=x2[2];

}

n=4;
return n;
}
}

numerycznie znajdziesz na stronie bosaka

ODPOWIEDZ