Dzielenie wielomianów

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

Dzielenie wielomianów, pisemne dzielnie wielomianówalgorytm dzielenia jednego wielomianu przez drugi niezerowy o tym samym lub niższym stopniu. Algorytm ten jest odpowiednikiem algorytmu dzielenia pisemnego liczb naturalnych z tą różnicą, że kolejne potęgi liczby 10 (dla systemu dziesiętnego) tu są zastąpione kolejnymi potęgami zmiennej; inaczej mówiąc tutaj rolę cyfr pełnią kolejne jednomiany dzielonych wielomianów.

Jeśli mamy wielomiany A,B oraz B jest niezerowy, to rezultatem dzielenia A przez B jest iloraz Q i reszta R. Stąd

A=BQ+R.

Reszta jest wielomianem stopnia niższego niż wielomian B, w szczególności może być wielomianem zerowym.

Opis algorytmu

Podczas procesu dzielenia wielomiany są uporządkowane wg malejących potęg zmiennej, jednomiany mające współczynnik 0 muszą być wyszczególnione w ciągu jednomianów (pełnią one analogiczną rolę jak cyfry 0 w ciągu cyfr zapisu pozycyjnego liczb).

Należy podzielić wielomian A przez B. Celem jest znalezienie wielomianów Q i R.

Algorytm rozpoczyna się od przyjęcia R0:=A, tzn. jako resztę R0 przyjmuje się dzielną A, oraz Q:=0.

Następnie algorytm wykonuje się w cyklu:

  1. Bieżącą resztę Ri dzieli się przez dzielną B. Dzielenie to polega na podzieleniu „najstarszego” jednomianu reszty Ri przez „najstarszy” jednomian dzielnej B. Wynik tego dzielenia jest kolejnym jednomianem qi powstającego ilorazu Q, tzn. Q:=Q+qi.
  2. Dzielną B mnoży się przez jednomian qi i otrzymany iloczyn qiB odejmuje się od bieżącej reszty Ri. Przyjmujemy Ri+1=RiqiB.
  3. Algorytm jest zakończony, gdy reszta Ri+1 zerowa bądź ma stopień niższy od stopnia wielomianu B, w przeciwnym razie wracamy do punktu 1. przyjmując Ri+1 jako bieżącą resztę.

Jeśli ostatnia reszta jest zerowa, to wielomian B jest dzielnikiem wielomianu A. Jeśli ostatnia reszta jest niezerowa, to jest to reszta R z dzielenia A przez B.

Iloraz Q jest sumą jednomianów qi powstających przy każdym przebiegu cyklu.

Przykład

Znaleźć iloraz oraz resztę dzielenia x32x24, przez x3.

Dzielna jest na początek przepisana jako:

x32x2+0x4.

Iloraz oraz reszta mogą być określone następująco:

Dzielimy pierwszy człon dzielnej przez najwyższy człon dzielnika. Wpisujemy rezultat nad kreskę (x3÷x=x2).

x32x2x32x2+0x4:x3

Mnożymy dzielnik przez właśnie otrzymany rezultat (pierwszy człon ilorazu). Wpisujemy rezultat poniżej pierwszych dwu członów dzielnej.

x32x2x32x2+0x4:x3x33x2

Odejmujemy otrzymany iloraz od odpowiednich członów oryginalnej dzielnej (należy pamiętać, że odejmowanie czegoś mającego znak minus odpowiada dodaniu czegoś ze znakiem plus), i zapisujemy rezultat pod spodem. Następnie „sprowadzamy” następny człon dzielnej.

x32x2x32x2+0x4:x3x33x2+0x_x3+0x2+0x

Powtarzamy poprzednie trzy kroki, tylko tym razem używamy dwóch członów, które zostały zapisane jako dzielna.

x32x2+1x+3x32x2+0x4:x3x33x2+0x_x3+2x2+0x4x3+2x23x4_x32x2+3x4

Powtarzamy 4. Tym razem nie ma nic do sprowadzenia.

x32x2+1x+3x32x2+0x4:x3x33x2+0x_x3+2x2+0x4x3+2x23x4_x32x2+3x4x32x2+3x9_x32x2+0x+5

Wielomian powyżej kreski jest ilorazem q(x), a liczba, która pozostała, czyli 5, jest resztą r(x).

x32x24=(x3)(x2+x+3)q(x)+5r(x)

Kod

void divPoly(double *Q, double *R, const double *A, const double *B, int &degQ, int &degR, const int degA, const int degB)
{
        const double Eps = 1e-14;
        for (int i = 0; i <= degA; i++)
                R[i] = A[i];
        degQ = degA - degB;
        degR = degB - 1;
        for (int j = 0; j <= degQ; j++)
        {
                Q[degQ - j]  = R[degA - j] / B[degB];
                for (int i = degA - j; i >= degQ - j; i--)
                        R[i] -= Q[degQ - j] * B[i - degQ + j];
        }
        for (int i = degR - 1; i>=0; i--)
                if (fabs(R[i])<Eps) R[i] = 0;
}

Linki zewnętrzne

Szablon:Wikibooks

Polskojęzyczne
Anglojęzyczne

Szablon:Wielomiany