Matematyka dyskretna Arytmetyka
Andrzej Szepietowski
1 System dziesi¸ etny
Najpowszechniej u˙zywanym sposobem przedstawiania liczb naturalnych jest system dziesi¸etny, gdzie na przyk lad zapis:
178
przedstawia liczb¸e sk ladaj¸ac¸a si¸e z jednej setki, siedmiu dziesi¸atek i o´smiu jedno´sci. Mo˙zemy to zapisa´c w postaci:
178 = 1 · 100 + 7 · 10 + 8 · 1, albo inaczej:
178 = 1 · 102+ 7 · 101+ 8 · 100.
Tak wi¸ec w systemie dziesi¸etnym kolejne cyfry oznaczaj¸a wsp´o lczynniki przy kolejnych pot¸egach liczby dziesi¸e´c, zaczynaj¸ac od najwi¸ekszej, a ko´ncz¸ac na najmniejszej pot¸edze. M´owimy, ˙ze liczba dziesi¸e´c jest podstaw¸a lub baz¸a systemu dziesi¸etnego. W systemie dziesi¸etnym u˙zywamy dziesi¸eciu cyfr:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a zapis:
drdr−1. . . d1d0
oznacza liczb¸e:
dr· 10r+ dr−1· 10r−1+ . . . + d1· 101+ d0· 100, (1) kt´or¸a mo˙zemy te˙z zapisa´c w postaci:
Xr
i=0
di· 10i, (2)
gdzie di s¸a cyframi nale˙z¸acymi do zbioru {0, . . . , 9}.
Liczby mo˙zna te˙z zapisywa´c w systemach z inn¸a baz¸a. Je˙zeli za baz¸e systemu wybierzemy liczb¸e b, to potrzebujemy b cyfr, a zapis:
drdr−1. . . d1d0
oznacza w systemie z baz¸a b liczb¸e:
dr· br+ dr−1· br−1+ . . . + d1· b1+ d0· b0, (3) kt´or¸a mo˙zemy te˙z zapisa´c w postaci:
Xr
i=0
di· bi. (4)
2 System dw´ ojkowy
W informatyce bardzo wa˙znym systemem jest system dw´ojkowy (binarny), gdzie podstaw¸a jest liczba 2 i gdzie mamy tylko dwie cyfry, 0 i 1 (cyfry w systemie dw´ojkowym nazywa si¸e bitami).
Zapis:
drdr−1. . . d1d0
oznacza liczb¸e:
dr· 2r+ dr−1· 2r−1+ . . . + d1· 21+ d0· 20
lub: r
X
i=0
di· 2i.
Na przyk lad, zapis 110 oznacza w systemie dw´ojkowym liczb¸e:
1 · 22+ 1 · 21+ 0 · 20, czemu w systemie dziesi¸etnym odpowiada:
4 + 2 = 6.
Podobnie zapis:
1101101 oznacza w systemie dziesi¸etnym liczb¸e:
64 + 32 + 8 + 4 + 1 = 109.
W poni˙zszej tabeli przedstawiono kilkana´scie kolejnych liczb w postaci dw´ojkowej i dziesi¸etnej, a w nast¸epnej — kilkana´scie pierwszych pot¸eg liczby 2 w postaci dw´ojkowej i dziesi¸etnej.
dw´ojkowy dziesi¸etny
0 0
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
10000 16
pot¸ega dw´ojkowy dziesi¸etny
0 1 1
1 10 2
2 100 4
3 1000 8
4 10000 16
5 100000 32
6 1000000 64
7 10000000 128
8 100000000 256
9 1000000000 512
10 10000000000 1024
3 Zwi¸ ekszanie liczby o jeden
Algorytm zwi¸ekszania liczby o jeden. Aby zwi¸ekszy´c o jeden liczb¸e zapisan¸a w systemie dw´ojkowym:
• wskazujemy na ostatni bit,
• powtarzamy, co nast¸epuje:
je˙zeli wskazany bit jest zerem, to zamieniamy go na jedynk¸e i ko´nczymy algorytm,
je˙zeli jest on r´owny jeden, to zamieniamy go na zero i wskazujemy nast¸epny bit w lewo;
je˙zeli nie ma nast¸epnego bitu w lewo, to stawiamy jedynk¸e na pocz¸atku liczby i ko´nczymy algorytm.
M´owi¸ac inaczej, szukamy pierwszego zera od prawej strony, zamieniamy go na jedynk¸e, a wszystkie jedynki stoj¸ace za nim zamieniamy na zera. Na przyk lad, liczba o jeden wi¸eksza od liczby
100100111 to
100101000.
Je˙zeli liczba nie zawiera zer, tylko same jedynki, to zamieniamy te jedynki na zera i stawiamy jedynk¸e na pocz¸atku. Na przyk lad, po liczbie
11111 jest liczba
100000.
Zauwa˙zmy, ˙ze podobnie dzia la algorytm zwi¸ekszania o jeden liczb w systemie dziesi¸etnym (lub dowolnym innym systemie). Szukamy pierwszej od prawej cyfry r´o˙znej od dziewi¸atki (najwi¸ekszej cyfry w systemie), zwi¸ekszamy t¸e cyfr¸e o jeden, a wszystkie stoj¸ace za ni¸a dziewi¸atki zamieniamy na zera.
4 Por´ ownywanie liczb
Algorytm por´ownywania liczb. Aby stwierdzi´c, kt´ora z dw´och liczb jest wi¸eksza, post¸epujemy w nast¸epuj¸acy spos´ob:
• je˙zeli zapisy liczb nie s¸a tej samej d lugo´sci, to wi¸eksz¸a jest liczba z d lu˙zszym zapisem (zak ladamy tu, ˙ze zapis liczby r´o˙znej od zera nie ma zer na pocz¸atku),
• je˙zeli zapisy liczb s¸a r´ownej d lugo´sci, to por´ownujemy bit po bicie od lewej strony do prawej:
je˙zeli bity s¸a takie same, to przechodzimy do nast¸epnego bitu w prawo,
je˙zeli bity s¸a r´o˙zne, to ko´nczymy i stwierdzamy, ˙ze wi¸eksza jest ta liczba, kt´ora ma wi¸ekszy bit na tej pozycji,
• je˙zeli wszystkie bity s¸a takie same, to por´ownywane liczby s¸a r´owne.
Na przyk lad:
1011010 > 1010101.
Powy˙zsze liczby s¸a tej samej d lugo´sci i maj¸a takie same trzy pierwsze bity, a r´o˙zni¸a si¸e dopiero czwartym bitem — czwarty bit pierwszej liczby (1) jest wi¸ekszy od czwartego bitu drugiej liczby (0).
5 Operacje arytmetyczne w systemie dw´ ojkowym
Operacje dodawania, mno˙zenia, odejmowania i dzielenia w systemie dw´ojkowym mo˙zna wykonywa´c podobnie do tak zwanych szkolnych pisemnych dzia la´n arytmetycznych w systemie dziesi¸etnym.
Dzia lania w systemie dw´ojkowym s¸a prostsze, poniewa˙z mamy tu tylko dwie cyfry, 0 i 1, i prostsze s¸a operacje na pojedynczych cyfrach.
Zacznijmy od tabliczki dodawania i mno˙zenia. Wygl¸adaj¸a one tak:
+ 0 1
0 0 1
1 1 10
* 0 1
0 0 0
1 0 1
Przypu´s´cmy, ˙ze chcemy doda´c dwie liczby w postaci dw´ojkowej. Zak ladamy tu, ˙ze obie liczby s¸a tej samej d lugo´sci. Je˙zeli nie s¸a, to kr´otsz¸a z nich uzupe lniamy na pocz¸atku zerami.
Algorytm dodawania. Aby doda´c dwie liczby w postaci binarnej:
drdr−1. . . d0, erer−1. . . e0,
dla kolejnych pozycji i od 0 do r obliczamy bit sumy si oraz ci — tak zwany bit przeniesienia do nast¸epnej pozycji:
• najpierw obliczamy s0 oraz c0:
s0= d0+ e0 (mod 2) (czyli s0 jest reszt¸a z dzielenia d0+ e0 przez 2),
c0 = d0e0,
• nast¸epnie po kolei, dla ka˙zdego i od 1 do r, obliczamy i-ty bit sumy wed lug wzoru:
si = di+ ei+ ci−1 (mod 2),
a bit ci jest jedynk¸a, je˙zeli co najmniej dwa spo´sr´od bit´ow di, ei oraz ci−1 s¸a jedynkami,
• na ko´ncu obliczamy najbardziej znacz¸acy bit sumy:
sr+1= cr. Wynikiem dodawania jest liczba
sr+1sr. . . s0
(mo˙ze si¸e zdarzy´c, ˙ze sr+1= 0).
Na przyk lad, dodawanie liczb 10101 i 111 wygl¸ada nast¸epuj¸aco:
1 0 1 0 1
+ 1 1 1
1 1 1 0 0
Aby odj¸a´c od siebie dwie liczby w systemie dw´ojkowym, odejmujemy bit po bicie od prawej do lewej, a w przypadku gdy trzeba odj¸a´c bit wi¸ekszy od mniejszego, ,,po˙zyczamy” dw´ojk¸e z nast¸epnej (w lewo) pozycji (szczeg´o ly algorytmu pozostawiono jako ´cwiczenie). Na przyk lad, odejmowanie liczb 10101 i 111 wygl¸ada nast¸epuj¸aco:
1 0 1 0 1
− 1 1 1
1 1 1 0
Aby pomno˙zy´c dwie liczby, mno˙zymy pierwsz¸a liczb¸e przez poszczeg´olne cyfry drugiej liczby, a wyniki podpisujemy pod spodem odpowiednio przesuni¸ete wzgl¸edem siebie. Ka˙zdy kolejny wynik jest przesuni¸ety o jedn¸a kolumn¸e w lewo. Nast¸epnie sumujemy te iloczyny. Oto przyk lad mno˙zenia liczb 10101 i 101:
1 0 1 0 1
1 0 1
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
1 1 0 1 0 0 1
Zauwa˙zmy, ˙ze pomno˙zenie liczby w postaci dw´ojkowej przez 2 oznacza dopisanie jednego zera na ko´ncu liczby. Podobnie pomno˙zenie przez i-t¸a pot¸eg¸e liczby 2 oznacza dopisanie na ko´ncu liczby i zer. Na przyk lad:
1101101 pomno˙zone przez
1000 daje wynik
1101101000.
R´ownie˙z dzielenie wykonuje si¸e podobnie jak w systemie dziesi¸etnym. Na przyk lad:
1 0 1 0 1
1 1 0 1 0 0 1 : 1 0 1
1 0 1
1 1 0
1 0 1
1 0 1
1 0 1
0 0 0
Je˙zeli liczba jest podzielna przez 2, to ma w postaci binarnej zero na ko´ncu, a je˙zeli dzieli si¸e przez i-t¸a pot¸eg¸e dw´ojki, to ma na ko´ncu i zer. Podzielenie liczby przez 2 oznacza skre´slenie w jej postaci binarnej jednego zera z ko´nca. Na przyk lad:
1010011000 podzielone przez 2 daje:
101001100.
6 Zamiana systemu
Zastan´owmy si¸e teraz, jak przechodzi´c od jednego sposobu przedstawiania liczby do drugiego.
Poniewa˙z b¸edziemy u˙zywa´c r´o˙znych system´ow zapisu liczb, wi¸ec zapis w systemie z baz¸a b oz- naczymy przez:
(drdr−1. . . d1d0)b.
B¸edziemy rezygnowa´c z tego zapisu, je˙zeli nie b¸edzie w¸atpliwo´sci, jakiego systemu u˙zywamy. Przedysku- tujmy to na przyk ladach. Aby przedstawi´c liczb¸e
(110101)2
w postaci dziesi¸etnej, korzystamy ze wzoru 3:
(110101)2 = 1 · 25+ 1 · 24+ 0 · 23+ 1 · 22+ 0 · 21+ 1 · 20,
i wykonujemy wszystkie rachunki w systemie dziesi¸etnym:
(110101)2 = 1 · 32 + 1 · 16 + 0 · 8 + 1 · 4 + 0 · 2 + 1 · 1 = 32 + 16 + 4 + 1 = (53)10.
Podobnie mo˙zemy post¸epowa´c przy zamianie w odwrotn¸a stron¸e, z systemu dziesi¸etnego na dw´ojkowy.
Najpierw korzystamy ze wzoru 1:
(53)10= 5 · 101+ 3 · 100,
nast¸epnie przedstawiamy cyfry i podstaw¸e systemu 10 w postaci dw´ojkowej i wykonujemy wszystkie dzia lania w systemie dw´ojkowym:
(53)10= (101)2· (1010)2+ (11)2 = (110010)2+ (11)2 = (110101)2.
Ten spos´ob zamiany liczb z postaci dziesi¸etnej na dw´ojkow¸a jest analogiczny do sposobu, w jaki wy˙zej zamieniali´smy liczby z postaci dw´ojkowej na dziesi¸etn¸a. By lby to naturalny spos´ob dla kogo´s, kto swobodnie liczy w systemie dw´ojkowym. Spos´ob ten ma t¸e wad¸e, ˙ze wolno dzia la. Zobaczymy na przyk ladach dwa szybsze algorytmy zamiany postaci liczby z dziesi¸etnej na dw´ojkow¸a.
We´zmy liczb¸e 178. Pierwszy spos´ob polega na tym, ˙ze wyszukujemy najwi¸eksz¸a pot¸eg¸e liczby 2, kt´ora jeszcze jest mniejsza od naszej liczby (w przyk ladzie 128 = 27), nast¸epnie odejmujemy t¸e pot¸eg¸e od naszej liczby i z r´o˙znic¸a post¸epujemy tak samo. Na ko´ncu mamy liczb¸e w postaci sumy pot¸eg dw´ojki. W naszym przyk ladzie wygl¸ada to tak:
178 = 128 + 50 = 128 + 32 + 18 = 128 + 32 + 16 + 2.
Teraz ju˙z latwo zapisa´c nasz¸a liczb¸e w postaci dw´ojkowej:
(178)10= (10110010)2.
Drugi spos´ob polega na kolejnym dzieleniu liczby w spos´ob ca lkowity przez 2 i zapami¸etywaniu reszt z dzielenia. Reszty te zapisane w odwrotnej kolejno´sci tworz¸a zapis binarny liczby. Na przyk lad, we´zmy znowu liczb¸e 178. W poni˙zszej tabeli przedstawiono kolejne ilorazy i reszty.
liczba iloraz reszta
178 89 0
89 44 1
44 22 0
22 11 0
11 5 1
5 2 1
2 1 0
1 0 1
Reszty zapisane w odwrotnej kolejno´sci:
10110010,
tworz¸a binarny zapis liczby (178)10.
Poprawno´s´c dzia lania tego algorytmu wynika z faktu, ˙ze je˙zeli podzielimy liczb¸e x =
Xr
i=0
di· 2i
przez 2, to reszta z dzielenia wyniesie d0, a iloraz ca lkowitoliczbowy wyniesie:
Xr
i=1
di· 2i−1,
nast¸epne dzielenie przez 2 da reszt¸e d1 oraz iloraz:
Xr
i=2
di· 2i−2,
i tak dalej.
Ostatni spos´ob mo˙zna latwo uog´olni´c na algorytm zamiany liczb z systemu dziesi¸etnego na system z inn¸a baz¸a b. Nale˙zy tylko dzieli´c przez b. Je˙zeli chcemy, na przyk lad, przedstawi´c liczb¸e 60 w systemie tr´ojkowym, to dzielimy j¸a kolejno przez 3 i spisujemy reszty z dzielenia:
liczba iloraz reszta
60 20 0
20 6 2
6 2 0
2 0 2
W wyniku otrzymamy:
(60)10= (2020)3.
7 U lamki
Przypomnijmy najpierw kr´otko, jak przedstawia si¸e u lamek w systemie dziesi¸etnym. Na przyk lad, 0.234
oznacza:
2 · 10−1+ 3 · 10−2+ 4 · 10−3.
U˙zyli´smy kropki do oddzielania cz¸e´sci ca lkowitej od u lamkowej. Jest to cz¸esto u˙zywany w infor- matyce spos´ob, stosowany mi¸edzy innymi w j¸ezyku Pascal.
Og´olniej, zapis:
0.d1d2. . . dr oznacza liczb¸e:
d1· 10−1+ d2· 10−2+ . . . + dr· 10−r,
kt´or¸a mo˙zemy te˙z zapisa´c w postaci:
Xr
i=1
di· 10−i.
Podobnie mo˙zemy zapisywa´c u lamki w systemie dw´ojkowym. Jedyna r´o˙znica polega na tym, ˙ze w systemie binarnym podstaw¸a pot¸eg jest dw´ojka i ˙ze u˙zywamy tylko dw´och cyfr, 0 i 1. Tak wi¸ec w systemie dw´ojkowym zapis:
0.d1d2. . . dr
oznacza liczb¸e:
d1· 2−1+ d2· 2−2+ . . . + dr· 2−r, lub inaczej:
Xr
i=1
di· 2−i. Na przyk lad:
(0.1)2 = (0.5)10, (0.11)2 = (0.75)10, (0.101)2 = (0.625)10.
W poni˙zszej tabeli przedstawiono kilka pierwszych ujemnych pot¸eg liczby 2 w systemie dw´ojkowym i dziesi¸etnym.
2−1 (0.1)2 (0.5)10
2−2 (0.01)2 (0.25)10
2−3 (0.001)2 (0.125)10
2−4 (0.0001)2 (0.0625)10
2−5 (0.00001)2 (0.03125)10
2−6 (0.000001)2 (0.015625)10
8 System szesnastkowy
W informatyce u˙zywa si¸e te˙z systemu szesnastkowego, gdzie podstaw¸a jest liczba 16. Do systemu szesnastkowego potrzebujemy szesnastu cyfr. Zwykle u˙zywa si¸e nast¸epuj¸acych ,,cyfr”:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
W poni˙zszej tabeli zestawiono cyfry systemu szesnastkowego z odpowiadaj¸acymi im liczbami w systemie dw´ojkowym i dziesi¸etnym.
szesnastkowy dw´ojkowy dziesi¸etny
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15
Liczby w systemie szesnastkowym poprzedza si¸e zwykle (na przyk lad w j¸ezyku Pascal) znakiem dolara $. I tak zapis $A1 oznacza liczb¸e w systemie szesnastkowym, kt´ora w systemie dziesi¸etnym ma poni˙zsz¸a posta´c:
$A1 = 10 · 16 + 1 = (161)10.
Dzi¸eki temu, ˙ze 16 jest pot¸eg¸a dw´ojki, prosta jest zamiana postaci liczby z systemu dw´ojkowego na szesnastkowy, i na odwr´ot. Przy zamianie z systemu szesnastkowego na dw´ojkowy wystarczy zamienia´c kolejne cyfry przedstawienia na grupy odpowiednich czterech bit´ow wed lug powy˙zszej tabeli. Na przyk lad liczba, kt´ora w systemie szesnastkowym wygl¸ada tak:
$A91, w systemie dw´ojkowym ma posta´c:
1010|1001|0001.
Przy zamianie z postaci dw´ojkowej na posta´c szesnastkow¸a post¸epujemy odwrotnie. Zast¸epujemy grupy po cztery bity pojedynczymi cyframi. Na przyk lad:
(1110|0011|1011|0000)2 = $E3B0.
Je˙zeli liczba cyfr w postaci dw´ojkowej nie dzieli si¸e przez 4, to uzupe lniamy j¸a zerami na pocz¸atku.
Na przyk lad:
(110|1111|0110|0010)2 = (0110|1111|0110|0010)2 = $6F 62.
W ten spos´ob mo˙zemy u˙zywa´c zapisu szesnastkowego do zwi¸ez lego przedstawiania d lugich ci¸ag´ow bit´ow.
9 Reprezentacja liczb w komputerze
W j¸ezyku Pascal ka˙zda zmienna ma sw´oj typ, kt´ory jest deklarowany na pocz¸atku programu.
Spos´ob przechowywania warto´sci zmiennej zale˙zy od jej typu.
10 Integer
Zmienne typu integer przechowywane s¸a w dw´och bajtach. Jeden bajt (ang. byte) zawiera osiem bit´ow, tak wi¸ec warto´s´c zmiennej typu integer przechowywana jest w szesnastu bitach. Pierwszy bit oznacza znak. Je˙zeli jest on zerem, to liczba jest dodatnia, je˙zeli jedynk¸a, to ujemna.
Je˙zeli liczba jest dodatnia, to pozosta le pi¸etna´scie bit´ow stanowi binarny zapis tej liczby. Na przyk lad liczba 15 jest przechowywana jako:
0000|0000|0000|1111.
Najwi¸eksz¸a liczb¸e dodatni¸a, jak¸a mo˙zna przechowa´c w zmiennej typu integer, jest:
0111|1111|1111|1111, czyli zero i pi¸etna´scie jedynek. Jest to:
215− 1 = (32767)10.
Liczby ujemne s¸a przechowywane w tak zwanym systemie uzupe lnieniowym. Liczba ujemna o warto´sci bezwzgl¸ednej x jest przedstawiana jako liczba:
216− x
w postaci binarnej. Na przyk lad liczba −1 jest przedstawiona jako:
1111|1111|1111|1111, czyli szesna´scie jedynek. A liczba −3 jako:
1111|1111|1111|1101.
Najmniejsza liczba ujemna, kt´or¸a mo˙zna zmie´sci´c do zmiennej typu integer, to:
1000|0000|0000|0000, czyli jedynka i pi¸etna´scie zer, kt´ora koduje liczb¸e:
−215= (−32768)10.
W j¸ezyku Pascal nie ma ˙zadnego zabezpieczenia przed przekroczeniem maksymalnego lub mini- malnego zakresu liczb typu integer. Je˙zeli, na przyk lad, do liczby 32767, kt´ora jest przechowywana jako:
0111|1111|1111|1111, dodamy jedynk¸e, to otrzymamy:
1000|0000|0000|0000,
kt´ora koduje liczb¸e −32768, i komputer nie zakomunikuje tego przekroczenia.
11 Real
Liczby typu real s¸a zapisywane w dw´och notacjach:
• sta lopozycyjnej,
• zmiennopozycyjnej.
Liczby w notacji sta lopozycyjnej to, na przyk lad:
0.10, 11.023, 12.0,
czyli notacja dziesi¸etna. Zwr´o´cmy uwag¸e, ˙ze kropka oddziela cz¸e´s´c ca lkowit¸a liczby od cz¸e´sci u lamkowej.
W notacji zmiennopozycyjnej liczba przedstawiona jest w postaci:
mEc,
gdzie m jest mantys¸a, liczb¸a w postaci dziesi¸etnej z przedzia lu 1 ≤ m < 10 lub −10 < m ≤ −1, a c, zwana cech¸a, jest liczb¸a ca lkowit¸a. Zapis mEc oznacza liczb¸e:
m · 10c.
W poni˙zszej tabeli mamy kilka liczb w postaci sta lo- i zmiennopozycyjnej.
4837.92 4.83792E3 0.034 3.4E − 2
−12.0 −1.2E1
Spos´ob przechowywania warto´sci zmiennych typu real jest skomplikowany i nie b¸edzie przedstaw- iony szczeg´o lowo.
12 Inne typy ca lkowite
W j¸ezyku Pascal, opr´ocz integer, mo˙zna u˙zywa´c innych typ´ow ca lkowitych; s¸a to:
• shortint, zawiera liczby ca lkowite z przedzia lu od −128 do 127,
• byte, zawiera liczby ca lkowite z przedzia lu od 0 do 255,
• word, zawiera liczby ca lkowite z przedzia lu od 0 do 65535,
• longint, zawiera liczby ca lkowite z przedzia lu od −2147483648 do 2147483647.
Elementy typu byte i shortint przechowywane s¸a w jednym bajcie (osiem bit´ow) pami¸eci, typu word — w dw´och bajtach, a typu longint — w czterech bajtach pami¸eci. Liczby typu shortint i longint mog¸a by´c dodatnie lub ujemne i s¸a zapami¸etywane w postaci uzupe lnieniowej z pierwszym bitem oznaczaj¸acym znak (podobnie jak liczby typu integer). Elementy typu byte i word mog¸a by´c tylko dodatnie i s¸a przechowywane w postaci dw´ojkowej.
13 Wyra˙zenia arytmetyczne w j¸ ezyku Pascal
W j¸ezyku Pascal wyra˙zeniami arytmetycznymi s¸a sta le liczbowe, na przyk lad:
234, −123, 0.123, −23.45, 3.21E − 5,
oraz zmienne typ´ow liczbowych (np. integer lub real). Wyra˙zenia mo˙zna tak˙ze budowa´c za pomoc¸a operator´ow arytmetycznych i nawias´ow. Je˙zeli U oraz W s¸a dwoma wyra˙zeniami arytmetycznymi, to wyra˙zeniami arytmetycznymi s¸a tak˙ze:
U+W, U-W, U*W, U/W, (U), U div V, U mod V.
Gwiazdka ∗ reprezentuje tutaj znak mno˙zenia, a operacje div oraz mod to iloraz i reszta z dzielenia ca lkowitoliczbowego (s¸a one opisane dok ladnie w rozdziale o teorii liczb).
Na przyk lad, wyra˙zeniami arytmetycznymi s¸a:
-(2-3)/2+7*4, (2-3)/(3*2), 7 div 2, 7 mod 2.
Je˙zeli x oraz y s¸a zmiennymi liczbowymi, to wyra˙zeniami arytmetycznymi s¸a tak˙ze:
2*x, x*x-2/y.
Dla danego wyra˙zenia mo˙zemy obliczy´c jego warto´s´c. Robi si¸e to wed lug zwyk lych regu l znanych ze szko ly. Najpierw oblicza si¸e wyra˙zenia w nawiasach, potem mno˙zenie i dzielenie (od lewej do prawej), a na ko´ncu dodawanie i odejmowanie (od lewej do prawej).
14 Poszukiwania binarne (binary search)
Znana jest gra w dwadzie´scia pyta´n. W tej grze za pomoc¸a dwudziestu pyta´n, na kt´ore odpowiedzi¸a mo˙ze by´c ,,tak” lub ,,nie”, nale˙zy odgadn¸a´c pomy´slan¸a przez przeciwnika rzecz. Zobaczymy, jak mo˙zna wykorzysta´c binarny system zapisu liczb do opracowania strategii wygrywaj¸acej w tej grze.
Najpierw upro´s´cmy nieco t¸e gr¸e. Za l´o˙zmy, ˙ze mo˙zemy zada´c tylko cztery pytania i ˙ze odgadu- jemy liczb¸e naturaln¸a x ze zbioru:
A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}.
Wtedy nale˙zy zada´c nast¸epuj¸ace cztery pytania:
• Czy liczba x nale˙zy do zbioru A1= {8, 9, 10, 11, 12, 13, 14, 15}?
• Czy x nale˙zy do zbioru A2 = {4, 5, 6, 7, 12, 13, 14, 15}?
• Czy x nale˙zy do zbioru A3 = {2, 3, 6, 7, 10, 11, 14, 15}?
• Czy x nale˙zy do zbioru A4 = {1, 3, 5, 7, 9, 11, 13, 15}?
Dlaczego te cztery pytania wystarcz¸a? Sprawa stanie si¸e jasna, je˙zeli przedstawimy liczby w postaci binarnej. Ka˙zd¸a za pomoc¸a czterech bit´ow (z zerami na pocz¸atku). Wtedy nasz zbi´or wygl¸ada tak:
A = { 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111}.
A pytania wygl¸adaj¸a teraz tak:
• Czy x nale˙zy do zbioru A1 = {1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111}?
• Czy x nale˙zy do zbioru A2 = {0100, 0101, 0110, 0111, 1100, 1101, 1110, 1111}?
• Czy x nale˙zy do zbioru A3 = {0010, 0011, 0110, 0111, 1010, 1011, 1110, 1111}?
• Czy x nale˙zy do zbioru A4 = {0001, 0011, 0101, 0111, 1001, 1011, 1101, 1111}?
Zauwa˙zmy, ˙ze zbi´or A1 zawiera wszystkie liczby z pierwszym bitem r´ownym jedynce, w A2 s¸a wszystkie liczby z drugim bitem r´ownym jedynce, i tak dalej. Tak wi¸ec nasze pytania s¸a w rzeczy- wisto´sci pytaniami o kolejne bity odgadywanej liczby. Na przyk lad w pierwszym pytaniu pytamy, czy pierwszy bit odgadywanej liczby jest jedynk¸a.
Ale mo˙zna do tych pyta´n podej´s´c inaczej. Najpierw dzielimy zbi´or na po lowy: na liczby mniejsze od o´smiu i na liczby wi¸eksze lub r´owne o´smiu, i pytamy, do kt´orej po lowy nale˙zy odgadywana liczba (dok ladniej pytamy, czy liczba nale˙zy do g´ornej po lowy). Po uzyskaniu odpowiedzi mamy dwa razy w¸e˙zszy przedzia l poszukiwa´n. Przypu´s´cmy, ˙ze odgadywan¸a liczb¸a jest 11. W drugim etapie dzielimy przedzia l
{8, 9, 10, 11, 12, 13, 14, 15}
na po lowy, g´orn¸a:
{12, 13, 14, 15}
i doln¸a:
{8, 9, 10, 11}
i pytamy, do kt´orej po lowy nale˙zy szukana liczba. Po drugiej odpowiedzi przedzia l poszukiwa´n jest ju˙z cztery razy kr´otszy. Po dw´och kolejnych pytaniach przedzia l zaw¸e˙za si¸e do jednej liczby. Drugi spos´ob jest ca lkowicie r´ownowa˙zny pierwszemu, tutaj te˙z pytamy o kolejne bity i otrzymujemy takie same odpowiedzi.
Potrzeba cztery razy kolejno dzieli´c zbi´or na po lowy, aby z pocz¸atkowej d lugo´sci 16 przej´s´c na ko´ncu do d lugo´sci 1. A ile trzeba podzia l´ow, je˙zeli na pocz¸atku mamy n = 2k element´ow?
Po pierwszym podziale nasz zbi´or b¸edzie mia l d lugo´s´c 2k−1, po drugim 2k−2, a po i-tym 2k−i. Jak wida´c, potrzeba k = log2n kolejnych podzia l´ow, aby doj´s´c do 1. Tak wi¸ec je˙zeli mamy do dyspozycji 20 pyta´n, to mo˙zemy odnale´z´c jedn¸a spo´sr´od 220 liczb ca lkowitych z przedzia lu od 0 do 220− 1 = 1 048 575.
15 Waga
Zobaczymy teraz, jak mo˙zna wykorzysta´c tr´ojkowy system zapisu liczb. W systemie tr´ojkowym podstaw¸a jest liczba 3, mamy trzy cyfry {0, 1, 2} i zapis
drdr−1. . . d1d0
oznacza liczb¸e:
dr· 3r+ dr−1· 3r−1+ . . . + d1· 31+ d0· 30,
lub inaczej:
Xr
i=0
di· 3i.
Wyobra´zmy sobie wag¸e szalkow¸a. Na jednej szalce, lewej, k ladziemy jaki´s przedmiot do zwa˙zenia, a nast¸epnie na obu szalkach k ladziemy odwa˙zniki. Je˙zeli waga jest w r´ownowadze, to wa˙zony przed- miot ma wag¸e r´own¸a sumie (nomina l´ow) odwa˙znik´ow po lo˙zonych na prawej szalce minus suma odwa˙znik´ow po lo˙zonych na lewej szalce, obok wa˙zonego przedmiotu. Na przyk lad, je˙zeli na prawej szalce le˙z¸a odwa˙zniki o ci¸e˙zarach 2 i 20 gram´ow, a na lewej odwa˙zniki o wadze 4 i 5 gram´ow, to przedmiot wa˙zy 13 = (20 + 2) − (5 + 4) gram´ow.
Interesuj¸ace nas pytanie brzmi: jakie powinny by´c nomina ly poszczeg´olnych odwa˙znik´ow, aby mo˙zna by lo zwa˙zy´c ka˙zdy ci¸e˙zar o wadze od 1 do N , przy jak najmniejszej liczbie odwa˙znik´ow.
Zak ladamy, ˙ze wa˙zymy tylko przedmioty o ca lkowitych wagach.
Rozpatrzmy najpierw przyk lad czterech odwa˙znik´ow o wagach:
c1, c2, c3, c4.
Ile r´o˙znych ci¸e˙zar´ow mo˙zna odwa˙zy´c za pomoc¸a czterech odwa˙znik´ow? Poniewa˙z ka˙zdy odwa˙znik mo˙ze si¸e znajdowa´c na prawej lub lewej szalce, lub na stole, to mamy 34 = 81 r´o˙znych po lo˙ze´n odwa˙znik´ow. W´sr´od tych po lo˙ze´n jest takie, gdzie wszystkie cztery odwa˙zniki le˙z¸a na stole (wt- edy wa˙zymy zerowy ci¸e˙zar). Ponadto je˙zeli odwa˙zniki le˙z¸a na szalkach i odwa˙zaj¸a ci¸e˙zar W , to zamieniwszy po lo˙zenia odwa˙znik´ow na szalkach (odwa˙zniki z lewej przek ladamy na praw¸a szalk¸e, i na odwr´ot), b¸edziemy odwa˙za´c ci¸e˙zar −W . Tak wi¸ec spo´sr´od 81 u lo˙ze´n odwa˙znik´ow na szalkach tylko
81 − 1 2 = 40
odwa˙za jaki´s dodatni ci¸e˙zar. Oczywi´scie mo˙ze si¸e zdarzy´c, ˙ze dwa r´o˙zne po lo˙zenia odwa˙znik´ow odwa˙zaj¸a ten sam ci¸e˙zar.
Interesuje nas, czy istniej¸a takie cztery odwa˙zniki, za pomoc¸a kt´orych mo˙zna odwa˙zy´c ka˙zdy ci¸e˙zar od 1 do 40. Odpowied´z na to pytanie jest pozytywna. Istniej¸a takie cztery odwa˙zniki, s¸a to:
1, 3, 9, 27.
Zauwa˙zmy, ˙ze nomina ly odwa˙znik´ow to cztery pierwsze pot¸egi liczby 3. Ka˙zde u lo˙zenie tych odwa˙znik´ow odwa˙za ci¸e˙zar:
W = d3· 27 + d2· 9 + d1· 3 + d0· 1, (5) lub inaczej:
W = d3· 33+ d2· 32+ d1· 31+ d0· 30,
gdzie di = 1, je˙zeli odwa˙znik o nominale 3i le˙zy na prawej szalce, di = −1, je˙zeli le˙zy na lewej, i di = 0, je˙zeli le˙zy na stole.
Zobaczymy, ˙ze ka˙zd¸a liczb¸e od 1 do 40 mo˙zna przedstawi´c w postaci 5. Zauwa˙zmy, ˙ze je˙zeli do ci¸e˙zaru W dodamy:
40 = 27 + 9 + 3 + 1,
to otrzymamy:
W + 40 = (d3+ 1) · 33+ (d2+ 1) · 32+ (d1+ 1) · 31+ (d0+ 1) · 30. Je˙zeli teraz oznaczymy:
ei = di+ 1, dla 0 ≤ i ≤ 3, to otrzymamy:
W + 40 = e3· 33+ e2· 32+ e1· 31+ e0· 30. (6) Zauwa˙zmy, ˙ze ka˙zde ei jest teraz ze zbioru {0, 1, 2} i wz´or 6 przedstawia rozwini¸ecie liczby W + 40 w systemie tr´ojkowym, a poniewa˙z W jest z przedzia lu od 1 do 40, to W + 40 jest z przedzia lu od 41 do 80 i mo˙zna j¸a przedstawi´c za pomoc¸a czterech cyfr w systemie tr´ojkowym.
Powy˙zszy wyw´od sugeruje algorytm odszukiwania po lo˙zenia odwa˙znik´ow dla danego ci¸e˙zaru W . Algorytm wa ˙zenia. Chc¸ac zwa˙zy´c ci¸e˙zar W z przedzia lu od 1 do 40:
• przedstawiamy liczb¸e W + 40 w systemie tr´ojkowym: W + 40 = (e3e2e1e0)3,
• od ka˙zdej cyfry odejmujemy jedynk¸e: di= ei− 1,
• posta´c (d3d2d1d0) okre´sla po lo˙zenie poszczeg´olnych odwa˙znik´ow wed lug zasady:
je˙zeli di = 1, to odwa˙znik o nominale 3i nale˙zy po lo˙zy´c na prawej szalce,
je˙zeli di = −1, to na lewej,
je˙zeli di = 0, to na stole.
Spr´obujmy zwa˙zy´c ci¸e˙zar W = 20 gram´ow. W rozdziale o zamianie systemu obliczyli´smy, ˙ze liczba 60 = 20 + 40 w systemie tr´ojkowym ma posta´c:
(60)10= (2020)3, czyli:
60 = 2 · 27 + 0 · 9 + 2 · 3 + 0 · 1.
Odejmujemy teraz jedynk¸e od ka˙zdej cyfry i otrzymujemy:
(1¯11¯1).
Tutaj ¯1 oznacza −1. Mamy wi¸ec:
20 = 27 − 9 + 3 − 1.
Metod¸e opisan¸a wy˙zej mo˙zna uog´olni´c na wi¸eksz¸a liczb¸e odwa˙znik´ow. Je˙zeli mamy N odwa˙znik´ow o nomina lach:
1, 3, . . . , 3N−1,
to mo˙zemy odwa˙zy´c ka˙zdy ci¸e˙zar W z przedzia lu od 1 do (3N − 1)/2. Nale˙zy rozwin¸a´c liczb¸e W + (3N − 1)/2 w systemie tr´ojkowym, a nast¸epnie od ka˙zdej cyfry rozwini¸ecia odj¸a´c jedynk¸e.
16 Zadania
1. Zwi¸eksz o jeden nast¸epuj¸ace liczby zapisane w postaci dw´ojkowej: a) 11010011; b) 111111.
2. Por´ownaj nast¸epuj¸ace pary liczb: a) 110011, 110100; b) 11010, 1110.
3. Dodaj (odejmij, pomn´o˙z) w postaci dw´ojkowej nast¸epuj¸ace pary liczb: a) 110011, 110100;
b) 11010, 1110.
4. Napisz dok ladny algorytm odejmowania dw´och liczb w postaci dw´ojkowej.
5. Liczby 81, 126 przedstaw w postaci dw´ojkowej. Jak b¸ed¸a one reprezentowane w komputerze jako sta le typu integer (byte, word)?
6. Nast¸epuj¸ace liczby przedstaw w postaci dw´ojkowej: 6.75, 5.625, $B1, $FF.
7. Nast¸epuj¸ace liczby przedstaw w postaci tr´ojkowej: 80, 120.
8. Nast¸epuj¸ace liczby w postaci dw´ojkowej, 10001101, 100101, przedstaw w postaci: a) dziesi¸etnej, b) szesnastkowej.
9. Opisz algorytm zamiany u lamka z postaci dziesi¸etnej na posta´c dw´ojkow¸a.
10. Ile maksymalnie pyta´n z odpowiedziami TAK/NIE trzeba zada´c, aby odgadn¸a´c liczb¸e z przedzia lu od 0 do 100 000?
11. Jak nale˙zy u lo˙zy´c na szalkach odwa˙zniki o nomina lach 1, 3, 9, 27, aby odwa˙zy´c ci¸e˙zar: a) 35, b) 29?