Rozwiązywanie zadań dotyczących wielomianów z wykorzystaniem

Transkrypt

Rozwiązywanie zadań dotyczących wielomianów z wykorzystaniem
Rozwiązywanie zadań dotyczących wielomianów
z wykorzystaniem języka programowania C++
Rafał Świetlicki
W szkole średniej w klasach z rozszerzoną informatyką realizację niektórych tematów z
matematyki można, a nawet wskazane jest powiązać z programowaniem algorytmów uproszczającym
rozwiązywanie wybranych zadań. Jednym z działów, w których można rozwiązywać zadania poprzez
pisanie programów komputerowych służących do ich rozwiązania są wielomiany. Chciałbym poprzez ten
artykuł zaprezentować sposoby rozwiązywania niektórych zadań dotyczących wielomianów z
wykorzystaniem języka programowania C++. Wśród wielu algorytmów powiązanych z wielomianami
najpopularniejszym jest algorytm Hornera. Jego zastosowania to:
* obliczanie wartości wielomianu dla danego argumentu;
* sprawdzanie, czy dana liczba jest pierwiastkiem wielomianu;
* sprawdzanie krotności pierwiastka wielomianu;
* wyznaczanie pierwiastków całkowitych wielomianu o współczynnikach całkowitych;
* dzielenie wielomianu przez dwumian;
* obliczanie wartości dziesiętnej liczby naturalnej zapisanej w innym niż dziesiątkowy systemie
liczbowym.
Implementacja tego algorytmu w języku C++ może być następująca:
double Horner(double* wsp, int st, double x)
{
double rob=*wsp;
for(int i=1;i<=st;i++) rob=rob*x+wsp[i];
return rob;
}
Argumenty tej funkcji to odpowiednio: adres tablicy, w której przechowywane są współczynniki
wielomianu, stopień tego wielomianu oraz argument, dla którego obliczana jest wartość wielomianu.
Wynikiem funkcji jest ta wartość.
Przykładowe zadania.
Zadanie 1. Oblicz wartość wielomianu w( x ) = −2 x 4 + 5 x 3 − 7 x 2 + x − 6 dla argumentów:
a) -5; b) 4; c) -1.
Zadanie 2. Sprawdź, która z liczb: a) -1;
w( x ) = x 3 − 4 x 2 + x + 6 .
b) -2;
c) 3
jest pierwiastkiem wielomianu:
Rozwiązywanie równania wielomianowego, w którym występujący wielomian jest wielomianem
o współczynnikach całkowitych rozpoczyna się przeważnie od znalezienia (o ile istnieje) całkowitego
pierwiastka tego wielomianu będącego zgodnie ze znanym twierdzeniem dzielnikiem wyrazu wolnego
tego wielomianu. Komputerowe rozwiązanie takiego równania można oprzeć na następującym kodzie
powiązanym z powyższą funkcją Horner:
bool CzyPierwiastek(double* wsp, int st, double x)
{
if(Horner(wsp,st,x)==0) return 1; else return 0;
}
Funkcja ta zwraca informację, czy liczba x jest pierwiastkiem danego wielomianu. Na bazie tej funkcji
można zbudować drugą funkcję, która będzie wyznaczać całkowite pierwiastki równania
wielomianowego z wielomianem o współczynnikach całkowitych. Funkcja ta uwzględnia ewentualność
zerowej wartości wyrazu wolnego i wtedy wykorzystuje metodę wyłączenia maksymalnej potęgi
niewiadomej przed nawias dającej zerowe rozwiązanie równania.
void Rownanie(double* wsp, int st)
{
int index=st;
while(wsp[index]==0) index--;
if(index<1) return;
int wolny=wsp[index];
if(wolny<0) wolny=-wolny;
cout<<"Pierwiastki rownania: ";
{
if(index<st) cout<<"0 ";
for(int i=1;i<=wolny;i++)
if(wolny%i==0)
{
if(CzyPierwiastek(wsp,st,i)==1) cout<<i<<' ';
if(CzyPierwiastek(wsp,st,-i)==1) cout<<-i<<' ';
}
}
}
Zadanie.
Rozwiąż równania:
a) x 3 − 4 x 2 + x + 6 = 0 ;
b) x 3 − 7 x + 6 = 0 ;
c) x 3 + 2 x 2 + 3 x + 6 = 0 ;
d) x 5 − 4 x 3 = 0 .
Jak zostało wspomniane powyżej, algorytm Hornera można również wykorzystać do sprawdzania
krotności pierwiastka wielomianu. Sprawdzenie to można zrealizować poprzez następującą funkcję:
int Krotnosc(double* wsp, int st, double x)
{
int ile=st;
double rob;
rob=*wsp;
while(ile>0&&CzyPierwiastek(wsp,ile,x))
{
for(int i=1;i<=ile;i++)
wsp[i]+=wsp[i-1]*x;
ile--;
}
return st-ile;
}
Lista parametrów funkcji jest analogiczna jak w funkcji Horner. Wynikiem jest krotność pierwiastka x
(w szczególności zero, jeżeli liczba x nie jest pierwiastkiem wielomianu).
Zadanie.
Sprawdź, czy liczba x jest pierwiastkiem wielomianu w(x), a jeżeli tak, to określ jego krotność:
a) w( x ) = x 4 − 4 x 3 + 7 x 2 − 12 x + 12, x = 2 ;
b) w( x ) = x 3 + 3 x 2 + 3 x + 1, x = −1 ;
c) w( x ) = x 5 − x 2 + x + 2, x = −2 .
Na koniec chciałbym jeszcze zaprezentować funkcję obliczającą wartość dziesiętną liczby naturalnej
zapisanej w dowolnym systemie liczbowym reprezentowaną poprzez ciąg znaków przy założeniu, że
maksymalna podstawa systemu liczbowego jest równa 16 oraz że cyfry w systemach wyższych niż
dziesiętny są zapisywane przy użyciu dużych liter alfabetu.
int System(char* liczba, int podstawa)
{
int rob=0;
char* wsk=liczba;
while(*wsk!=NULL)
{
if(*wsk>='0'&&*wsk<='9') rob=rob*podstawa+(*wsk-'0');
if(*wsk>='A'&&*wsk<='F') rob=rob*podstawa+(*wsk-'A')+10;
wsk++;
}
return rob;
}
Zadanie.
Oblicz wartość dziesiętną liczb:
a) 1101001101(2);
b) AF1C(16).

Podobne dokumenty