18 1. KiUta rsgidnieri elementarnej teorii lierb
Wreszcie misze oszacowanie może być zapisane za pomocą n i m, jeśli pamiętamy wzór na liczbę cyfr, z którego wynika, że k « [log2w] *f I ^
log// log 2
logm log 2
+ 1 i / aa [log2 m] + 1
Przykład 6, Znajdźmy ograniczenie górne liczby operacji na bitach potrzebnych do obliczenia «!.
Rozwiązanie. Użyjemy następującego algorytmu. Najpierw pomnożymy 2 przez 3, potem wynik przez 4, następny wynik przez 5 itd., aż wreszcie dojdziemy do n. W (J — l)-ym kroku (J = 2, 3, ..., n — 1) mnożymy j\ przez j + 1. Mamy więc n — 2 kroków; w każdym kroku mnożymy częściowy iloczyn (tzn. /!) przez następną liczbę. Częściowe iloczyny robią się coraz większe. W najgorszym przypadku możemy przyjąć, że liczba bitów częściowego iloczynu będzie taka jak liczba bitów ostatniego iloczynu, tzn. liczby ni.
Aby znaleźć liczbę bitów iloczynu wykorzystamy to, że liczba bitów w iloczynie dwóch liczb jest albo równa sumie liczb bitów obu czynników, albo jest od tej sumy mniejsza o 1 (porównaj omówienie algorytmu mnożenia). Wynika stąd, żc iloczyn n liczb fc-bitowych ma co najwyżej nk bitów. Zatem, jeśli n jest liczbą fc-bitową - z czego wynika, że każda liczba mniejsza od n ma co najwyżej k bitów - to n\ ma co najwyżej nk bitów.
Wobec tego w każdym zn-2 mnożeń potrzebnych do obliczenia n\ mnożymy liczbę co najwyżej fc-bitową (mianowicie liczbę j + 1) przez liczbę mającą co najwyżej nk bitów (mianowicie liczbę _/!). To wymaga co najwyżej nk2 operacji na bitach. Musimy wykonać to n — 2 razy. Zatem łączna liczba operacji na bitach jest ograniczona przez (n - 2)nk2 = n(n - 2)([log2 n] + l)2. Z grubsza biorąc, to ograniczenie w przybliżeniu wynosi nł(log2«)2.
Przykład 7. Znajdźmy ograniczenie górne liczby operacji na bitach potrzebnych do pomnożenia wielomianu Zatx* stopnia nie większego niż nx przez wielomian LbjXJ stopnia nie większego niż n2, przy czym współczynniki obu wielomianów są liczbami całkowitymi nieujemnymi mniejszymi lub równymi m. Załóżmy, że n2 ^ nv
Rozwiązanie. Aby obliczyć £ a{bp czyli współczynnik przy xv w iloczynie
j+j*»
wielomianów (gdzie 0 < v < nx + n2), potrzebujemy n2 + 1 mnożeń i n2 dodawań. Liczby, które mnożymy, są ograniczone przez m, a liczby, które dodajemy, są ograniczone przez m2; ale ponieważ musimy dodawać kolejne liczby do sumy częściowej tych liczb, musimy przyjąć n2m2 jako ograniczenie górne wielkości dodawanych liczb. Zatem w obliczeniu współczynnika stojącego przy xv liczba operacji na bitach wyniesie co najwyżej
(n2 + l)(log2m + l)2 + n2 (log2 (n2m2) + 1).
Ponieważ liczba v może przyjąć jedną z nt + n* *f 1 wartości, więc szukanym ograniczeniem czasu mnożenia wielomianów jest
(«i + n2 + 1)((hz + l)(log 2m + \f + n2(Iog2(n2m2) +1)).
Otrzymamy trochę mniej dokładne ograniczenie, usuwając z tego wzoru jedynki, przez co wzór przyjmie bardziej zwartą postać:
+ (Iogn2 + 21ogm) j.
s/n2 (co
Uwaga. Jeśli przyjmiemy n = nl^n2 oraz założymy, że m ^ 16 i m > yfn2
na ogół jest spełnione w praktyce), to ostatnie wyrażenie może być zastąpione znacznie prostszym 4n2 (log2m)2. Ten przykład świadczy o tym, że na ogół nie istnieje „właściwa odpowiedź” na pytanie o oszacowanie czasu potrzebnego do wykonania danego zadania. Chcemy mieć wynik w postaci względnie prostej funkcji danych (w tym przypadku nvn2 i m), dającej ograniczenie górne, które dla większości danych jest w przybliżeniu tego samego rzędu wielkości co liczba operacji na bitach rzeczywiście potrzebnych w praktyce. Z tego powodu w przykładzie 7 nie chcielibyśmy zastąpić naszego oszacowania przez powiedzmy 4n2m, gdyż dla dużych m dałoby to oszacowanie czasu o wiele rzędów wielkości za duże.
Dotychczas zajmowaliśmy się dodawaniem i mnożeniem liczb ż-bito-wych i /-bitowych. Pozostałe dwa działania arytmetyczne - odejmowanie i dzielenie - mają takie same oszacowania czasu jak odpowiednio dodawanie i mnożenie:
Czas(odęjmowanie liczby jfc-bitowej od liczby /-bitowej) ^ max(£, /);
Czas(dzielenie liczby ^-bitowej przez liczbę /-bitową) < kl.
Dokładniej, odejmowanie wymaga rozszerzenia naszej definicji operacji na bitach tak, by dołączyć operację odejmowania bitu 0 lub 1 od innego bitu 0 lub 1 (uwzględniającej ewentualną „pożyczkę” 1 z poprzedniej kolumny); por. ćwiczenie 8.
Aby przeanalizować dzielenie liczb całkowitych zapisanych w systemie dwójkowym, przyjrzyjmy się ilustracjom takim jak w przykładzie 3. Przypuśćmy, że k ^ / (jeśli k < /, to dzielenie jest trywialne, tzn. iloraz jest zerem, a cała dzielna jest resztą). Znalezienie ilorazu i reszty wymaga co najwyżej k — / -f 1 odejmowań. Każde odejmowanie wymaga / lub / + 1 operacji na bitach; jednak w tym drugim przypadku wiemy, że pierwsza od lewej strony kolumna będzie zawierała bit 0, a więc możemy pominąć tę operację na bitach (traktując ją raczej jak „zaksięgowanie” czegoś, a nie jak obliczenie). Podobnie pomijamy