Arytmetyka

Transkrypt

Arytmetyka
Matematyka Dyskretna
Andrzej Szepietowski
25 czerwca 2002 roku
Rozdział 1
Arytmetyka
1.1 System dziesi˛etny
Najpowszechniej używanym sposobem przedstawiania liczb naturalnych jest system dziesi˛etny, gdzie na przykład zapis:
przedstawia liczb˛e składajac
˛ a˛ si˛e z jednej setki, siedmiu dziesiatek
˛ i ośmiu jedności. Możemy to zapisać w postaci:
albo inaczej:
Tak wi˛ec w systemie dziesi˛etnym kolejne cyfry oznaczaja˛ współczynniki przy kolejnych
pot˛egach liczby dziesi˛eć, zaczynajac
˛ od najwi˛ekszej, a kończac
˛ na najmniejszej pot˛edze.
Mówimy, że liczba dziesi˛eć jest podstawa˛ lub baza˛ systemu dziesi˛etnego. W systemie
dziesi˛etnym używamy dziesi˛eciu cyfr:
!
#"$&%')(*&+'-,'./&'-0 1
a zapis:
oznacza liczb˛e:
1
2
2 1
2!3 1
2
!
243 1
1
1
243 5!
która˛ możemy też zapisać w postaci:
67
2
8 1
7
1
(1.1)
7
3
(1.2)
4
1
Rozdział 1. Arytmetyka
7
'!4-0
gdzie sa˛ cyframi należacymi
˛
do zbioru
.
Liczby można też zapisywać w systemach z inna˛ baza.˛ Jeżeli za baz˛e systemu wybierzemy liczb˛e , to potrzebujemy cyfr, a zapis:
1
1
2
1
!!
2!3 1
oznacza w systemie z baza˛ liczb˛e:
1
2 2
1
243 1
2!3 5!!
która˛ możemy też zapisać w postaci:
2
67
1
(1.3)
7
7
1
8 (1.4)
1.2 System dwójkowy
W informatyce bardzo ważnym systemem jest system dwójkowy (binarny), gdzie pod"
stawa˛ jest liczba i gdzie mamy tylko dwie cyfry, 0 i 1 (cyfry w systemie dwójkowym
nazywa si˛e bitami). Zapis:
1 1
1 1
2
oznacza liczb˛e:
1
2
" 2 1
243 !!
2!3 1
" 2!3 5!
lub:
67
2
1
"
1
"
7
7
" 8 Przykład 1.1 Zapis
oznacza w systemie dwójkowym liczb˛e:
"
5""
czemu w systemie dziesi˛etnym odpowiada
("
,
. Podobnie zapis:
'
'
oznacza w systemie dziesi˛etnym liczb˛e
,(
%"
(5
0
.
Poniżej w pierwszej tabeli przedstawiono siedemnaście kolejnych liczb w postaci dwójkowej i dziesi˛etnej, a w drugiej jedenaście pierwszych pot˛eg liczby 2 w postaci dwójkowej
i dziesi˛etnej.
1.3. Zwi˛ekszanie liczby o jeden
dwójkowy
0
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
10000
pot˛ega
0
1
2
3
4
5
6
7
8
9
10
5
dziesi˛etny
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dwójkowy
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
dziesi˛etny
1
2
4
8
16
32
64
128
256
512
1024
1.3 Zwi˛ekszanie liczby o jeden
Algorytm zwi˛ekszania liczby o jeden. Aby zwi˛ekszyć o jeden liczb˛e zapisana˛ w systemie dwójkowym:
wskazujemy na ostatni bit,
powtarzamy, co nast˛epuje:
jeżeli wskazany bit jest zerem, to zamieniamy go na jedynk˛e i ko ńczymy
algorytm,
jeżeli jest on równy jeden, to zamieniamy go na zero i wskazujemy nast˛epny
bit w lewo; jeżeli nie ma nast˛epnego bitu w lewo, to stawiamy jedynk˛e na poczatku
˛
liczby i kończymy algorytm.
6
Rozdział 1. Arytmetyka
Mówiac
˛ inaczej, szukamy pierwszego zera od prawej strony, zamieniamy go na jedynk˛e,
a wszystkie jedynki stojace
˛ za nim zamieniamy na zera.
Przykład 1.2 Liczba o jeden wi˛eksza od liczby
'
to
.
Jeżeli liczba nie zawiera zer, tylko same jedynki, to zamieniamy te jedynki na zera i
stawiamy jedynk˛e na poczatku.
˛
Przykład 1.3 Po liczbie
jest liczba
.
Zauważmy, że podobnie działa algorytm zwi˛ekszania o jeden liczb w systemie dziesi˛etnym (lub dowolnym innym systemie). Szukamy pierwszej od prawej cyfry różnej od dziewiatki
˛ (najwi˛ekszej cyfry w systemie), zwi˛ekszamy t˛e cyfr˛e o jeden, a wszystkie stojace
˛
za nia˛ dziewiatki
˛ zamieniamy na zera.
1.4 Porównywanie liczb
Algorytm porównywania liczb. Aby stwierdzić, która z dwóch liczb w postaci dwójkowej jest wi˛eksza, post˛epujemy w nast˛epujacy
˛ sposób:
jeżeli zapisy liczb nie sa˛ tej samej długości, to wi˛eksza˛ jest liczba z dłuższym zapisem (zakładamy tu, że zapis liczby różnej od zera nie ma zer na poczatku),
˛
jeżeli zapisy liczb sa˛ równej długości, to porównujemy bit po bicie od lewej strony
do prawej:
jeżeli bity sa˛ takie same, to przechodzimy do nast˛epnego bitu w prawo,
jeżeli bity sa˛ różne, to kończymy i stwierdzamy, że wi˛eksza jest ta liczba,
która ma wi˛ekszy bit na tej pozycji,
jeżeli wszystkie bity sa˛ takie same, to porównywane liczby sa˛ równe.
'
Przykład 1.4
. Liczby te sa˛ tej samej długości, maja˛ takie same trzy
pierwsze bity, a różnia˛ si˛e dopiero czwartym bitem — czwarty bit pierwszej liczby jest
wi˛ekszy od czwartego bitu drugiej liczby.
1.5 Operacje arytmetyczne w systemie dwójkowym
Operacje dodawania, mnożenia, odejmowania i dzielenia w systemie dwójkowym można
wykonywać podobnie do tak zwanych szkolnych pisemnych działa ń arytmetycznych w
systemie dziesi˛etnym. Działania w systemie dwójkowym sa˛ prostsze, ponieważ mamy tu
tylko dwie cyfry, 0 i 1, i prostsze sa˛ operacje na pojedynczych cyfrach.
Zacznijmy od tabliczki dodawania i mnożenia. Wygladaj
˛ a˛ one tak:
+
0
1
0
0
1
1
1
10
*
0
1
0
0
0
1
0
1
1.5. Operacje arytmetyczne w systemie dwójkowym
7
Przypuśćmy, że chcemy dodać dwie liczby w postaci dwójkowej. Zakładamy tu, że obie
liczby sa˛ tej samej długości. Jeżeli nie sa,˛ to krótsza˛ z nich uzupełniamy na poczatku
˛
zerami.
Algorytm dodawania. Aby dodać dwie liczby w postaci binarnej:
1
1
2
243 2 2!3 dla kolejnych pozycji od 0 do !
!
1
obliczamy bit sumy
sienia do nast˛epnej pozycji:
7
oraz
7
— tak zwany bit przenie-
"
1
przez 2),
(czyli jest reszta˛ z dzielenia ,
7
nast˛epnie
po1 7 kolei,7 dla 7 każdego od 1 do , obliczamy:
7 7
7
7 3 " ,
1
, jeżeli co najmniej dwa spośród bitów , oraz 3 sa˛ jedynkami,
2.
na końcu obliczamy najbardziej znaczacy
˛ bit sumy 2 1 oraz :
najpierw obliczamy
1
Wynikiem dodawania jest liczba
(może si˛e zdarzyć, że 2
5
Przykład 1.5 Dodawanie liczb
2 2 !! ).
''
i
1
0
1
1
wyglada
˛ nast˛epujaco:
˛
+
1
1
1
0
1
0
1
1
0
Aby odjać
˛ od siebie dwie liczby w systemie dwójkowym, odejmujemy bit po bicie
od prawej do lewej, a w przypadku gdy trzeba odjać
˛ bit wi˛ekszy od mniejszego, „pożyczamy” dwójk˛e z nast˛epnej (w lewo) pozycji (szczegóły algorytmu pozostawiono jako
ćwiczenie).
Przykład 1.6 Odejmowanie liczb
1
i
0
1
wyglada
˛ nast˛epujaco:
˛
1
1
1
0
1
1
1
1
0
8
Rozdział 1. Arytmetyka
Aby pomnożyć dwie liczby, mnożymy pierwsza˛ liczb˛e przez poszczególne cyfry drugiej liczby, a wyniki podpisujemy pod spodem odpowiednio przesuni˛ete wzgl˛edem siebie.
Każdy kolejny wynik jest przesuni˛ety o jedna˛ kolumn˛e w lewo. Nast˛epnie sumujemy te
iloczyny.
Przykład 1.7 Oto przykład mnożenia liczb
0
0
1
1
1
1
0
1
0
1
0
0
0
0
1
'
i
1
1
1
0
1
0
:
0
0
0
0
1
1
1
0
1
Zauważmy, że pomnożenie liczby w postaci dwójkowej przez 2 oznacza dopisanie
jednego zera na końcu liczby. Podobnie pomnożenie liczby przez -ta˛ pot˛eg˛e 2 oznacza
dopisanie na końcu liczby zer.
Przykład 1.8
'
'
pomnożone przez
daje wynik
.
Również dzielenie wykonuje si˛e podobnie jak w systemie dziesi˛etnym. Na przykład:
1
1
1
0
1
0
1
1
1
0
1
1
0
0
0
1
1
1
0
0
1
1
1
0
0
0
0
1
1
0
:
1
0
1
Jeżeli liczba jest podzielna przez 2, to ma w postaci binarnej zero na ko ńcu, a jeżeli dzieli
si˛e przez -ta˛ pot˛eg˛e dwójki, to ma na końcu zer. Podzielenie liczby przez 2 oznacza
skreślenie w jej postaci binarnej jednego zera z końca.
Przykład 1.9
''
podzielone przez 2 daje
.
1.6 Zamiana systemu
Zastanówmy si˛e teraz, jak przechodzić od jednego sposobu przedstawiania liczby do drugiego. Ponieważ b˛edziemy używać różnych systemów zapisu liczb, wi˛ec zapis w systemie
1 1
1 1
z baza˛ oznaczymy przez:
2
243 !
B˛edziemy rezygnować z tego zapisu, jeżeli nie b˛edzie watpliwości,
˛
jakiego systemu używamy. Przedyskutujmy to na przykładach. Aby przedstawić liczb˛e
'' 1.6. Zamiana systemu
w postaci dziesi˛etnej, korzystamy ze wzoru (1.3):
'
"5" "
9
" " 5" i wykonujemy wszystkie rachunki w systemie dziesi˛etnym:
'' %"
,
(
"5
%"5,
(
+% Podobnie możemy post˛epować przy zamianie w odwrotna˛ stron˛e, z systemu dziesi˛etnego
na dwójkowy. Najpierw korzystamy ze wzoru (1.1):
+% - + % nast˛epnie przedstawiamy cyfry i podstaw˛e systemu 10 w postaci dwójkowej i wykonujemy wszystkie działania w systemie dwójkowym:
+% ' ' '
'' Ten sposób zamiany liczb z postaci dziesi˛etnej na dwójkowa˛ jest analogiczny do sposobu,
w jaki wyżej zamienialiśmy liczby z postaci dwójkowej na dziesi˛etna.
˛ Byłby to naturalny
sposób dla kogoś, kto swobodnie liczy w systemie dwójkowym. Sposób ten ma t˛e wad˛e,
że wolno działa. Zobaczymy na przykładach dwa szybsze algorytmy zamiany postaci
liczby z dziesi˛etnej na dwójkowa.
˛
Weźmy liczb˛e 178. Pierwszy sposób polega na tym, że wyszukujemy najwi˛eksza˛ po" "
t˛eg˛e liczby 2, która jeszcze jest mniejsza od naszej liczby (w przykładzie
),
nast˛epnie odejmujemy t˛e pot˛eg˛e od naszej liczby i z różnica˛ post˛epujemy tak samo. Na
końcu mamy liczb˛e w postaci sumy pot˛eg dwójki. W naszym przykładzie wyglada
˛ to tak:
"+"%"
"
%"
,"'
Teraz już łatwo zapisać nasza˛ liczb˛e w postaci dwójkowej:
& ' ) Drugi sposób polega na kolejnym dzieleniu liczby w sposób całkowity przez 2 i zapami˛etywaniu reszt z dzielenia. Reszty te zapisane w odwrotnej kolejności tworza˛ zapis
binarny liczby. Na przykład, weźmy znowu liczb˛e 178. W poniższej tabeli przedstawiono
kolejne ilorazy i reszty.
liczba
178
89
44
22
11
5
2
1
iloraz
89
44
22
11
5
2
1
0
reszta
0
1
0
0
1
1
0
1
10
Rozdział 1. Arytmetyka
Reszty zapisane w odwrotnej kolejności:
'
) # . Poprawność działania tego algorytmu wynika z fak-
tworza˛ binarny zapis liczby
tu, że jeżeli podzielimy liczb˛e
2
1
67
7
7
"
8 1
przez 2, to reszta z dzielenia wyniesie , a iloraz
7 całkowitoliczbowy wyniesie:
7
2
1
67
" 3 8 1
nast˛epne dzielenie przez 2 da reszt˛e oraz iloraz:
7
2
67
1
7
" 3 8 i tak dalej.
Ostatni sposób można łatwo uogólnić na algorytm zamiany liczb z systemu dziesi˛etnego na system z inna˛ baza˛ . Należy tylko dzielić przez . Jeżeli chcemy, na przykład,
,
przedstawić liczb˛e
w systemie trójkowym, to dzielimy ja˛ kolejno przez 3 i spisujemy
reszty z dzielenia:
liczba
60
20
6
2
W wyniku otrzymamy:
iloraz
20
6
2
0
,
& "
"
.
reszta
0
2
0
2
1.7 Długość liczby
w
Zastanówmy siȩ ile cyfr zawiera zapis dziesiȩtny liczby naturalnej . Cztery cyfry
0
00
0 systemie dziesiȩtnym posiadaja̧ liczby od
do , a cyfr
3 posiadaja̧ liczby od
. Tak wiȩc liczba ma cyfr wtedy i tylko wtedy
do
gdy
, czyli gdy . Mamy wi˛ec
Lemat 1.10 Liczba naturalna ma w systemie dziesiȩtnym (w przybliżeniu
) cyfr.
Podobnie w systemie z podstawa̧ , liczba ma cyfr wtedy i tylko wtedy gdy
, czyli:
1.8. Duże liczby
11
5
ma (w przybliżeniu
Lemat 1.11 W systemie o podstawie liczba naturalna
) cyfr.
Korzystaja̧c z tego faktu możemy ustalać przybliżona̧ liczbȩ cyfr potrzebna̧ do zapisu
liczb.
ma około Wniosek
% 1.12 Liczba, posiadaja̧ca cyfr w systemie dziesiȩtnym
w systemie dwójkowym, a liczba maja̧ca bitów w postaci dwójkowej ma
bitów
% /
około
cyfr w postaci dziesiȩtnej.
. W postaci dwójDowód: Jeżeli liczba ma w postaci dziesi˛etnej cyfr, to
' %
kowej ma około bitów, a ,
"
' %
"0
00
, 5% /
ponieważ .
Podobnie, jeżeli liczba ma w postaci dwójkowej bitów, to w postaci dziesi˛etnej
!% /
" ma około .
1.8 Duże liczby
Aby siȩ zorientować jak duże moga̧ być liczby przedstawione za pomoca̧ systemu dziesiȩtnego
lub dwójkowego przypatrzmy siȩ poniższej tabeli:
5%
Liczba sekund w roku
Wiek układu słonecznego w latach
Wiek układu słonecznego w sekundach
%
Liczba cykli w roku (100 MHz)
" Liczba cia̧gów 64 bitowych
" %' (
Liczba cia̧gów 128 bitowych
" "
Liczba cia̧gów 256 bitowych
Liczba atomów na Ziemi
Liczba atomów w naszej galaktyce
Dane do tabeli zaczerpniȩto z ksia̧żki A. Menezes, P. van Oorschot and S. Vanstone,
Handbook of Applied Cryptography. oraz z ksia̧żki B. Schneier, Applied Cryptography.
Tabela ta pozwala ocenić niektóre algorytmy.
Przykład 1.13 Rozważmy prosty algorytm sprawdzaja̧cy, czy liczba naturalna jest pierwsza. Algorytm ten dzieli przez kolejne liczby od 2 do
. Jeżeli ma 120 bitów, to
" potrzeba
dzieleń. Jeżeli założymy, że komputer potrafi wykonać
milionów
% dzieleń w cia̧gu sekundy i
w cia̧gu roku, to bȩdzie liczył około 300 lat. W rozdziale
o teorii liczb bȩdziemy mówić o szybszych algorytmach sprawdzaja̧cych pierwszość liczb
maja̧cych po kilkaset bitów.
Przykład 1.14 Przypuśćmy, że chcemy zaprojektować tablicȩ, która dla każdego cia̧gu
złożongo z ośmiu liter przechowuje jaka̧ś informacjȩ (jeden bajt). W przypadku 26 liter
takich cia̧gów mamy
/ ", & !"$#&% ('
zatem potrzebowalibyśmy wiȩcej niż 100 gigabajtów pamiȩci.
12
Rozdział 1. Arytmetyka
1.9 Ułamki
Przypomnijmy najpierw krótko, jak przedstawia si˛e ułamek w systemie dziesi˛etnym. Na
przykład,
' "%
(
oznacza:
" 3 % 3 ( 3 Użyliśmy kropki do oddzielania cz˛eści całkowitej od ułamkowej. Jest to cz˛esto używany
w informatyce sposób, stosowany mi˛edzy innymi w j˛ezyku Pascal. Ogólniej, zapis:
1
'
oznacza liczb˛e:
1
3 1
1
1
!
3 2
która˛ możemy też zapisać w postaci:
2
67
2
3 2 7
7
1
1
!
3
8 Podobnie możemy zapisywać ułamki w systemie dwójkowym. Jedyna różnica polega na
tym, że w systemie binarnym podstawa˛ pot˛eg jest dwójka i że używamy tylko dwóch cyfr,
0 i 1. Tak wi˛ec w systemie dwójkowym zapis:
1
'
oznacza liczb˛e:
1
" 3 lub inaczej:
1
1
!
" 3 67
2
1
1
2
!
1
2
" 3 2 7
7
" 3
8 Przykład 1.15
' + ' + ' ' ,"
+
W poniższej tabeli przedstawiono kilka pierwszych ujemnych pot˛eg liczby 2 w systemie
dwójkowym i dziesi˛etnym.
"/3 " 3 /
" 3 /
" 3 "/3
"/3
' ' '
' + ' "
+
' ' "
+ ' ' ' ,"+ ' ' %'"
+ - ' ' ) ' '+
,"+ - 1.10. System szesnastkowy
13
1.10 System szesnastkowy
W informatyce używa si˛e też systemu szesnastkowego, gdzie podstawa˛ jest liczba 16. Do
systemu szesnastkowego potrzebujemy szesnastu cyfr. Zwykle używa si˛e nast˛epujacych
˛
„cyfr”:
' "$'% $( *+'','*$'' 0 W poniższej tabeli zestawiono cyfry systemu szesnastkowego z odpowiadajacymi
˛
im liczbami w systemie dwójkowym i dziesi˛etnym.
szesnastkowy
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
dwójkowy
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
dziesi˛etny
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
W j˛ezyku Pascal liczby w systemie szesnastkowym poprzedza si˛e znakiem dolara , a w
j˛ezyku znakami .
Przykład 1.16 Zapis dziesi˛etnym ma postać , oznacza liczb˛e w systemie szesnastkowym, która w systemie
,5
Dzi˛eki temu, że 16 jest pot˛ega˛ dwójki, prosta jest zamiana postaci liczby z systemu dwójkowego na szesnastkowy, i na odwrót. Przy zamianie z systemu szesnastkowego na dwójkowy wystarczy zamieniać kolejne cyfry przedstawienia na grupy odpowiednich czterech
bitów według powyższej tabeli.
Przykład 1.17 Liczba, która w systemie szesnastkowym wyglada
˛ tak '
dwójkowym ma postać
.
0'
w systemie
Przy zamianie z postaci dwójkowej na postać szesnastkowa˛ post˛epujemy odwrotnie. Zast˛epujemy grupy po cztery bity pojedynczymi cyframi.
Przykład 1.18
)
% .
14
Rozdział 1. Arytmetyka
Jeżeli liczba cyfr w postaci dwójkowej nie dzieli si˛e przez 4, to uzupełniamy ja˛ zerami na
poczatku.
˛
Przykład 1.19
' '
$ , ,"
.
W ten sposób możemy używać zapisu szesnastkowego do zwi˛ezłego przedstawiania długich ciagów
˛
bitów.
1.11 Reprezentacja liczb w komputerze
W wielu j˛ezykach każda zmienna ma swój typ, który jest deklarowany na poczatku
˛ programu. Sposób przechowywania wartości zmiennej zależy od jej typu.
1.11.1 Integer
Zmienne typu integer przechowywane sa˛ zwykle w dwóch bajtach. Jeden bajt (ang. byte) zawiera osiem bitów, tak wi˛ec wartość zmiennej typu integer przechowywana jest w
szesnastu bitach. Pierwszy bit oznacza znak. Jeżeli jest on zerem, to liczba jest dodatnia,
jeżeli jedynka,
˛ to ujemna.
Jeżeli liczba jest dodatnia, to pozostałe pi˛etnaście bitów stanowi binarny zapis tej
+
liczby. Na przykład liczba jest przechowywana jako:
Najwi˛eksza˛ liczb˛e dodatnia,
˛ jaka˛ można przechować w zmiennej typu integer, jest:
czyli zero i pi˛etnaście jedynek. Jest to:
%",/ & " Liczby ujemne sa˛ przechowywane w tak zwanym systemie uzupełnieniowym. Liczba
ujemna o wartości bezwzgl˛ednej jest przedstawiana jako liczba:
" w postaci binarnej. Na przykład liczba
jest przedstawiona jako:
czyli szesnaście jedynek. A liczba
%
jako:
! Najmniejsza liczba ujemna, która˛ można zmieścić do zmiennej typu integer, to:
$
1.11. Reprezentacja liczb w komputerze
czyli jedynka i pi˛etnaście zer, która koduje liczb˛e:
" %",
15
& Cz˛esto nie ma żadnego zabezpieczenia przed przekroczeniem maksymalnego lub mini%",
malnego zakresu liczb typu integer. Jeżeli, na przykład, do liczby
, która jest przechowywana jako:
'
dodamy jedynk˛e, to otrzymamy:
która koduje liczb˛e
%",
, i komputer nie zakomunikuje tego przekroczenia.
1.11.2 Real
Liczby typu real sa˛ zapisywane w dwóch notacjach:
stałopozycyjnej,
zmiennopozycyjnej.
Liczby w notacji stałopozycyjnej to, na przykład:
' "% "$ '
czyli notacja dziesi˛etna. Zwróćmy uwag˛e, że kropka oddziela cz˛eść całkowita˛ liczby od
cz˛eści ułamkowej.
W notacji zmiennopozycyjnej liczba przedstawiona jest w postaci:
gdzie
lub
jest mantysa,
˛ liczba˛ w postaci dziesi˛etnej z przedziału
, a , zwana cecha,
˛ jest liczba˛ całkowita.˛ Zapis
oznacza liczb˛e:
!
W poniższej tabeli mamy kilka liczb w postaci stało- i zmiennopozycyjnej.
4837.92
0.034
"' ( %/0" %
% (
"
" Sposób przechowywania wartości zmiennych typu real jest skomplikowany i nie b˛edzie
przedstawiony szczegółowo.
16
Rozdział 1. Arytmetyka
1.11.3 Inne typy całkowite
W j˛ezyku Pascal, oprócz integer, można używać innych typów całkowitych; sa˛ to:
shortint, zawiera liczby całkowite z przedziału od
byte, zawiera liczby całkowite z przedziału od do
"
"
+
+
word, zawiera liczby całkowite z przedziału od do
longint, zawiera liczby całkowite z przedziału od
do
"
,
,
,++%+
,
"$(/(
%,(
do
"$!($(
%
,
(/
.
Elementy typu byte i shortint przechowywane sa˛ w jednym bajcie (osiem bitów) pami˛eci, typu word — w dwóch bajtach, a typu longint — w czterech bajtach pami˛eci.
Liczby typu shortint i longint moga˛ być dodatnie lub ujemne i sa˛ zapami˛etywane w postaci uzupełnieniowej z pierwszym bitem oznaczajacym
˛
znak (podobnie jak liczby typu
integer). Elementy typu byte i word moga˛ być tylko dodatnie i sa˛ przechowywane w postaci dwójkowej.
1.12 Wyrażenia arytmetyczne w j˛ezyku Pascal
W j˛ezyku Pascal wyrażeniami arytmetycznymi sa˛ stałe liczbowe, na przykład:
"%
( "% ' "
%'
"
%' (+'
%' "$ +$
oraz zmienne typów liczbowych (np. integer lub real). Wyrażenia można także budowa ć
za pomoca˛ operatorów arytmetycznych i nawiasów. Jeżeli U oraz W sa˛ dwoma wyrażeniami arytmetycznymi, to wyrażeniami arytmetycznymi sa˛ także:
U+W, U-W, U*W, U/W, (U), U div V, U mod V.
Gwiazdka reprezentuje tutaj znak mnożenia, a operacje div oraz mod to iloraz i reszta
z dzielenia całkowitoliczbowego (sa˛ one opisane dokładnie w rozdziale o teorii liczb).
Na przykład, wyrażeniami arytmetycznymi sa:
˛
-(2-3)/2+7*4, (2-3)/(3*2), 7 div 2, 7 mod 2.
Jeżeli x oraz y sa˛ zmiennymi liczbowymi, to wyrażeniami arytmetycznymi sa˛ także:
2*x, x*x-2/y.
Dla danego wyrażenia możemy obliczyć jego wartość. Robi si˛e to według zwykłych reguł
znanych ze szkoły. Najpierw oblicza si˛e wyrażenia w nawiasach, potem mnożenie i dzielenie (od lewej do prawej), a na końcu dodawanie i odejmowanie (od lewej do prawej).
1.13 Poszukiwania binarne (binary search)
Znana jest gra w dwadzieścia pytań. W tej grze za pomoca˛ dwudziestu pytań, na które
odpowiedzia˛ może być „tak” lub „nie”, należy odgadnać
˛ pomyślana˛ przez przeciwnika
rzecz. Zobaczymy, jak można wykorzystać binarny system zapisu liczb do opracowania
strategii wygrywajacej
˛ w tej grze.
1.13. Poszukiwania binarne (binary search)
17
Najpierw uprośćmy nieco t˛e gr˛e. Załóżmy, że możemy zadać tylko cztery pytania i że
odgadujemy liczb˛e naturalna˛ ze zbioru:
'!&"'-%'-( #+$-, #$-'&0'$
"$!%'4( + Wtedy należy zadać nast˛epujace
˛ cztery pytania:
Czy liczba
należy do zbioru
Czy
należy do zbioru
Czy
należy do zbioru
Czy
-0' !
!"$!%'4( 4+ (*&+'-,'./"$% !!(*4+ "'-% -,'./'
!!(*4+ -% &+$./&0'!
%'+ należy do zbioru
?
?
?
?
Dlaczego te cztery pytania wystarcza?
˛ Sprawa stanie si˛e jasna, jeżeli przedstawimy liczby
w postaci binarnej. Każda˛ za pomoca˛ czterech bitów (z zerami na poczatku).
˛
Wtedy nasz
zbiór wyglada
˛ tak:
'&
'
&
'&
$- !
'-''&'$- ''
'$!!
'!
'
$!
A pytania wygladaj
˛ a˛ teraz tak:
'!
!'! !! '!
$!!'
'- - ! -$
'!
$!!'
''-'
- ! -$
!''!'!!'
-'
- $-$
!
'
!'!$
Czy
należy do zbioru
Czy
należy do zbioru
Czy
należy do zbioru
Czy
należy do zbioru
Zauważmy, że zbiór zawiera wszystkie liczby z pierwszym bitem równym jedynce,
w sa˛ wszystkie liczby z drugim bitem równym jedynce, i tak dalej. Tak wi˛ec nasze
pytania sa˛ w rzeczywistości pytaniami o kolejne bity odgadywanej liczby. Na przykład w
pierwszym pytaniu pytamy, czy pierwszy bit odgadywanej liczby jest jedynka.
˛
Ale można do tych pytań podejść inaczej. Najpierw dzielimy zbiór na połowy: na
liczby mniejsze od ośmiu i na liczby wi˛eksze lub równe ośmiu, i pytamy, do której połowy
należy odgadywana liczba (dokładniej pytamy, czy liczba należy do górnej połowy). Po
uzyskaniu odpowiedzi mamy dwa razy w˛eższy przedział poszukiwa ń. Przypuśćmy, że
odgadywana˛ liczba˛ jest 11. W drugim etapie dzielimy przedział
-0 ! !
!"$%'!('+ na połowy, górna:
˛
i dolna:
˛
"'!%'!( + -0 ! ! 18
Rozdział 1. Arytmetyka
i pytamy, do której połowy należy szukana liczba. Po drugiej odpowiedzi przedział poszukiwań jest już cztery razy krótszy. Po dwóch kolejnych pytaniach przedział zaw˛eża si˛e
do jednej liczby. Drugi sposób jest całkowicie równoważny pierwszemu, tutaj też pytamy
o kolejne bity i otrzymujemy takie same odpowiedzi.
Potrzeba cztery razy kolejno dzielić zbiór na połowy, aby z poczatkowej
˛
długości
7
16 przejść na końcu do długości
1. A ile trzeba podziałów, jeżeli na poczatku
˛
mamy
"
" 3 elementów? Po pierwszym podziale nasz zbiór b˛edzie miał długość
, po
" 3 " 3
kolejnych podziałów, aby
drugim
, a po -tym
. Jak widać, potrzeba
"
dojść do 1. Tak wi˛ec jeżeli mamy do dyspozycji
pytań, to możemy odnaleźć jedna˛
" )
" -
(++
spośród
liczb całkowitych z przedziału od do
.
Metod˛e poszukiwań binarnych można zastosować do stwierdzenia, czy jakaś liczba
naturalna jest kwadratem (lub jak aś
˛ inna˛ ustalon
˛ innej liczby naturalnej. Ina a˛ pot˛ega)
czej, czy istnieje liczba naturalna taka, że
, lub ogólniej, czy istnieje liczba
naturalna taka, że
.
Poniżej
przedstawiamy
taki
algorytm. Algorytm ten używa dwoch dodatkowych zmien nych i , wartości tych zmiennych przybliżaja˛ pierwiastek stopnia z od dołu i od
góry. W trakcie wykonywania algorytmy przybliżeniaa te sa˛ coraz lepsze
jest pot˛ega˛ o wykładniku jakiejś
Algorytm sprawdzajacy,
˛ czy dana liczba naturalna
liczby naturalnej.
Dane wejściowe: liczba naturalna .
Dane wyjściowe: pierwiastek stopnia z , (liczba naturalna
informacja, że nie ma pierwiastka stopnia .
, taka że
) lub
Powtarzaj aż do skutku:
jeżeli
, to koniec,
jeżeli nie ma pierwiastka.
, to koniec, jest pot˛ega˛ .
jeżeli , to
jeżeli , to
.
1.14 Zadania
1. Zwi˛eksz o jeden nast˛epujace
˛ liczby zapisane w postaci dwójkowej: a)
b)
.
2. Porównaj nast˛epujace
˛ pary liczb: a)
,
b)
,
''
.
3. Dodaj (odejmij, pomnóż) w postaci dwójkowej nast˛epujace
˛ pary liczb: a)
'
' b)
,
.
'
,
1.15. Problem: Waga
19
4. Napisz dokładny algorytm odejmowania dwóch liczb w postaci dwójkowej.
5. Liczby 81, 126 przedstaw w postaci dwójkowej. Jak b˛eda˛ one reprezentowane w
komputerze jako stałe typu integer (byte, word)?
6. Nast˛epujace
˛ liczby przedstaw w postaci dwójkowej: 6.75, 5.625, $B1, $FF.
7. Nast˛epujace
˛ liczby przedstaw w postaci trójkowej: 80, 120.
8. Nast˛epujace
˛ liczby w postaci dwójkowej, 10001101, 100101, przedstaw w postaci:
a) dziesi˛etnej, b) szesnastkowej.
9. Opisz algorytm zamiany ułamka z postaci dziesi˛etnej na postać dwójkowa.
˛
10. Ile maksymalnie pytań z odpowiedziami TAK/NIE trzeba zadać, aby odgadnać
˛ liczb˛e z przedziału od 0 do 100 000?
11. Zastosuj algorytm wyznaczania pierwiastków do znalezienia pierwiastka stopnia 3
z liczby 512.
1.15 Problem: Waga
Wyobraźmy sobie wag˛e szalkowa.˛ Na jednej szalce, lewej, kładziemy jakiś przedmiot do
zważenia, a nast˛epnie na obu szalkach kładziemy odważniki. Jeżeli waga jest w równowadze, to ważony przedmiot ma wag˛e równa˛ sumie (nominałów) odważników położonych
na prawej szalce minus suma odważników położonych na lewej szalce, obok ważonego
"
"
przedmiotu. Na przykład, jeżeli na prawej szalce leża˛ odważniki i
gramowe, a na
( +
%
""
+ (
lewej odważniki i gramowe, to przedmiot waży
gramów.
Interesujace
˛ nas pytanie brzmi: jakie powinny być nominały poszczególnych odważników, aby można było zważyć każdy ci˛eżar o wadze od do , przy jak najmniejszej
liczbie odważników. Zakładamy, że ważymy tylko przedmioty o całkowitych wagach.
Pokaż, że
% "
7
(a) Za pomoca˛ odważników można zważyc co najwyżej
różnych7 ci˛eżarów.
%
(b) Jeżeli nominały
odważników sa˛ kolejnymi pot˛egami trójki, to znaczy
dla
, to za ich pomoca˛ można zważyć każdy (całkowity) ci˛eżar o nominale
%
"
od 1 do
.
Wskazówki:
(a) Ponieważ każdy odważnik może si˛e znajdować na prawej lub lewej szalce, lub na stole,
% to mamy różnych położeń odważników. Wśród tych położeń jest takie, gdzie wszystkie
odważniki leża˛ na stole (wtedy ważymy zerowy ci˛eżar). Ponadto jeżeli odważniki leża˛
na szalkach i odważaja˛ ci˛eżar , to zamieniwszy położenia odważników na szalkach
(odważniki z lewej przekładamy na prawa˛ szalk˛e, i na odwrót), b˛edziemy odważa ć ci˛eżar
.
20
Rozdział 1. Arytmetyka
(b) Rozłożenie odważników przy ważeniu ci˛eżaru
7
postaci
3 1 7
1
7
67
odpowiada przedstawieniu
% (1.5)
- ! w
8 gdzie
. Aby przedstawić ci˛eżar
w7 postaci
(1.5), najpierw przedstawia %
"
7 %
"
3 !! ,
my liczb˛e
w systemie trójkowym:1
a nast˛epnie od każdej cyfry odejmujemy jedynk˛e:
.

Podobne dokumenty