wymierne miejsca zerowe wielomianu

0

Próbowałem napisać program(kod poniżej) wyznaczający wymierne miejsca zerowe wielomianu dowolnego stopnia, niestety nie wiem czemu otrzymywany wynik wyświetla się wielokrotnie ( konkretnie powtarza się w nieskończoność). Jeśli ktoś pomógłby mi znaleźć bląd byłbym bardzo wdzięczny :)

Gdyby ktoś nie znał albo zapomniał w jaki sposób wyznacza się pierwiastki (miejsca zerowe) wielomianu, poniżej opisuję przebieg działania:
Aby znaleźć wymierne pierwiastki wielomianu najpierw musimy znaleźć wszystkie dzielniki współczynnika przy najwyższej potędze (oznaczmy je zbiorem A) a następnie tego przy najniższej (zbiór B). Kolejnym krokiem jest wyliczenie możliwych liczb "z" powstałych poprzez podzielenie liczby ze zbioru A przez liczbę ze zbioru B. Ostatnim etapem jest sprawdzenie czy po podstawieniu do wielomianu liczby "z" lub "-z" w miejsce x-ów otrzymujemy wartość 0. Jeśli tak, liczba "z" lub analogicznie "-z" jest pierwiastkiem równania.
Próbowałem napisać program (kod poniżej) wyznaczający wymierne miejsca zerowe wielomianu dowolnego stopnia, niestety nie wiem czemu otrzymywany wynik wyświetla się wielokrotnie ( konkretnie powtarza się w nieskończoność). Jeśli ktoś pomógłby mi znaleźć bląd byłbym bardzo wdzięczny :)

Gdyby ktoś nie znał albo zapomniał w jaki sposób wyznacza się pierwiastki (miejsca zerowe) wielomianu, poniżej opisuję przebieg działania:
Aby znaleźć wymierne pierwiastki wielomianu najpierw musimy znaleźć wszystkie dzielniki współczynnika przy najwyższej potędze (oznaczmy je zbiorem A) a następnie tego przy najniższej (zbiór B). Kolejnym krokiem jest wyliczenie możliwych liczb "z" powstałych poprzez podzielenie liczby ze zbioru A przez liczbę ze zbioru B. Ostatnim etapem jest sprawdzenie czy po podstawieniu do wielomianu liczby "z" lub "-z" w miejsce x-ów otrzymujemy wartość 0. Jeśli tak, liczba "z" lub analogicznie "-z" jest pierwiastkiem równania.

#include <cstdlib>
#include <iostream>
#include <math.h>
 
using namespace std;

  int k=2,i,j; // k- ilosc wyrazow-1
  long double z,s=0;
  int t[2][3]; // pierwszy wiersz- wspolczynniki przy wyrazach, drugi wiersz- potegi przy wyrazach
int main()
{
	
  for (int m=0;m<=k;m++)
{
	cout<<"podaj "<<m+1<<" wspolczynnik ";
	cin>>t[0][m]; // wspolczynnik
	cout<<"podaj stopien wyarzu prz tym wspolczynniku ";
	cin>>t[1][m]; // stopien
}
for (i=1;i<=t[0][k];i++) //szukanie dzielnikow k'tego wspolczynnika
{
	if (t[0][k]%i==0)
	{
		for(j=1;j<=t[0][0];j++) //szukanie dzielnikow pierwszego wspolczynnika 
		{
			if(t[0][0]%j==0)
			{
			z=i/j; //z- mozliwy pierwiastek
			for (i=0;i<=k;i++) //petla liczaca wartosc(s) wielomianu W(z)
				{
				if (t[1][i]==0)	s=s+t[0][i];
		    	else s=s+t[0][i]*pow(z,t[1][i]);
				}
			if (-0.0000000000001<s<0,0000000000001) cout<<z<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(z)~0 oraz wypisanie pierwiastka jesli true

			s=0; //zerowanie wartosci wielomianu W(z)
			for (i=0;i<=k;i++) // petla liczaca wartosc(s) wielomianu W(-z)
				{
				if (t[1][i]==0)	s=s+t[0][i];
		  		else s=s+t[0][i]*pow(-z,t[1][i]);
				}
				if (-0.0000000000001<s<0,0000000000001) cout<<"-"<<z<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(z)~0 oraz wypisanie pierwiastka jesli true
				
			
			}
			
		}
	}
}
 
  system("pause");
  return 0;
}
1

-0.0000000000001<s<0,0000000000001 - tutaj masz przecinek zamiast kropki; a najlepiej to po prostu napisz abs(s) < 0.00001, nie ma co się cackać w mniejsze liczby.

0

Dzięki za ten przecinek, funkcji abs nie użyłem ponieważ pojawiał się problem z liczeniem jej z liczby zmiennoprzecinkowej. Usunąłem 2 zbędne wersy i dodałem zmienną c=-z, niestety teraz program nie wyświetla nic. Gdyby ktoś miał czas i chęci sprawdzić nowy kod podaje poniżej

#include <cstdlib>
#include <iostream>
#include <math.h>
 
using namespace std;

  int k=2,i,j; // k- ilosc wyrazow-1
  long double c,z,s=0;
  int t[2][3]; // pierwszy wiersz- wspolczynniki przy wyrazach, drugi wiersz- potegi przy wyrazach
