Czy ?
Poszukiwanie pierwiastków wielomianu jest jednym z podstawowych zagadnień rozważanych we wszystkich naukach ścisłych. W tym artykule zajmiemy się czymś znacznie prostszym: sprawdzaniem, czy dana liczba jest pierwiastkiem zadanego wielomianu.
Mając dany wielomian i konkretną wartość parametru chcemy więc sprawdzić, czy Można by spytać, czy nie wystarczy w tym celu podstawić wartość i na tym skończyć? Rzeczywiście, jeśli mamy do czynienia z „nieskomplikowanym” wielomianem (cokolwiek by to miało znaczyć) i „sensownym” parametrem to problem jest trywialny. Może się jednak okazać, że nasze dane nie są „nieskomplikowane i sensowne”, ale za to możemy wesprzeć się domowym komputerem...
Przede wszystkim należy sprecyzować, jakimi liczbami zamierzamy się zajmować. Aha, a więc to tutaj tkwi haczyk! Podejrzliwy Czytelnik zapewne domyśla się już, że za moment wkroczymy w mroczny świat komputerowych reprezentacji liczb rzeczywistych, z przybliżeniami, cechami, mantysami i wszędobylskimi epsilonami. Faktycznie, komputerowe sprawdzenie równości w liczbach rzeczywistych nastręcza pewnych trudności i jest istotnym zagadnieniem w dziedzinie metod numerycznych. My jednak nie będziemy się w to tutaj wgłębiać i założymy, że mamy do czynienia wyłącznie z liczbami całkowitymi. Czy w takim razie problem zawiera w sobie jeszcze jakąś trudność? Owszem.
Otóż nieprzyjemne jest to, że przy obliczaniu szybko zaczynamy mieć do czynienia z bardzo dużymi liczbami. I to nawet wtedy, gdy współczynniki są niewielkie, co dla informatyka znaczy, że co do wartości bezwzględnej nie przekraczają dwóch miliardów (orientacyjne ograniczenie standardowego typu całkowitego 32-bitowego ze znakiem; faktycznie jest to czyli trochę więcej). Rzeczywiście, bez trudu widzimy, że jednym z pierwiastków wielomianu:
jest ale jeśli chcielibyśmy to sprawdzić, wykonując proste podstawienie, musielibyśmy operować na liczbach zawierających 1000 cyfr. Nawet osoba niezaznajomiona z komputerem łatwo zauważy, że obliczenia na takich długaśnych liczbach muszą być w jakimś sensie trudniejsze. Tak jest w istocie: wykonywanie operacji na dużych liczbach jest powolne, a do tego bywa wyjątkowo niewygodne, jeśli akurat natrafimy na system czy język programowania, który dostarcza implementacje działań jedynie na wbudowanych typach całkowitych, co zazwyczaj oznacza liczby 64-bitowe (ze znakiem), czyli mniejsze co do wartości bezwzględnej niż No dobrze, ale my chcemy tylko sprawdzić, czy a niekoniecznie od razu obliczyć dokładną wartość – to przecież musi być prostsze! I rzeczywiście: poniżej opisujemy krótką i elegancką metodę rozwiązującą ten problem.
Załóżmy, że – z przypadkiem łatwo sobie poradzić, sprawdzając, czy Chcemy stwierdzić, czy:
równoważnie czy:
Lewa strona jest podzielna przez a zatem prawa też musi dzielić się przez Otrzymujemy pierwszy warunek konieczny na to, żeby było pierwiastkiem :
(1) |
Jeśli on zachodzi, możemy całą równość podzielić przez otrzymując:
Ta sytuacja jest podobna do poprzedniej. Przerzucamy na drugą stronę:
i otrzymujemy drugi warunek konieczny:
(2) |
Następnie znów dzielimy obie strony równości przez i kontynuujemy to postępowanie, aż po lewej stronie pozostanie samo Po drodze otrzymamy kolejne warunki konieczne na to, żeby było pierwiastkiem wielomianu na przykład trzeci z nich będzie postaci:
(3) |
Na końcu zaś wystarczy sprawdzić, czy:
(4) |
W ten sposób uzyskujemy następujący pseudokod, w którym sprawdzamy kolejno warunki (1), (2), (3) itd., a na końcu (4).
Zauważmy, że wartość zmiennej nigdy nie przekroczy sumy wartości bezwzględnych liczb więc nie będziemy mieć do czynienia z żadnymi dużymi liczbami. Czyli pełny sukces!
Na zakończenie warto dodać, że podany problem można także rozwiązać za pomocą tak zwanego schematu Hornera, w którym wykorzystujemy następujące przedstawienie:
Wystarczy mianowicie próbować obliczyć zgodnie z tym schematem, od lewej do prawej – na przemian mnożymy przez i dodajemy – przy czym obliczenia przerywamy, jeśli aktualna wartość staje się zbyt duża. Wiemy wówczas, że na pewno wynikiem nie będzie zero. A to, jaka jest ta graniczna wartość, przy której możemy od razu udzielić odpowiedzi negatywnej, pozostawiamy do rozstrzygnięcia Czytelnikowi.