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: .