int main()
{
	
  for (int m=0;m<=k;m++)
{
	cout<<"podaj "<<m+1<<" wspolczynnik ";
	cin>>t[0][m]; // wspolczynnik
	cout<<"podaj stopien wyarzu prz tym wspolczynniku ";
	cin>>t[1][m]; // stopien
}
for (i=1;i<=t[0][k];i++) //szukanie dzielnikow k'tego wspolczynnika
{
	if (t[0][k]%i==0)
	{
		for(j=1;j<=t[0][0];j++) //szukanie dzielnikow pierwszego wspolczynnika 
		{
			if(t[0][0]%j==0)
			{
			z=i/j; //mozliwy pierwiastek
			c=-1*z; //mozliwy pierwiastek
			for (i=0;i<=k;i++) s=s+t[0][i]*pow(z,t[1][i]);//petla liczaca wartosc(s) wielomianu W(z)
				
			if (-0.0001<s<0.0001) cout<<z<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(z)~0
			
			s=0; //zerowanie wartosci wielomianu W(z)
			for (i=0;i<=k;i++) s=s+t[0][i]*pow(c,t[1][i]); // petla liczaca wartosc(s) wielomianu W(c)
			
			if (-0.0001<s<0.0001) cout<<c<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(c)~0
				
			}
			
		}
	}
}
 
  system("pause");
  return 0;
}
0

funkcji abs nie użyłem ponieważ pojawiał się problem z liczeniem jej z liczby zmiennoprzecinkowej

Problem to może se powiedzieć pani w okienku w jakimś biurze - co się konkretnie działo?

Błąd wciąż masz tu: -0.0001<s<0.0001 zastanów się, co to robi. Tak z głową, po kolei.

0

Zmieniłem zapis if-a, co niestety nie zmieniło faktu że program nie działa poprawnie. postanowiłem sprawdzać kod po kolej aby znaleźć miejsce błędu. W momencie wyliczania z i c wszystko jest jeszcze ok, wypisane zostają wszystkie możliwe pierwiastki. Sprawdzając kolejną część użyłem cout aby wypisał otrzymane s, program (dla wielomianu
x^2-7x+10 o możliwych pierwiastkach:+-10;+-5;+-2 w tym poprawne +2 i +5) wypisuje wartość 4 w "nieskończoność".

#include <cstdlib>
#include <iostream>
#include <math.h>
 
using namespace std;

  int k=2,i,j; // k- ilosc wyrazow-1
  long double c,z,s=0;
  int t[2][3]; // pierwszy wiersz- wspolczynniki przy wyrazach, drugi wiersz- potegi przy wyrazach
int main()
{
	
  for (int m=0;m<=k;m++)
{
	cout<<"podaj "<<m+1<<" wspolczynnik ";
	cin>>t[0][m]; // wspolczynnik
	cout<<"podaj stopien wyarzu prz tym wspolczynniku ";
	cin>>t[1][m]; // stopien
}

for (i=1;i<=t[0][k];i++) //szukanie dzielnikow k'tego wspolczynnika
{
	if (t[0][k]%i==0)
	{
		for(j=1;j<=t[0][0];j++) //szukanie dzielnikow pierwszego wspolczynnika 
		{
			if(t[0][0]%j==0)
			{
			z=i/j; //mozliwy pierwiastek
			c=-1*z; //mozliwy pierwiastek
			
			for (i=0;i<=k;i++) s=s+t[0][i]*pow(z,t[1][i]);//petla liczaca wartosc(s) wielomianu W(z)
			cout<<s<<endl;
                        /*	
			if (s<0.0001 && s>-0.0001) cout<<z<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(z)~0
			
			s=0; //zerowanie wartosci wielomianu W(z)
			
			for (i=0;i<=k;i++) s=s+t[0][i]*pow(c,t[1][i]); // petla liczaca wartosc(s) wielomianu W(c)
			
			if (s<0.0001 && s>-0.0001) cout<<c<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(c)~0
			*/
			}
			
		}
	}
}

  system("pause");
  return 0;
}
0

Sprawdziłem też samą pętle liczącą s podstawiając za "z" 2 a następnie 5, dla obu argumentów podała poprawną wartość 0.

0

W tym momencie program już wypisuje jeden z dwóch pierwiastków przykładowego wielomianu [x^2-7x+10] - 5 jednak w dalszym ciągu wyświetla go w nieskończoność :/

 
 #include <cstdlib>
#include <iostream>
#include <math.h>
 
using namespace std;

  int k=2,i,j; // k- ilosc wyrazow-1
  long double c,z,s=0;
  int t[2][3]; // pierwszy wiersz- wspolczynniki przy wyrazach, drugi wiersz- potegi przy wyrazach
int main()
{
	
  for (int m=0;m<=k;m++)
{
	cout<<"podaj "<<m+1<<" wspolczynnik ";
	cin>>t[0][m]; // wspolczynnik
	cout<<"podaj stopien wyarzu prz tym wspolczynniku ";
	cin>>t[1][m]; // stopien
}

for (i=1;i<=t[0][k];i++) //szukanie dzielnikow k'tego wspolczynnika
{
	if (t[0][k]%i==0)
	{
		for(j=1;j<=t[0][0];j++) //szukanie dzielnikow pierwszego wspolczynnika 
		{
			if(t[0][0]%j==0)
			{
			z=i/j; //mozliwy pierwiastek
			c=-1*z; //mozliwy pierwiastek
			
			for (i=0;i<=k;i++) s=s+t[0][i]*pow(z,t[1][i]);//petla liczaca wartosc(s) wielomianu W(z)
			
			if (s<0.0001 && s>-0.0001) cout<<z<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(z)~0
			
			s=0; //zerowanie wartosci wielomianu W(z)
			
			for (i=0;i<=k;i++) s=s+t[0][i]*pow(c,t[1][i]); // petla liczaca wartosc(s) wielomianu W(c)
			
			if (s<0.0001 && s>-0.0001) cout<<c<<" jest pierwiastkiem tego wielomianu"<<endl; //sprawdzenie czy W(c)~0
			s=0; //zerowanie wartosci wielomianu W(z)

			}
			
		}
	}
}

  system("pause");
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1