System dziesiętny 7 * 104 + 3 * 103 + 0 * 102 + 5 *101 + 1 * 100

Transkrypt

System dziesiętny 7 * 104 + 3 * 103 + 0 * 102 + 5 *101 + 1 * 100
•
•
•
•
•
System dziesiętny
7 * 104 + 3 * 103 + 0 * 102 + 5 *101 + 1 * 100 = 73051
Liczba 10 w tym zapisie nazywa się podstawą systemu liczenia.
Jeśli liczba 73051 byłaby zapisana w systemie ósemkowym, co powinniśmy
oznaczyć (73051)8, to jej wartość dziesiętna byłaby równa:
(73051)8 = 7 * 84 + 3 * 83 +0 * 82 + 5 * 81 + 1 * 80 = 30249
W podobny sposób otrzymamy wartość liczby (73051)16. Liczby możemy
porównywać dopiero po obliczeniu ich wartości w systemie o tej samej
podstawie.
Ogólnie, za podstawę systemu można wybrać dowolną liczbę naturalną b,
nawet większą niż 10 - wtedy cyfry liczby (anan-1...a1a0)b zapisanej w tym
systemie należą do zbioru {0, 1, ..., b-1}, a jej wartość dziesiętna a jest
określona następującą równością:
a = anbn + an-1bn-1 + ... + a1b + a0
Jeśli b = 2, to system nazywa się binarnym, a ciąg cyfr (anan-1...a1a0)2 nazywa
się binarnym rozwinięciem liczby a, lub po prostu liczbą binarną (stosowana
jest również terminologia system dwójkowy).
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
1
• W tym przypadku, cyfra ai nazywa się bitem i może przyjmować jedynie
wartości 0 lub 1. Liczby binarne to podstawa arytmetyki komputerowej.
• Interesuje nas teraz algorytm wyznaczania binarnej reprezentacji naturalnej
liczby dziesiętnej a. Liczba a ma następującą postać binarną dla pewnego n:
• a = an2n + an-12n-1 + ...+ a12 + a0
• W skrócie piszemy zwykle a = (anan-1...a1a0)2.
– W jaki sposób można znaleźć kolejne bity tego rozwinięcia?
– Przypomnijmy sobie najpierw, czym w rozwinięciu binarnym różnią się liczby
parzyste (czyli podzielne przez 2 z resztą 0) od liczb nieparzystych (czyli
podzielnych przez 2
– Najmniej znaczący bit rozwinięcia binarnego liczby jest równy reszcie z dzielenia
tej liczby przez 2. Jeśli podzielimy liczbę a zapisaną binarnie przez 2, to iloraz
jest równy an2n-1 + an-12n-2 +...+a1 a reszta wynosi a0 - jest to najmniej znaczący
bit w reprezentacji liczby a.
• Ponieważ iloraz ma również postać liczby a, więc następne bity rozwinięcia
znajdujemy w podobny sposób. To postępowanie kończymy, gdy iloraz
wynosi 0, gdyż wtedy kolejne reszty będą już cały czas równe 0, a zera na
początku rozwinięcia binarnego nie mają żadnego znaczenia.
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
2
19|2
9|2
4|2
2|2
1|2
9
4
2
1
0
1
1
0
0
1
1910 = (10011)2.
• Zauważmy, że w tym algorytmie reprezentacja liczby jest tworzona od końca,
czyli od najmniej znaczącego bitu.
• W obliczeniach ilorazu i reszty z dzielenia liczb całkowitych przez siebie
posługujemy się dwoma operacjami wykonywanymi na liczbach całkowitych,
których wyniki są również liczbami całkowitymi.
– Dla dwóch liczb całkowitych k i l, wartością k mod l jest reszta z dzielenia k
przez l, czyli jest to liczba r spełniająca nierówności 0=< r <l.
– Z kolei, wartością k div l jest iloraz całkowity z dzielenia k przez l, czyli wynik
dzielenia k przez l obcięty do najbliższej liczby całkowitej.
– Jeśli l = 2, to k mod 2 ma wartość 0 - gdy k jest liczbą parzystą, i wartość 1 - gdy
k jest liczbą nieparzystą.
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
3
Algorytm zamiany liczby dziesiętnej na postać binarną
Dane: Dziesiętna liczba naturalna a.
Wynik: Kolejne bity rozwinięcia binarnego liczby a.
• Krok 1:
Powtarzaj krok 2, dopóki a jest liczbą większą od zera, w
przeciwnym razie zakończ algorytm.
• Krok 2:
{Kolejny od końca bit rozwinięcia danej liczby a jest równy
reszcie z dzielenia a przez 2. Za nową wartość a przyjmujemy
iloraz całkowity z dzielenia a przez 2. Matematyczny zapis
tych operacji ma następującą postać: }
• Za kolejny bit przyjmij: a mod 2 i przypisz: a := div 2
procedure z10na2(b:Integer; var k:Integer; var a:TablicaOn);
begin
k:=-1;
repeat
k:=k+1; a[k]:=b mod 2; b:=b div 2
until b=0
end; {z10na2}
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
4
•
•
•
•
•
Schemat Hornera
Znamy prostsze sposoby obliczania wartości wielomianów drugiego i
trzeciego stopnia niż to wynika ze zwykle stosowanego zapisu:
w(x)=ax2+bx+c=(ax+b)x+c;
v(x)=ax3+bx2+cx+d=((ax+b)x+c)x+d.
Liczba dodawań i mnożeń w algorytmach wynikających z tych zapisów jest
równa odpowiednio 2 i 3, czyli jest równa stopniowi wielomianu.
Podobnie można przedstawić wielomian stopnia n dla dowolnego n>0, który
ma następującą ogólną postać:
wn(x)=a0xn+a1xn-1+...+an-1x+an
Przekształcenia wielomianu rozpoczynamy od wyłączenia x ze wszystkich
wyrazów, w których występuje, po czym otrzymujemy:
wn(x)=(a0xn-1+a1xn-2+...+an-1)x+an
Kontynuując to postępowanie dla zagłębiających się wielomianów,
uzyskujemy następującą postać wielomianu wyjściowego:
wn(x)=(...(a0x+a1)x +...+an-1)x+an
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
5
• Rozstawienie nawiasów wyznacza następującą kolejność wykonywania
działań:
– przyjmij współczynnik przy najwyższej potędze za początkową wartość
wielomianu;
– powtarzaj aż do wyczerpania listy n współczynników: bieżącą wartość
wielomianu pomnóż przez x i dodaj kolejny współczynnik wielomianu.
– Uzyskana postać wielomianu, jak i wynikający z niej sposób obliczenia wartości
wielomianu wyjściowego, nazywa się schematem Hornera. Obliczenie wartości
wielomianu stopnia n wymaga wykonania n mnożeń i n dodawań.
• 1819 roku W.G Horner podał sposób obliczenia wartości wielomianu,
nazywany dzisiaj jego nazwiskiem, ale 150 lat wcześniej Isaac Newton
stosował podobny sposób obliczenia wartości wielomianu, który występował
w jego rachunkach fizycznych. Te fakty z historii jeszcze raz dowodzą, że
wiele algorytmów stosowanych dzisiaj w obliczeniach komputerowych
pochodzi z czasów, gdy jeszcze nie było komputerów.
• A. Borodin udowodnił w 1971 roku, że schemat Hornera jest najszybszym
sposobem obliczenia wartości wielomianu. Jest to więc kolejny przykład
algorytmu optymalnego.
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
6
•
•
•
•
•
Zmiana liczb z systemu binarnego na dziesiętny
Równość a = anbn + an-1bn-1 + ... + a1b + a0, będąca zapisem liczby a w
systemie pozycyjnym o podstawie b, ma postać wielomianu
wn(x)=(...(a0x+a1)x +...+an-1)x+an, w którym zamiast x występuje zmienna b,
a współczynnikami są cyfry rozwinięcia an , an-1, ..., a1, a0.
Jest to bardzo ważna obserwacja, gdyż dzięki temu w obliczeniach na
rozwinięciach liczb w różnych systemach możemy posługiwać się
algorytmami opracowanymi dla wielomianów.
UWAGA: współczynniki w rozwinięciu liczby są inaczej numerowane niż w
schemacie Hornera!!!
Schemat Hormera może być stosowany do obliczania wartości dziesiętnej
liczy a, jeśli dane jest jej rozwiązanie przy dowolnej podstawie b.
W szczególnym przypadku można korzystać ze schematu Hornera przy
zmianie liczb binarnych na dziesiętne. Algorytm jest identyczny ze
schematem Hornera, należy tylko pamiętać, by „współczynniki” wielomianu
(tj. kolejne cyfry rozwinięcia) były podawane od najbardziej znaczącej, czyli
w odwrotna kolejności niż są obliczone w algorytmie tworzenia postaci
binarnej.
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
7
•
•
•
•
•
Szybkie podnoszenie do potęgi
Obliczanie szóstej potęgi danej liczby x. Wykonywanie kolejnych mnożeń
to pięć działań. By zmniejszyć ich liczbę, można skorzystać z równości
6=2*3 i najpierw podnieść x do kwadratu, a następnie wynik podnieść do
trzeciej potęgi, gdyż x6=(x2)3. Zatem, zamiast pięciu mnożeń, wystarczy
wykonać tylko trzy.
Jeśli podnosimy x do potęgi 16 wtedy wystarczy wykonać tylko cztery
mnożenia, zamiast piętnastu.
Możemy również użyć binarnej postaci wykładnika potęgi 6=(110)2. Jeśli
dodatkowo skorzystamy ze schematu Hornera, to otrzymamy:
x6=x(1*2+1)*2=(x2x)2
Ponieważ każdą liczbę naturalną można przedstawić w postaci binarnej, ten
sposób podnoszenia do potęgi wydaje się być uniwersalny i może być użyty
dla dowolnej liczby naturalnej m.
Dla uproszczenia początkowych rozważań przyjmijmy, że wykładnik m jest
pamiętany na trzech bitach, a więc ma postać m=(c*2+b)*2+a oraz b=1
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
8
• Wówczas otrzymamy następującą równość, która wynika jedynie z
zastosowania zasad potęgowania:
xm=x(c*2+b)*2+a=((xc)2xb)2xa=(x2xb)2xa
• Na tej podstawie można wyprowadzić następującą zależność między postacią
wykładnika w układzie binarnym a działaniami wykonywanymi przy
obliczaniu potęgi
• najbardziej znaczący bit w rozwinięciu wykładnika (który jest zawsze równy
1) odpowiada rozpoczęciu obliczeń od przyjęcia liczby za początkową
wartość potęgi;
• każda następna pozycja w rozwinięciu odpowiada podniesieniu częściowego
wyniku do kwadratu i ewentualnie pomnożeniu przez x, jeśli bit rozwinięcia
na tej pozycji jest równy 1.
• Opisany wyżej sposób podnoszenia do potęgi znany był w Indiach 200 lat
p.n.e., a w X wieku pojawił się w Damaszku.
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
9
Binarny algorytm potęgowania"od-lewej-do-prawej"
Dane: Liczba naturalna m w postaci binarnej(mnmn-1 ... m1m0)2 i dowolna
liczba x.
Wynik: Wartość potęgi xm.
• Krok 1.
{Ustalenie początkowej wartości potęgi}y:=x
• Krok 2.
Dla i=n-1,...,1,0 wykonaj:
jeśli mi=1, to y:=y*y*x, w innym razie y:=y*y
• Obliczmy, ile mnożeń wykonujemy w tym algorytmie.
– Wszystkie te działania są wykonywane w kroku 2, dla kolejnych bitów w binarnej
reprezentacji wykładnika, z wyjątkiem pierwszego, najbardziej znaczącego bitu.
– Zatem liczba mnożeń w całym algorytmie jest równa liczbie wszystkich bitów w
binarnej reprezentacji wykładnika, minus jeden, plus liczba jedynek w tej
reprezentacji
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
10
• Algorytm potęgowania "od-lewej-do-prawej" ma pewną wadę. Rozwinięcie
binarne liczby jest naturalnie tworzone od najmniej znaczącego bitu, czyli
"od-prawej-do-lewej”.
• Można odeprzeć ten argument stwierdzeniem, że liczby naturalne są
pamiętane w komputerze w postaci binarnej, więc binarna reprezentacja
wykładnika jest dana.
• Jednak, aby z niej skorzystać musimy i tak dotrzeć do poszczególnych jej
bitów. Najłatwiej to zrobić, stosując algorytm, który tworzy taką właśnie
reprezentację bit po bicie.
• Inny algorytm potęgowania, który również korzysta z binarnej reprezentacji
wykładnika tworzy ją w trakcie obliczania potęgi od prawej do lewej. W tym
przypadku postać binarna nie jest zamieniana na schemat Hornera kolejnymi wykładnikami czynników są potęgi liczby 2 występujące w
rozwinięciu binarnym wykładnika.
• Algorytm ten jest również bardzo stary - znany był już w XV wieku, a już
Egipscy matematycy 1800 lat p.n.e. znajdowali w podobny sposób wartość
iloczynu nx.
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
11
Binarny algorytm potęgowania „od-prawej-do-lewej”
Dane: Liczba naturalna m i dowolna liczba x.
Wynik: Wartość potęgi xm.
• Krok 1:
{ ustalenie początkowych wartości potęgi i zmiennych}
y:=1; z:=x; l:=m.
l:=l div 2 i jednocześnie sprawdź, jakiej parzystości było
• Krok 2:
l przed podzieleniem. Jeśli l było parzyste przejdź do kroku 5.
y:=y*z.
• Krok 3:
• Krok 4:
jeśli l=0 to zakończ algorytm - wynikiem jest bieżąca wartość.
z:=z*z. Wróć do kroku 2.
• Krok 5:
Luty 2001
Algorytmy (7) 2000/2001
[email protected]
12

Podobne dokumenty