[Pascal] Pierwiastek wielomianu W(x)

0

Próbowałem napisać program liczący pierwiastek wielomianu W(x).
Chyba wiecie co to takiego^^
Dla niekumatych:
Pierwiastek wielomianu to taki dzielnik wyrazu wolnego tego wielomianu, który podstawiony w miejsce x, sprawi że cały wielomian będzie miał wartość 0.

No i mam pytanie...
Co tu musze poprawić, aby to działało;)

uses CRT;
var
x:array[1..10] of integer; {tablica z 'liczbami przed x;)' kolejnych poteg}
z:array[1..10] of shortint; {znaki + -}
wyraz:integer; {wyraz wolny}
zwyraz:integer; {znak wyrazu wolnego}
p:integer; {zmienna pomocnicza do wczytania wartosci z tablicy}
o:integer; {zmienna dla funkcji for}
i:integer; {zmienna dla funkcji for}
k:integer; {zmienna pomocnicza dla potegowania}
wynik:integer; {zmienna przechowywujaca aktualny wynik}
dzielnik:integer; {zmienna przechowywujaca aktualny dzielnik}
procedure wielomian; {procedura wyswietlajaca wielomian}
begin
 for o:=10 downto 1 do {licznik kolejnych poteg}
 begin
  if x[o]=0 then
   continue; {jesli dana potega nie wystepuje przejscie do kolejnej}
  if z[o]=0 then
   write('-'); {wypisanie znaku}
  if z[o]=1 then
   write('+'); {j.w.}
  write(x[o],'x^',o); {wypisanie wartosci wyrazu}
 end;
 if zwyraz=0 then
   write('-'); {wypisanie znaku wyrazu wolnego}
 if zwyraz=1 then
   write('+'); {j.w.}
 write(wyraz); {wypisanie wartosci wyrazu wolnego}
end;

procedure licz; {funkcja liczaca wartosc wielomianu dla podanego dzielnika} {!!!}
begin
 wynik:=0; {wyzerowanie wyniku}
 for i:=10 downto 1 do
  begin
  p:=x[i]; {pobranie 'liczby przed x'}
  if z[i]=0 then
   p:=p*(-1); {zmiana jej znaku jesli jest ujemna}
  k:=dzielnik; {przypisanie do zmiennej k wartosci dzielnika}
  if i>1 then {jesli potega jest wieksza niz 1 wykonac potegowanie}
   begin
   for o:=2 to i do
   k:=k*k; {cos jakby potegowanie}
   p:=p*k; {pomnozenie wyniku potegowania dzielnika i 'liczby przed x'}
   end;
  if k=1 then {jesli potega = 1 to tylko wykonanie mnozenia}
   p:=p*k;
  wynik:=wynik+p; {dodanie wyniku poprzednich dzialan do calkowitego wyniku}
  write(wynik); {wypisanie wyniku}
  writeln('Nacisnij enter');
  readln;
  end;
end;
begin
 for o:=10 downto 1 do {pobranie 'liczby przed x' oraz jej znaku dla wszystkich poteg od 10 do 1}
  begin
   writeln('Podaj wartosc wyrazu z potega ',o,' jesli nie istnieje wpisz 0');
   readln(p);
   x[o]:=p;
   if p=0 then
    continue;
   writeln('Podaj znak wyrazu ktorego wartosc podales przed chwila;p');
   writeln('dla - wpisz 0, a dla + 1');
   readln(z[o]);
  end;
 writeln('Podaj wartosc wyrazu wolnego'); {pobranie wartosci wyrazu wolnego}
 readln(wyraz);
 writeln('Podaj znak wyrazu wolnego + = 1, - = 0'); {i jego znaku}
 readln(zwyraz);
 writeln;
 wielomian; {wypisanie wielomianu}
 writeln;
 writeln('Nacisnij enter');
 readln;
 clrscr;
 for i:=1 to wyraz do {dla kazdej liczby od 1 do wyrazu wolnego}
  begin
  if (wyraz mod i)=0 then {jesli reszta z dzielenia wyrazu przez i wynosi 0 to i jest dzielnikiem wyrazu wolnego}
   begin
   writeln('Dzielnikiem wyrazu ',wyraz,' jest liczba ',i, ' oraz -',i);
   dzielnik:=i; {ustawienie zmiennej dzielnik dla procedury licz}
   write('Wartosc wyrazenia ');
   wielomian; {wypisanie wartosci wyrazenia}
   write(' dla x rownego ',i,' wynosi');
   licz; {wypisanie wyniku wyrazenia}
   if wynik=0 then {jesli wynik jest rowny 0, a wiec i jest pierwiastkiem wielomianu to program przerywa dalsze szukanie}
   break;
   writeln;
   writeln;
   end;
  end;
 writeln;
 writeln('Nacisnij enter');
 readln;
end.
0

Raczej nikt Ci nie będzie poprawiał kodu, tym bardziej, że do najkrótszych on nie należy. Mnie na przykład wykręca jak widzę kod powyżej 10 linijek.

Przyjrzyj się schematowi Hornera.

0

Pierwiastek wielomianu nie jest zdefiniowany jako dzielnik wyrazu wolnego.

Dowód

wielomian: w(x) = x2 + x - 1,
albo: q(x) = x4 + x3 + x2 + x - 8
itd.

0

Wikipedia:
Pierwiastek wielomianu (albo miejsce zerowe wielomianu) jest to taka liczba (lub n-tka liczb w przypadku wielomianu wielu zmiennych), dla której wartość wielomianu wynosi zero.
Nic tu nie ma o dzielnikach wyrazu wolnego - tak dla niekumatych - czasem tak jest ale nie jest to regułą co pokazał kolega wczesniej. Pytanie brzmi czy masz zrobić program na tej zasadzie, czy też sam sobie go tak uprościłeś.
Co do kodu - może znajdzie się desperat, ale nieco za długie by mi siechciało czytać i dociekać co ty tam zrobiłeś.
Andrzej Dąbrowski

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