Diskreetit rakenteet. Juha Kortelainen



Samankaltaiset tiedostot
811120P Diskreetit rakenteet

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet

Diskreetit rakenteet P 5 op

811120P Diskreetit rakenteet

Diskreetit rakenteet. 3. Logiikka. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1

811120P Diskreetit rakenteet

Merkitse kertolasku potenssin avulla ja laske sen arvo.

Kappale 20: Kantaluvut

} {{ } kertaa jotain

3. Kongruenssit. 3.1 Jakojäännös ja kongruenssi

8.1 Murtoluvun määritelmä - murtoluvulla tarkoitetaan aina osaa (osia) jostakin kokonaisuudesta

Paavo Räisänen. Ohjelmoijan binaarialgebra ja heksaluvut.

811120P Diskreetit rakenteet

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

1 Peruslaskuvalmiudet

Aiemmin opittu. Jakson tavoitteet. Ajankäyttö. Tutustu kirjaan!

Matematiikan mestariluokka, syksy

Numeeriset menetelmät

811120P Diskreetit rakenteet

LUKUJÄRJESTELMÄT. Kymmenjärjestelmä eli desimaalijärjestelmä. Binäärilukujärjestelmä

Reaaliluvut 1/7 Sisältö ESITIEDOT:

etunimi, sukunimi ja opiskelijanumero ja näillä

Ohjelmoijan binaarialgebra ja heksaluvut

811120P Diskreetit rakenteet

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

LUKUTEORIA johdantoa

Huom! (5 4 ) Luetaan viisi potenssiin neljä tai viisi neljänteen. 7.1 Potenssin määritelmä

(1) refleksiivinen, (2) symmetrinen ja (3) transitiivinen.

2.2 Neliöjuuri ja sitä koskevat laskusäännöt


811120P Diskreetit rakenteet

C = P Q S = P Q + P Q = P Q. Laskutoimitukset binaariluvuilla P -- Q = P + (-Q) (-Q) P Q C in. C out

Matematiikassa ja muuallakin joudutaan usein tekemisiin sellaisten relaatioiden kanssa, joiden lakina on tietyn ominaisuuden samuus.

Matematiikka vuosiluokat 7 9

5. Laskutoimitukset eri lukujärjestelmissä

MAY1 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty Julkaiseminen sallittu vain koulun suljetussa verkossa.

Neljän alkion kunta, solitaire-peli ja

1. Kirjoita algoritmi, joka saa syötteenä pallon säteen ja tulostaa pallon tilavuuden.

Lukujärjestelmät. Digitaalitekniikan matematiikka Luku 9 Sivu 3 (26) Lukujärjestelmät ja lukujen esittäminen Fe

Ehto- ja toistolauseet

2 Yhtälöitä ja epäyhtälöitä

Matematiikan tukikurssi

Tietotyypit ja operaattorit

Tietorakenteet (syksy 2013)

1. Logiikan ja joukko-opin alkeet

Liukulukulaskenta. Pekka Hotokka

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 3 (9 sivua) OT

Suurin yhteinen tekijä (s.y.t.) ja pienin yhteinen monikerta (p.y.m.)

Testaa taitosi 1: Lauseen totuusarvo

Vaihtoehtoinen tapa määritellä funktioita f : N R on

MS-A0402 Diskreetin matematiikan perusteet

Java-kielen perusteet

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

4 Yleinen potenssifunktio ja polynomifunktio

Yhden bitin tiedot. Binaariluvun arvon laskeminen. Koodin bittimäärä ja vaihtoehdot ? 1

Tekijä Pitkä Matematiikka 11 ratkaisut luku 2

Osa 1: Todennäköisyys ja sen laskusäännöt. Klassinen todennäköisyys ja kombinatoriikka

Aloitustunti MAA22 Starttikurssi pitkän matematiikan opiskeluun

a k+1 = 2a k + 1 = 2(2 k 1) + 1 = 2 k+1 1. xxxxxx xxxxxx xxxxxx xxxxxx

Matematiikan tukikurssi

n! k!(n k)! n = Binomikerroin voidaan laskea pelkästään yhteenlaskun avulla käyttäen allaolevia ns. palautuskaavoja.

2.1. Tehtävänä on osoittaa induktiolla, että kaikille n N pätee n = 1 n(n + 1). (1)

Johdatus matemaattiseen päättelyyn

ANSI/IEEE Std

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Algoritmit 2. Luento 8 To Timo Männikkö

Desimaaliluvut, mitä ne oikeastaan ovat?

Funktion raja-arvo. lukumäärien tutkiminen. tutkiminen

1.1 Funktion määritelmä

Python-ohjelmointi Harjoitus 2

Johdatus matematiikkaan

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

Liite 1. Laajennettu Eukleideen algoritmi suoraviivainen tapa

Luvuilla laskeminen. Esim. 1 Laske

Ohjelmoinnin perusteet Y Python

802328A LUKUTEORIAN PERUSTEET OSA III BASICS OF NUMBER THEORY PART III. Tapani Matala-aho MATEMATIIKKA/LUTK/OULUN YLIOPISTO

Todistusmenetelmiä Miksi pitää todistaa?

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Ohjelmoinnin perusteet Y Python

a b c d

Ohjelmoinnin perusteet Y Python

Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }?

Joukot. Georg Cantor ( )

Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa.

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

802328A LUKUTEORIAN PERUSTEET OSA III BASICS OF NUMBER THEORY PART III

KESKEISET SISÄLLÖT Keskeiset sisällöt voivat vaihdella eri vuositasoilla opetusjärjestelyjen mukaan.

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet )

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

NELIÖJUURI. Neliöjuuren laskusääntöjä

LAUSEKKEET JA NIIDEN MUUNTAMINEN

Alkulukujen harmoninen sarja

Ohjelmoinnin peruskurssi Y1

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Transkriptio:

Diskreetit rakenteet 811120P 5 op Juha Kortelainen Syksy 2015

Sisältö 1 Algoritmin käsite 4 1.1 Mitä algoritmi on?........................ 4 1.2 Kontrollirakenteet......................... 6 1.3 Muita esimerkkejä algoritmeista................. 9 2 Lukujärjestelmät ja niiden muunnokset; lukujen aritmetiikka 11 2.1 Reaaliluvut ja kymmenjärjestelmä................ 11 2.2 Binaarijärjestelmä......................... 12 2.3 Muuntaminen kymmenjärjestelmästä binaarijärjestelmään.. 13 2.4 Oktaali- ja heksadesimaalijärjestelmät............. 16 2.5 Aritmetiikka muissa kuin kymmenjärjestelmässsä....... 18 2.6 Lukujen esittäminen tietokoneessa................ 20 2.6.1 Kokonaislukujen esittäminen............... 20 2.6.2 Kokonaislukuaritmetiikka................ 23 2.6.3 Reaalilukujen esittäminen................ 25 2.6.4 Reaalilukuaritmetiikka.................. 30 3 Logiikka (propositiokalkyyli, predikaattikalkyylin alkeet) 31 3.1 Logiikka ja laskeminen tietokoneella............... 31 3.2 Propositiot............................ 31 1

3.3 Loogiset operaatiot (konnektiivit) ja totuustaulut............................ 33 3.4 Yhdistetyt propositiot ja lauselogiikan ilmaisut......... 35 3.5 Looginen ekvivalenssi....................... 38 3.6 Logiikan lait............................ 40 3.7 Loogisesta päättelystä...................... 43 3.8 Predikaattilogiikka........................ 43 3.9 Todistusmenetelmiä........................ 48 4 Joukot 51 4.1 Johdanto.............................. 51 4.2 Osajoukot, joukko-operaatiot ja Vennin diagrammit........................ 52 4.3 Joukon koko ja joukkojen karteesinen tulo........... 56 4.4 Joukkojen tietokone-esitys.................... 58 4.5 Relaatiot.............................. 59 4.6 Funktiot ja laskenta tietokoneella................ 66 4.7 Yhdistetty funktio ja käänteisfunktio.............. 69 4.8 Funktiot ohjelmointikielissä................... 73 4.9 Rekursio ja jonot......................... 74 4.10 Todistaminen induktiolla..................... 78 4.11 Induktio ja rekursio........................ 81 4.12 Lineaarinen rekursioyhtälö.................... 82 4.13 Rekursiivisesti määritellyt funktiot ja rekursiiviset algoritmit. 86 5 Alkeislukuteoria (jaollisuus ja siihen liittyvät algoritmit) 91 5.1 Mitä lukuteoria on........................ 91 5.2 Jaollisuus ja alkuluvut...................... 92 2

5.3 Suurin yhteinen tekijä ja Euklideen algoritmi.............................. 93 5.4 Kongruenssit........................... 98 5.4.1 Pseudosatunnaislukujen generointi........... 100 6 Kombinatoriikka (lukumäärien laskeminen) 104 6.1 Kombinatoriikka ja laskenta tietokeoneella........... 104 6.2 Summa- ja erotusperiaate.................... 104 6.3 Tuloperiaate............................ 105 6.4 Permutaatiot........................... 106 6.5 Kombinaatiot........................... 107 6.6 Otos palautuksella: mikä on permutaatioiden ja kombinaatioiden lukumäärä.......................... 109 6.7 Laatikkoperiaate......................... 110 7 Verkkoteoriaa 111 7.1 Mitä verkko on?.......................... 111 7.2 Verkkoteorian peruskäsitteet................... 111 7.3 Verkon matriisiesitys....................... 114 7.4 Verkkojen isomora........................ 114 7.5 Eulerin polut........................... 114 7.6 Hamiltonin polut......................... 116 7.7 Puut................................ 117 7.8 Virittävät puut.......................... 119 7.9 Juurelliset puut.......................... 119 3

Luku 1 Algoritmin käsite 1.1 Mitä algoritmi on? Keskeinen tehtävä laskennassa (joko käsin tai tietokoneella suoritetussa) on sellaisen prosessin suunnittelu, joka suorittaa annetun tehtävän. Tämä tehtävä voi olla esimerkiksi nimien järjestäminen aakkosjärjestykseen; laskentalaitteiden kytkeminen verkkoon mahdollisimman edullisesti; luvun esityksen muuttaminen kantajärjestelmästä toiseen; viestin salaaminen; digitaalisen piirin suunnittelu mikrosiruun; tai robottikäden liikkeen optimointi. Jokaisessa edellä esitetyssä esimerkkitapauksissa ihminen ja/tai tietokone kykenee suorittamaan tehtävän äärellistä ohjejoukkoa käyttäen askelittain ja yksikäsitteisesti; kyse on algoritmisesta toiminnasta. Esimerkki algoritmista: (käteis)automaatin käyttö. 1. Sujauta pankkikorttisi sille varattuun aukkoon. 2. Kirjoita tunnuslukusi (PIN), kun sitä kysytään. 3. Valitse vaihtoehto 'käteisnosto' valikosta. 4. Kirjoita summa, jonka haluat nostaa. 5. Valitse jompikumpi vaihtoehtoisista kirjaustapahtumista: 'näytölle', 'kuitille'. 6. Ota korttisi ja nostamasi summa. 7. Jos olit valinnut kohdassa 5 vaihtoehdon 'kuitille', ota kuitti. 4

Edellä askeleet 1 7 muodostavat ohjejonon, joka voidaan suorittaa peräjälkeen. Kukin ohje on verrattain selkeä ja yksikäsitteinen, joten keskivertoihminen kykenee ohjeita noudattamaan. Lisäksi prosessi pysähtyy äärellisen askelmäärän jälkeen. Olemme kuvanneet algoritmin olennaisia piirteitä. Algoritmilla on mm. seuraavanlaisia ominaisuuksia. 1. Algoritmi annetaan äärellisenä ohjejoukkona (jotain merkintäjärjestelmää/kieltä käyttäen). 2. On olemassa toteuttaja (ihminen, kone), joka pystyy seuraamaan ohjeita ja suorittamaan tarvittavat (lasku)toimenpiteet. 3. On olemassa välineet tiedon tuottamiseen, tallentamiseen ja käyttäänottoon. 4. Olkoon R kohdan 1 ohjejoukko ja M kohdan 2 toteuttaja. Algoritmi käsittelee aina tietoa (syöte) ja tulostaa tietoa (tuloste). Toteuttaja M reagoi ohjeisiin siten, että millä tahansa (sovittua muotoa olevalla) syötteellä (lasku)toimenpiteet ovat yksinkertaisia ja ne suoritetaan askelittain. 5. Toteuttaja M reagoi ohjejoukkoon R siten, että (lasku)toimenpiteet suoritetaan deterministisesti. 6. Syötteen tulee olla sovittua muotoa ja äärellisesti määriteltävissä. Syötteen koolla ei kuitenkaan ole kiinteää ylärajaa. 7. Tiedon tallentamiseen käytettävän muistitilan koko on äärellinen, mutta ei kiinteä. Muistitilan määrää ei siten ole rajoitettu. 8. Jokaisella sovittua muotoa olevalla syötteellä algoritmi pysähtyy äärellisen askelmäärän jälkeen. 9. Jokaisella sovittua muotoa olevalla syötteellä algoritmi joko ei tulosta mitään tai antaa äärellisen, yksikäsitteisen ja hyvin määritellyn tulosteen. Järjestelmää, joka toteuttaa yllä asetetut ehdot kohtia 8 ja 9 mahdollisesti lukuunottamatta, kutsutaan semialgoritmiksi. On siis mahdollista, että semialgoritmi (vaikka syöte olisi sovittua muotoakin) ei pysähdy äärellisessä askelmäärässä ja sen toiminta voi periaatteessa jatkua rajattomiin. Semialgoritmin ottamien askelten (ja sen suorittamien toimenpiteiden) lukumäärä on tälläin ääretön. Tietysti tulostekin voi tälläin olla äärettömän pituinen. Samalla syötteellä semialgoritmin on kuitenkin aina tuotettava sama tulostus. Syötteen ja (mahdollisen) tulostuksen välillä on siten funktionaalinen riippuvuus. 5

Algoritmi muistuttaa sevästi tietokoneohjelmaa. Tietokoneohjelma onkin algoritmin toteutus jollakin ohjelmointikielellä. Käytämme tässä termiä 'ohjelmointikieli' ei ainoastaan monikäyttöön tarkoitetuista kielistä kuten Pascal, Java, C ja C++, vaan myös erikoiskielistä, kuten makrokäskyjä sisältävistä taulukkolaskenta- ja tietokantakielistä. Algoritmin suunnittelu on yksi askel ohjelmien kirjoittamisessa. Tästä eteenpäin käsittelemme pääosin sellaisia algoritmeja, jotka voidaan toteuttaa tietokoneella. Jotta algoritmien suunnittelu voitaisiin eriyttää jollakin erityisellä kielellä ohjelmoinnista. Kirjoitamme algoritmit pseudokoodia (eli pseudokieltä) käyttäen. Pseudokoodi on strukturoitua suomea (ja englantia) ja se sallii meidän keskittyä algoritmin rakenteeseen ilman että meidän täytyisi muistaa jonkin ohjelmointikielen yksityiskohtia. Esim. 1. Kirjoita algoritmi, joka laskee ympyrän pinta-alan, kun ympyrän säde on annettu. Ratkaisu. Muistetaaan, että r-säteisen ympyrän pinta-ala on π r 2. Algoritmi on seuraavanlainen: 1. Syöte: r {r on ympyrän säde} 2. ala := π r 2 3. Tuloste: ala Esimerkissä 1 esiintyy useita rakenteita, joita käytetään, kun algoritmeja pseudokoodilla kirjoitetaan: askeleet numeroidaan, jotta niihin viittaminen olisi helppoa. Selittäviä tekstejä, jotka eivät suoritukseen kuulu voidaan aaltosuluissa lisätä askelten tekstiin. Symboli := tarkoittaa sijoituslauseketta; siten asskeleessa 2 lausekkeen π r 2 arvo määritetään ja tulos sijoitetaan muuttujan ala arvoksi. Huomaa, että matematiikan kaavat kirjoitetaan matemaattisin merkinnöin, joten meidän ei tarvitse huolehtia siitä miten kaavan yksityiskohdat kirjoitettaisiin ohjelmointikielellä. 1.2 Kontrollirakenteet Esimerkin 1 algoritmissa askeleet suoritetaan järjestyksessä peräperään. Tavallisesti algoritmit sisältävät kuitenkin kontrollirakenteita, ohjeita, jotka ilmineeraavat kuinka monta kertaa ja/tai millä ehdoilla käskyjä suoritetaan. Itse asiassa aiheuttavat nämä kontrollirakenteet (muistin käytöllä terästettynä) sen että tietokoneet laskentakapasiteetiltaan eroavat tavanomaisista aritmeettisista laskukoneista. 6

Esim. 2. Kirjoita algoritmi, joka annetusta äärellisestä reaalilukujonosta määrittää sen pienimmän alkion. Ratkaisu. Karkea: tarkastellaan kutakin jonon lukua erikseen ja pidetään kussakin askeleessa kirjaa siihen asti pienimmästä. 1. Syöte: lukujonon alkioiden lukumäärä n; lukujono x 1, x 2,..., x n 2. min := x 1 3. for i = 2 to n do 3.1. if x i < min then 3.1.1. min := x i 4. Tuloste: min Esimerkin 2 algoritmisa esiintyy kaksi kontrollirakennetta: fordo ja if then. Alla olevassa taulukossa listataan tärkeimmär pseudokoodeissamme esiintyvät kontrollirakenteet. Kontrollirakenteet Kontrollirakenne Esimerkki käytöstä ifthen 1. if x < 0 then 1.1. x := x ifthenelse 1. if x 0 then 1.1. y := x else 1.2. tuloste: ' x' ei ole olemassa fordo 1. sum := 0 2. for i = 1 to 10 do 2.1. sum := sum + 1 whiledo 1. while answer y and answer n do 1.1. Tuloste: 'Vastaa y tai n' Syöte: answer repeatuntil 1. i := 0 2. repeat 2.1. i := i + 1 2.2. Syöte: x i until x i = 0 Esim. 3. Laadi algoritmi, joka annetusta äärellisestä merkkijonosta määrittää koostuuko se pelkästään numeroista vai esiintyykö siinä muitakin symboleita ja tulostaa sitten asianmukaisen ilmoituksen. 7

Ratkaisu. 1. Syöte: merkkijonon alkioiden lukumäärä n; merkkijono c 1 c 2 c n 2. i := 0; d := 0 3. while i < n and d = 0 do 3.1. i := i + 1 3.2. if c i ei ole numero then 3.2.1. d := 1 4. if d = 1 then 4.1. Tuloste: 'Merkkijono sisältää muitakin merkkejä kuin numeroita' else 4.2. Tuloste: 'Merkkijono koostuu pelkästään numeroista' Pseudokoodissa esiintyvät (ohjelma)muuttujat ovat tavanomaisia matemaattisia muuttujia i, j, k,..., x, y, z,... tarvittaessa alaindeksillä varustettuna. Pseudokoodin laskuoperaatioita ovat normaalit aritmeettiset laskutoimitukset (esim. yhteen-, vähennys-, kerto- ja jakolasku), joita sovelletaan muuttujiin ja (reaaliluku)vakioihin. Myös tavanomaisia funktioita (esim. potenssiin korotus, juurenotto, eksponentti- ja logaritmifunktiot sekä trigonometriset funktiot) voidaan käyttää. Pseudokielen ehdot ovat muuttujista ja vakioista (ja joskus jopa metakielen sanoista) muodostettuja väittämiä, joiden todenperäisyys voidaan testata. Matemaattisten ehtojen muodostaminen tapahtuu usein relaatioita =,, <,, > ja käyttäen. Pseudokielen lausekkeita ovat, syöttö- ja tulostuslausekkeiden lisäksi, muiden muassa sijoitus if-then if-then-else for-do while-do repeat-until Sijoituslauseke on muotoa x := q oleva rakenne, missä x on muuttuja ja q voi olla vakio tai muuttuja tai vakioista ja muuttujista aritmeettisia operaatioita ja/tai perusfunktioita käyttäen muodostettu lauseke. Sijoituslausekkeen suorittamisen jälkeen muuttujan x arvo on sama kuin lausekkeen q arvo. Ehtolauseke if-then on muotoa if C then S oleva rakenne, missä C on ehto ja S mikä tahansa pseudokielen lauseke. Jos C on voimassa, suoritetaan S. 8

Jos C ei ole voimassa, ei tehdä mitään ja lauseke katsotaan suoritetuksi. Ehtolauseke if-then-else on muotoa if C then S 1 else S 2 oleva rakenne, missä C on ehto ja S 1 sekä S 2 mitä tahansa pseudokoodilausekkeita. Jos C on voimassa, suoritetaan S 1, ellei, suoritetaan S 2. Tämän jälkeen lauseke on suoritettu. Lausekkeessa for i = a to b do S on i (indeksi)muuttuja, a ja b kokonaislukuvakioita ja S lauseke. Jos a b, lauseke S suoritetaan peräkkäin i:n arvoilla a, a + 1,..., b. Jos a > b, ei tehdä mitään ja lauseke katsotaan suoritetuksi. Toistolausekkeessa while C do S on C ehto ja S lauseke. Jos C on voimassa, lauseke S suoritetaan ja siirrytään lausekkeen alkuun. Jos C ei ole voimassa, ei tehdä mitään ja lauseke katsotaan suoritetuksi. Täten lausekkeen S suorittaminen toistuu niin kauan kuin ehto C on voimassa. Toistolausekkeessa repeat S until C on S lauseke ja C ehto. Suoritetaan S ja testataan onko C voimassa. Jos C on voimassa, palataan lausekkeen alkuun. Jos C ei ole voimassa, lauseke on suoritettu. Siten lauseke S suoritetaan kerran ja suorittamista jatketaan kunnes ehto C tulee voimaan. Pseudokielen yhdistetty lauseke on mikä tahansa äärellinen jono pseudokielen lausekkeita. Myös yhdistetty lauseke on pseudokielen lauseke. Pseudokieliohjelma on yksinkertaisesti jokin pseudokielen yhdistetty lauseke. Pseudokieliohjelma suoritetaan siten, että sen lausekkeet suoritetaan kirjoitusjärjestyksessä, jokainen lauseke täsmälleen kerran. Huomattakoon, että edellä esitellyissä rakenteissa lausekkeet S, S 1 ja S 2 voivat olla myös yhdistettyjä lausekkeita. Pseudikieli kykenee käsittelemään lukuja, merkkejä, äärellisiä jonoja, äärellisiä joukkoja, taulukoita, pinoja, verkkoja jne. 1.3 Muita esimerkkejä algoritmeista Esim. 4. Kirjoita algoritmi, joka laskee arvon lausekkeelle x n, missä x on mielivaltainen reaaliluku ja n positiivinen kokonaisluku. Tässä oletetaan, että kertolasku on käytettävissä, mutta potenssiin korotus ei ole. Ratkaisu. 1. Syöte: reaaliluku x, luonnollinen luku n 2. s := 1; i := 0 9

3. while i < n do 3.1. s := s x 3.2. i := i + 1 4. Tuloste: s Esim. 5. Laadi algoritmi, joka vaihtaa kahden muuttujan arvot. Ratkaisu. 1. {Muuttujien x ja y arvot vaihdetaan} 2. temp := x 3. x := y 4. y := temp Esim. 6. Työpaikkaan hakijoille on pidetty soveltuvuustesti, joka koostuu 30 monivalintakysymyksestä. Kullekin testiin osallistujalle on annettu yksikäsitteinen tunnisteluku. Suunnittele algoritmi, joka tulostaa osallistujat (tunnisteluvun mukaan), kunkin osallistujan saaman pistemäärän ja tiedotteen, kutsutaanko hakija haastatteluun (pistemäärä 24), asetetaanko hänet varalle ( 20 pistemäärä < 24) vai jääkö hakija huomiotta (pistemäärä < 20). Syöte koostuu hakijoiden lukumäärästä, hakijoiden soveltuvuustestivastauksista ja oikeista vastauksista. Ratkaisu. Seuraavassa n on hakijoiden lukumäärä, a ij on hakijan i vastaus kysymykseen j (i = 1, 2,..., n, j = 1, 2,..., 30) ja c k on oikea vastaus kysymykseen k (k = 1, 2,..., 30). 1. Syöte: n, a ij (i = 1, 2,..., n, j = 1, 2,..., 30), c k (k = 1, 2,..., 30) 2. for i = 1 to n do 2.1. pist := 0 2.2. for j = 1 to 30 do 2.2.1. if a ij = c j then 2.2.1.1 pist := pist + 1 2.3. Tuloste: i, pist 2.4. if pist 24 then 2.4.1 Tuloste: 'haastatteluun' 2.5. if 20 pist < 24 then 2.5.1 Tuloste: 'varalle' 2.6. if pist < 20 then 2.5.1 Tuloste: 'huomiotta' 10

Luku 2 Lukujärjestelmät ja niiden muunnokset; lukujen aritmetiikka 2.1 Reaaliluvut ja kymmenjärjestelmä Lukuja voidaan esittää usealla tavalla esim. eri kantajärjestelmissä. Seuraavassa paneudutaan erityisesti lukujen esittämiseen tietokoneella. Tärkeimpiä lukujoukkoja ovat N = { 0, 1, 2,...} luonnolliset luvut N + = { 1, 2, 3,...} positiiviset kokonaisluvut Z = {..., 2, 1, 0, 1, 2,... } kokonaisluvut Q on rationaalilukujen joukko, ja R on reaalilukujen joukko. Luku on rationaaliluku, jos se voidaan esittää muodossa p, missä p Z ja q q N +. Reaaliluku, joka ei ole rationaaliluku, on irrationaaliluku. Tuttuja esimerkkejä irrationaaliluvuista ovat 2, Neperin luku e ja π. Reaaliluvut esitetään desimaalijärjestelmässä numerojonona, negatiivisen luvun edessä on miinusmerkki. Numerojono voi myös sisältää desimaalipilkun. Joidenkin lukujen desimaaliesitys on päättymätön; niitä ei voi esittää desimaalijärjestelmässä äärellisellä määrällä numeroita. Desimaalijärjestelmä on ns. paikkaan perustuva lukujärjestelmä; kullakin jonon numerolla on paikka-arvo, joka riippuu numeron sijainnista desimaalipilkkuun nähden. Desimaalipilkusta vasemmaale sijaitsevat järjestyksessä ykköset (10 0 ), kymmenet (10 1 ), sadat (10 2 ), tuhannet (10 3 ) jne... Desimaalipilkusta oikealle puolestaan järjestyksessä kymmenesosat (10 1 ), sadasosat (10 2 ), tuhannesosat (10 3 ), jne... 11

Desimaaliluvun arvo saadaan kertomalla kukin numero paikka-arvollaan ja laskemalla näin saadut luvut yhteen. Esimerkiksi 2386.75 = 2 10 3 + 3 10 2 + 8 10 1 + 6 10 0 + 7 10 1 + 5 10 2. 2.2 Binaarijärjestelmä Mitä tahansa luonnollista lukua, joka on ykköstä suurempi, voidaan käyttää paikkaan perustuvan lukujärjestelmän kantalukuna. Luvun 10 vakiintuminen kantaluvuksi todennäköisesti johtuu siitä, että ihmiset käyttivät muinoin kymmentä sormeaan laskemiseen. Esim. aikaa laskettaessa kantaluku on 60: 2 h 26 m 35 s = 2 60 2 + 26 60 1 + 35 60 0 sekuntia. Binaarijärjestelmässä kantaluku on 2; kun desimaalijärjestelmässä käytetään numeroja 0, 1,..., 9, binaarijärjestelmässä numerot (bitit) valitaan joukosta {0, 1}. Esimerkiksi 1101.01 2 on binaariluku, alaindeksi 2 ilmoittaa kantaluvun. Sekaannusten välttämiseksi, kanta ilmoitetaan aina, kun käytössä on muu kuin desimaalijärjestelmä. Binaariluvun (desimaali)lukuarvon laskeminen (ja samalla muuntaminen desimaalijärjestelmään) saadaan kirjoittamalla luku 'auki': 1101.01 2 = 1 2 3 + 1 2 2 + 0 2 1 + 1 2 0 + 0 2 1 + 1 2 2 = 8 + 4 + 1 + 0.25 = 13.25. Digitaalisten tietokoneiden data varastoidaan, siirretään ja muokataan sellaisten tietoelementtien virtana, joita voidaan merkitä symboleilla 0 ja 1. 12

Taulukko binaarinen desimaali binaarinen desimaali 0 0 1 1 1011 11 10 2 1100 12 11 3 1101 13 100 4 1110 14 101 5 1111 15 110 6 10000 16 111 7 10001 17 1000 8 10010 18 1001 9 10011 19 1010 10 10100 20 2.3 Muuntaminen kymmenjärjestelmästä binaarijärjestelmään Kuinka muuntaa desimaalijärjestelmän luku binaariseksi? Ei ole mikään ihme, että tehtävä voidaan hoitaa algoritmilla. Teemme seuraavan huomion parittomien luonnollisten lukujen binaariesitys päättyy numeroon 1, ja parillisten luonnollisten lukujen binaariesitys päättyy numeroon 0. Siispä Luonnollisen luvun binaariesityksen (binaariluvun) viimeinen numero (bitti) saadaan jakojäännöksenä, kun luku jaetaan kahdella. Tarvitsemme seuraavat Pascal-tyyppiset operaatiot: aina, kun n N, on n div 2 on se kokonaisosa, joka saadaan, kun n jaetaan kahdella ja n mod 2 se jakojäännös joka saadaan, kun n jaetaan kahdella. Selvästi Poistamalla luonnollisen luvun n binaariesityksen viimeinen bitti, saadaan luonnollisen luvun n div 2 binaariesitys. Siten luonnollisen luvun n binaariesityksen toiseksi viimeinen bitti saadaan jakojäännöksenä, kun luku n div 2 jaetaan kahdella. Prosessia toistetaan, kunnes kokonaisosaksi tulee nolla. Kirjoitetaan koko prosessi algoritmiksi: 1. Syöte: luonnollinen luku n 2. Repeat 13

2.1 Tulosta n mod 2 2.2 n : = n div 2 until n = 0 Algoritmin tulostus luetaan käänteisessä järjestyksessä lopusta alkuun. Sovelletaan menetelmää lukuun n = 6. Askel n Tulostus 1 6-2.1 6 0 2.2 3-2.1 3 1 2.2 1-2.1 1 1 2.2 0 - Siispä luvun 6 binaariesitys on (110) 2. Esim. 1. Mikä on luvun 25 binaariesitys? Ratkaisu. 2 25 12 1 6 0 3 0 1 1 0 1 Siten 25 10 = 1101 2. Huom. 1. Edellistä algoritmia sovellettaessa on yleinen virhe jättää viimeinen askel suorittamatta; algoritmi päättyy vasta, kun jaettava menee nollaksi! Tarkastellaan nyt sitä, miten desimaaliluvun murto-osa muunnetaan binaariseksi. Oletetaan, että haluamme desimaaliluvun 0.375 binaariesityksen. Koska 0.375 < 0.5, täytyy desimaalipilkun oikella puolella olevan bitin (eli 'puolikasbitin', jonka paikka-arvo on 1 ) olla 0. Voimme ilmaista asian toisin: puolikasbitti on 0, koska 2 0.375 on vähemmän kuin 1. Olemme kehittäneet 2 säännön: 14

Reaaliluvun x (0 x < 1) binaariesityksen puolikasbitti on luvun 2 x kokonaisosa. Tarvitsemme pari uutta merkintää. x on reaaliluvun x kokonaisosa frac(x) on reaaliluvun x murto-osa Esimerkiksi 2.7 = 2 ja frac(2.7) = 0.7. Aikaisemmin tehdyn huomion nojalla kertomalla murto-osaa toistuvasti kahdella, saamme luvun murto-osan binaariesityksen. Prosessi voi olla päättymätön, joten se, kuinka montaa numeroa käytetään, kannattaa ilmoittaa etukäteen. 1. Syöte: desimaaliluvun murto-osa x, numerojen lkm d 2. i := 0 3. Repeat 3.1 i := i + 1 3.2 y := 2x 3.3 Tulosta y 3.4 x := frac(y) until x = 0 or i = d Esim. 2. Mikä on luvun 0.32 binaariesitys viiden numeron tarkkuudella? Ratkaisu. 32 2 0 64 1 28 0 56 1 12 0 24 Tulos luetaan nyt ylhäältä alaspäin (vasemmanpuolinmaisin sarake). Saadaan 0.32 10 = 0.01010. Pyöristystä ei suoriteta. Jos desimaaliluvussa on sekä kokonais- että murto-osa, lasketaan kumpaisenkin binaariesitys erikseen ja saadut tulokset yhdistetään. Siten 25.32 10 = (1101.01 010) 2. 15

2.4 Oktaali- ja heksadesimaalijärjestelmät Edellisessä kappaleessa esitetyt tekniikat voidaan yleistää koskemaan myös muita kantajärjestelmiä kuin binaarista. Erityisesti kantoja 8 ja 16 käytetään laskennassa usien; syyt selviävät hetikohta. Kun käytössä on kantaluku 8 on kyse oktaalijärjestelmästä; tällöin luvut esitetään numeroiden 0, 1, 2, 3, 4, 5, 6, 7 avulla. Luvun jokaisen numeron paikkaarvo on tällöin kahdeksan potenssi. Esimerkiksi 374.2 8 = 3 8 2 + 7 8 1 + 4 8 0 + 2 8 1 = 252.25 10. Kantaluvun ollessa 16 olemme heksadesimaalijärjestelmässä ; tällöin tarvitaan 16 numeroa: numerojen 10, 11, 12, 13, 14, 15 sijasta käytetään isoja kirjaimia A, B, C, D, E, F. Siten käytössä on numerojoukko {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F }. Luvun jokaisen numeron paikka-arvo on 16:n potenssi. Esimerkiksi E9C.8 16 = 14 16 2 + 9 16 1 + 12 16 0 + 8 16 1 = 3740.5 10. Kun muunnetaan kymmenjärjestelmän lukua oktaali- taí heksadesimaalijärjestelmään, menetellään vastaavalla tavalla kuin binaaritapauksessa: luku 2 vain korvataan joko 8:lla tai 16:lla jakajana tai kertojana. Esim. 3. Muunna luku 275.4375 10 8-järjestelmään (oktaalijärjestelmään). Ratkaisu. Muunnetaan kokonaisosa. 8 275 34 3 4 2 0 4 Siten 275 10 = 423 8. Muunnetaan murto-osa. 4375 8 3 5000 4 0 Saadaan 0.4375 10 = 0.34 8. Yhdistetään tulokset, jolloin 275.4375 10 = 423.34 8. 16

Esim. 4. Muunna luku 985.78125 10 16-järjestelmään (heksadesimaalijärjestelmään). Ratkaisu. Muunnetaan kokonaisosa. 16 985 61 9 3 13 0 3 Siten 985 10 = 3D9 16. Muunnetaan murto-osa. 78125 16 12 50000 8 0 Saadaan 0.78125 10 = 0.C8 16. Yhdistetään tulokset, jolloin 985.78125 10 = 3D9.C8 16. Olemme nähneet, että binaarijärjestelmä on luonteva laskennalle; se on järjestelmä, jota tietokoneet sisäisesti käyttävät. Mutta millä tavalla 8- ja 16- järjestelmät ovat hyösyllisiä? Binaarijärjestelmän huonoksi puoleksi voi laskea sen, että suurilla luvuilla on erittäin pitkät binaariesitykset(yli kolme kertaa pitemmät kuin desimaalijärjestelmässä. Suurten kantajärjestelmien etu on se, että luvut voidaan kirjoittaa käyttäen pienempää määrää numeroja. Kymmenjärjestelmä on epäkäytännöllinen, koska muuntaminen kantajärjestelmästä toiseen vaatii laskentakapasiteettia. Oktaali- ja heksadesimaalijärjestelmää käyttämällä vältetään pitkät numerosarjat ja lisäksi muuntaminen sujuu yksinkertaista algoritmia käyttäen. Kun muunnetaaan luku binaarijrjestelmästä 8-järjestelmään, ryhmitellään bitit kolmen pituisikksi jonoiksi molemmin puolin desimaalipilkkua. Kukin kolmen bitin jono vastaa lukua 8-järjestelmässä. Esim. 5. Muunna luku 10100011.10111 2 oktaalijärjestelmään. Ratkaisu. Nyt }{{} 010 2 }{{} 100 4 }{{} 011. }{{} 101 3 5 }{{} 110, joten 10100011.10111 2 = 243.56 8. 6 Muuntaminen oktaalijärjestelmästä binaariesitykseen on yhtä helppoa; kukin oktaalijärjestelmän numero korvataan 3-bittisellä binaariesityksellään. Etunollia ei saa jättää pois! 17

Esim. 6. Muunna luku 514.7 8 binaariluvuksi. Ratkaisu. Saadaan 5 {}}{ 101 1 {}}{ 001 4 {}}{ 100. 7 {}}{ 111. Siispä 514.7 8 = 101001100.111 2. Muunto 2- ja 16-järjestelmien välillä on analoginen paitsi, että jokaista heksadesimaalinumeroa vastaa neljä bittiä. Esim. 7. Muunna luku 10111101001.110001 2 heksadesimaaliseksi. Ratkaisu. Nyt 0101 }{{} 1110 }{{} 1001 }{{}. 1100 }{{} 0100 }{{}, joten 5 E 9 C 4 10111101001.110001 2 = 5E9.C4 16. Esim. 8. Muunna luku B2.5D6 16 binaariluvuksi. Ratkaisu. Saadaan B 2 5 {}}{ {}}{ {}}{ {}}{ {}}{ 1011 0010. 0101 1101 0110. Siispä D 6 B2.5D6 16 = 10110010.010111010110 2. Heksadesimaalijärjestelmää käytetään tavallisesti esittämään muistiosan tai binaaritiedoston sisältö (ihmiselle) luettavassa muodossa, koska jokainen tavu (joka sisältää kahdeksan bittiä) voidaan esittää kahtena heksadesimaalinumerona. 2.5 Aritmetiikka muissa kuin kymmenjärjestelmässsä Laskutoimitusten (yhteenlasku, vähentäminen, kerto- ja jakolasku) suorittaminen muissa kuin kymmenjärjestelmässä tapahtuu niitä sääntöjä noudattaen, jotka jo peruskoulussa opittiin kymmenjärjestelmälle; vain yhteen- ja kertolaskutaulut ovat erilaiset. Tarkastellaan nyt sitä, miten luonnollisten lukujen yhteen- ja kertolasku tapahtuu binaarijärjestelmässä. Yhteenlaskutaulu on tällöin seuraava. + 0 1 0 0 1 1 1 10 18

Lukuja lasketaan yhteen allekkain, mutta vain numeroja 0 ja 1 käyttäen. Esim. 9. Laske allekkain 11011 2 + 1110 2 (= 101001 2 ). Vähennyslasku suoritetaan 'tavanomaisesti' (vastaavasti kuin kymmenjärjestelmässä). Tietokone suorittaa vähennyslaskun eri tavalla. Esim. 10. Laske allekkain 11011 2 1110 2 (= 1101 2 ). Binaarijärjestelmän kertolaskutaulu on yksinkertainen: 0 1 0 0 0 1 0 1 'Pitkä kertolasku' binaarijärjestelmässä suoritetaan oikeastaan ilman kertolaskua; kertominenhan tapahtuu nollalla tai ykkösellä. Esim. 11. Kerro allekkain 11010 2 1011 2 (= 100011110 2 ). 'Pitkä jakolasku' on sekin suoraviivainen suorittaa; tärkeää on muistaa, että murto-osa voi muodostua rajattoman pitkäksi, joten joskus täytyy päättää monenko (merkitsevän) numeron tarkkuudella vastaus annetaan. Esim. 12. Jaa jakokulmassa luku 11101 2 luvulla 101 2 kuuden merkitsevän numeron tarkkuudella. Huom. 2. Kymmenjärjestelmän eli desimaalijärjestelmän kantaluku on 10. Desimaaliluvut ovat kymmenjärjestelmään perustuva tapa esittää reaalilukuja ja niiden likiarvoja. Edellisen nojalla kokonaisluvut ovat desimaalilukuja. Mitä tarkoitetaan (desimaali)luvun merkitsevien numeroiden lukumäärällä? Sääntö on yksinkertainen: (1) desimaaliluvun alussa olevia nollia ei lasketa merkitseviksi numeroiksi; (2) ilman desimaalipilkkua esitetyn luvun lopussa olevia nollia ei lasketa merkitseviksi numeroiksi; ja (3) kaikki muut luvussa esiintyvät numerot ovat merkitseviä. Siten sekä luvussa 5300 että luvussa 0071 on kaksi merkitsevää numeroa, luvussa 0.0122 on kolme merkitsevää numeroa ja luvussa 0.0078550 viisi merkitsevää numeroa. Luvussa 10.0070 on kuusi merkitsevää numeroa. Edelleen luvussa 0.8200 10 4 on neljä merkitsevää numeroa, luvussa 0.820 10 4 kolme merkitsevää numeroa ja luvussa 0.82 10 4 kaksi merkitsevää numeroa. 19

2.6 Lukujen esittäminen tietokoneessa Edellisessä luvussa tarkasteltiin lukujen esittämistä binaarilukujärjestelmässä. Nyt käytämmme oppimiamme tekniikoita tutkiaksemme sitä, miten lukuja esitetään ja käsitellään binaarimuodossa tietokoneessa. Luvut esitetään digitaalisessa tietokoneessa tavallisesti kiinteän pituisina bittijonoina. Kokonaislukuja käsitellään eri tavalla kuin muita reaalilukuja, joten tapaukset tulee pitää erillään. Seuraavassa tarkastelleen verrattain yleisellä tasolla sitä, miten tietokoneet lukuja käsittelevät. 2.6.1 Kokonaislukujen esittäminen Kokonaisluvut (positiiviset, negatiiviset tai nolla) tallennetaan tietokoneessa tavujonoina, missä kukin tavu koostuu 8 bitistä. Ohjelmoija voi tavallisesti valita useammasta kokoluokasta (jotka vastaavat eri tavulukumääriä), mutta suoraan prosessorin käsittelemien kokonaislukujen koko määräytyy prosessorin suunnitteluperiaatteiden mukaan; neljä tavua on tällöin tavanomainen koko. Mukavuussyistä tarkastelemme seuraavassa kaksitavuisia kokonaislukuja, periaatteet ovat täysin samat kuin nelitavuisessa tapauksessa. Kuinka monta eri lukua voidaan tallentaa 16 bitin avulla? Koska kukin bitti voi saada kaksi arvoa ( 0 tai 1), saamme (kombinatoriikan tuloperiaatteen nojalla): 2 2 2 (16 kertaa) = 2 16 = 65536 Esimerkiksi voimme tallentaa minkä tahansa luvun n, joka on välillä 32768 n 32767, asettamalla yksikäsitteisen 16 bitin jonon vastaamaan kutakin välin kokonaislukua. Muitakin arvoalueita voitaisiin käyttää (esim. 0 n 65535), mutta käyttökelpoisin on tavallisesti sellainen väli, joka sisältää suunnilleen saman määrän positiivisia ja negatiivisia lukuja. Tavanomaisin tapa esittää luku n käyttäen 16 bittiä on seuraava. 1. Ensimmäinen bitti on ns. etumerkkibitti ; se on 0, jos n on nolla tai positiivinen ja 1, jos n on negatiivinen. 2. Jos n 0, loput 15 bittiä ovat n:n binaariesitys (varustettuna etunollilla, mikäli tarpeellista). Jos n < 0, loput 15 bittiä ovat ei-negatiivisen luvun n + 32768 binaariesitys. 20

Luvun 2 15 = 32768 lisääminen lukuun n, kun n < 0 voi äkkiseltään vaikuttaa asioiden mutkistamiselta (mikseivät esim. etumerkin jälkeiset 15 bittiä esittäisi lukua n? 1 ) Syy on se, että lisäämällä luku 32768 lukuun n, saadaan esitystapa, joka yksinkertaistaa aritmeettisten operaatioiden suorittamista, kuten myöhemmin tullaan näkemään. Itse asiassa luvun 32768 lisääminen voidaan suorittaa sen jälkeen, kun luku n on muutettu binaarimuotoon. Tämä käy ilmi seuraavasta esimerkistä. Esim. 13. Määritä (kymmenjärjestelmän) luvun 6772 kuusitoistabittinen tietokone-esitys. Ratkaisu. Muunnetaan 6772 binaarimuotoon käyttäen 15 bittiä ja etunollia tarvittaessa. Saadaan 6772 10 = 001101001110100 2. Koska luvun 32768 binaariesitys on 1000000000000000 2, meidän tulee suorittaa lasku 1000000000000000 2 001101001110100 2 = 110010110001100 2. Luvun 6772 kuusitoistabittinen tietokone-esitys on siten 1110010110001100. Saamme yleisen menetelmän: 1. Kaikki nollat vähennettävän binaariluvun lopussa (oikeanpuoleisessa päässä) säilyvät nollina vastauksessa. 2. Oikeanpuolimmaisin ykkönen säilyy ykkösenä vastauksessa. 3. kaikki muut bitit muuttuvat (nolla ykköseksi ja ykkönen nollaksi). Algoritmia soveltamalla saadaan positiivisen binaariluvun kakkosen komplementti (kannan 2 suhteen). Siten luvun 001101001110100 2 kakkosen komplementti on 110010110001100 2. Ei-negatiivisen binaariluvun ykkösen komplementti saadaan vaihtamalla sen jokainen bitti säännön 0 1, 1 0 mukaan. Binaariuvun ykkösen komplementti on yhtä pienempi kuin sen kakkosen komplementti. Tarkastellaan tilannetta hiukan yleisemmin. Olkoon n kokonaisluku, jolle 1 n 2 k 1, missä k N +. Oletetaan, että n on annettu k -bittissä 1 Merkintä n tarkoittaa luvun n itseisarvoa, joka määritellään: { n jos n 0 n = n jos n < 0 21

binaarimuodossaan. Tällöin n:n k -bittinen kakkosen komplementti on luku 2 k n kirjoitettuna k -bittisessä binaarimuodossaan. Se saadaan soveltamalla yllä kuvattuja askelia lukuun n. Huomattakoon, että edellisiä askelia 1, 2 ja 3 ei voida käyttää luvun 32768 tietokone-esityksen määrittämiseen, koska luvun 32768 esittämiseen tarvitaan 16 bittiä. Tässä tapauksessa vähennyslaskun seurauksena saadaan 15 nollaa ja luvun 32768 tietokone-esitys on siten 1000000000000000. Esim. 14. Etsi seuraavien kokonaislukujen 16-bittinen tietokone-esitysmuoto. a) 9843 b) 15728 c) 4961. Ratkaisu. a) Etumerkkibitti on 0 ja 9843 10 = 010011001110011 2 viittätoista bittiä käyttäen. Siispä 16-bittinen tietokone-esitysmuoto on 0010011001110011. b) Etumerkkibitti on 1 ja 15728 10 = 011110101110000 2 viittätoista bittiä käyttäen. Luvun 011110101110000 2 kakkosen komplementti on 100001010010 000 2 Siispä 16-bittinen tietokone-esitysmuoto on 1100001010010000. c) Etumerkkibitti on 1 ja 4961 10 = 001001101100001 2 viittätoista bittiä käyttäen. Luvun 001001101100001 2 kakkosen komplementti on 11011001001 1111 2 Siispä 16-bittinen tietokone-esitysmuoto on 1110110010011111. Jos tietokone käyttää neljää tavua (32 bittiä) kahden sijasta kokonaislukuja tallentaessaan, mikä tahansa luku välillä 2 31 = 21474836648 n 2 31 1 = 21474836647 voidaan yksikäsitteisesti esittää etumerkkibittiä ja 31 muuta bittiä käyttäen analogisesti kahden tavun tapauksen kanssa. Tietysti tällöin luku 32768 korvautuu luvulla 21474836648 ja kakkosen komplementti otetaan 31-bittisestä binaariluvusta 15-bittisen sijasta. 22

2.6.2 Kokonaislukuaritmetiikka Tarkastellaan seuraavassa sitä miten tietokone suorittaa kokonaislukjen yhteenja vähennyslaskuja. On mukavampaa käsitellä pieniä bittimääriä, paljon pienempiä kuimn todelliset tietokoneet käytännössä käsittelevät. Oletetaan, että kuvitteellinen tietokoneemme tallentaa kokonaisluvun käyttäen neljää bittiä. Tällöin ainoastaan kokonaisluvut 8, 7,..., 1, 0, 1,..., 7 voidaan esittää tällä koneella. Meillä on käytössä seuraava taulukko. kokonaisluku Taulukko -8 1000-7 1001-6 1010-5 1011-4 1100-3 1101-2 1110-1 1111 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 esitysmuoto Tutkimalla yllä esitettyä taulukkoa, voimme tehdä seuraavat huomiot. Kun kyseessä on luku n {0, 1, 2, 3, 4, 5, 6, 7}, luvun n tietokoneesityksen viimeiset kolme bittiä muodostavat sen 3-bittisen binaariesityksen. Koska etumerkkibitti on 0, tietokone-esitys on luvun n nelibittinen binaariesitys. Kun kyseessä luku n { 8, 7, 6, 5, 4, 3, 2, 1}, luvun n tietokone-esityksen viimeiset kolme bittiä muodostavat luvun n + 8 3-bittisen binaariesityksen. Koska etumerkkibitti on 1 (ja 23

etumerkkibitin paikka-arvo on 2 3 = 8, tietokone-esitys, kun se käsitetään binaariluvuksi, on luvun n + 16 nelibittinen binaariesitys. Oletetaan nyt, että haluamme laskea yhteen kaksi lukua m ja n tällä tietokoneella. Nyt siis m, n { 8, 7,..., 6, 7}; lisäksi oletamme, että summa m + n { 8, 7,..., 6, 7}. Väitämme, että yhteenlasku voidaan suorittaa laskemalla yhteen lukujen m ja n tietokone-esitykset tavanomaisena binaariyhteenlaskuna, kun vain viidenteen sarakkeeseen mahdollisesti tuleva bitti 1 jätetään huomiotta. Luvun n tietokone-esityksen binaariarvo on joko luvun n binaariarvo tai luvun n binaariarvo +16. Siten, kun kaksi tietokone-esitystä lasketaan yhteen, tuloksena on joko yhteenlaskun oikea vastaus, oikea vastaus +16 tai oikea vastaus +32. Oikealta viidennen bitin huomiottajättäminen tapauksessa, jossa se on 1, on yhtäpitävää sen kanssa, että yhteenlaskun tuloksesta vähennetään 16. Jos nyt prosessin lopussa tulos ei ole oikea, se poikkeaa oikeasta 16:n monikerralla. Nyt m, n { 8, 7,..., 6, 7}, joten tuloksen on oltava oikea, koska lukujen m ja n vaihteluväli on vähemmän kuin 16. Esim. 15. Osoita, että seuraavat yhteenlaskut tulevat oikein suoritetuiksi 4-bittisellä tietokoneella. (a) 2 + 3 (b) ( 4) + 7 (c) ( 3) + ( 4) (d) ( 6) + 5. Ratkaisu. Kirjoitetaan kukin yhteenlasku kahdella eri tavalla; kymmenjärjestelmässä ja siten, kun se tietokoneessa suoritetaan. (a) 2 + 3 = 5; 0010 2 + 0011 2 = 0101 2 (b) ( 4) + 7 = 3; 1100 2 +0111 2 = (1)0011 2 (c) ( 3) + ( 4) = 7; 1101 2 + 1100 2 = (1)1011 2 (d) ( 6) + 5 = 1; 1010 2 + 0101 2 = 1111 2. Jos yritämme laskea yhteen kokonaislukuja, joiden summa ei kuulu sallittuun alueeseen, tulos on (tavallisesti) väärä. Esim 6 + 7 = 13 ja 0110 2 + 0111 2 = 1101 2. Tietokone tulkitsee bittijonon 1101 luvuksi 3. Tämä ylivuoto on kuitenkin suht helppo huomata. Jos nimittäin yritetään laskea yhteen kaksi (summaltaan liian suurta) positiivista lukua, vastaukseksi tulee negatiivinen luku ja ylivuoto on helppo havaita. Samoin, ynnätessä kaksi (summaltaan liian pientä) negatiivista lukua, tulos on positiivinen ja helposti havaittavissa. Jotkut softat antavat virheilmoituksen, toiset taas eivät anna. Tämän vuoksi ohjelmia kirjoitettaessa tulee tiedostaa ylivuodon mahdollisuus ja osata käsitellä näitä' tilanteita. 24

Kokonaislukujen tietokone-esityksiin perustuva vähennyslsku on suoraviivaista, kun seuraavat seikat otetaan huomioon. Vähennyslasku voidaan palauttaa yhteenlaskuksi, tahtoo sanoa, a b = a + ( b). Kokonaisluvun vastaluvun tietokone-esitys on kokonaisluvun kakkosen komplementti. Luvun vähentäminen voidaan siten suorittaa lisäämällä sen kakkosen komplementti. Siispä vähennyslasku muuntuu luiskeasti yhteenlaskuksi. Menetelmän etu on se, että tietokoneen ei tarvitse mikropiiristössä erikseen ylläpitää 'summaimia' ja 'vähentäjiä' (vaikkakin kakkosen komplementin laskeminen tarvitaan). Esim. 16. Arvioi vähennyslaskua 5 3 nelibittisellä tietokoneella. Ratkaisu. Luvun 5 (vast. luvun 3) tietokone-esitys on 0101 (vast. 0011). Luvun 0011 2 kakkosen komplementti on 1101 2. Nyt 0101 2 +1101 2 = 10010 2. Jättämällä huomiotta vasemmanpuolimmaisen bitin 1, saamme tulokseksi tietokone-esityksen 0010, joka edustaa lukua 2. Komplementtiin perustuvaa vähennyslaskua voidaan käyttää missä tahansa kannassa. Palataan asiaan harjoituksissa. 2.6.3 Reaalilukujen esittäminen Reaalilukujen esittäminen on mutkikkaampaa kuin kokonaislukujen, ei ainoastaan tietokoneella, vaan myös kirjoitetussa muodossa. Olemme käsitelleet reaalilukujen esittämistä desimaalijärjestelmässä (kuin myös binaarijärjestelmässä) siten että numerot esiintyvät ennen ja jälkeen desimaalipilkun. Menetelmä ei sovellu tietokone-esitykseksi ei usein liioin kirjoitusesitykseksikään. Syy tähän on se, että useissa käytännön kannalta kiinnostavissa ongelmissa törmätään reaalilukuihin jotka ovat joko erittäin suuria tai erittäin pieniä ja jotka saadaan suorittamalla fyysisiä mittauksia sopivalla tarkkuudella. Likiarvon ja täysin tarkkan esityksen ero on hiuksenhieno, mutta merkittävä. Maan massa ilmoitetaan usein lukuna 0.5976 10 25 kg. Huomattakoon, että lukua ei ilmoiteta muodossa 5976 00 0. Näin siksi, että em. luku on 21 { }} { laskettu fyysisen mittaamisen perusteella ja mittaamiseen liittyy aina tietty epätarkkuus. Emme voi sanoa, että maan massa on täsmälleen 0.5976 10 25 kg, vaan ainoastaan, että se on jossakin 0.59755 10 25 kg:n ja 0.59765 10 25 kg:n välillä. Kun mittausmenetelmät tarkentuvat, arviota voidaan parantaa. 25

Edellisessä esimerkissä käytettyä notaatiota kutsutaan eksponenttinotaatioksi ja se soveltuu erityisen hyvin sellaiseen tieteelliseen tarkasteluun, jossa luvut saadaan fyysisten mittausten perusteella. Eksponenttinotaatioon liittyy tiettyä terminologiaa. Luvussa 0.5976 10 25 on 0.5976 signikantti, 10 on kanta(luku) ja 25 on eksponentti. Jos signikantti m on välillä 0.1 m < 1, on esitys normaalimuodossa. Se, miten reaaliluvut tarkasti esitetään tietokoneessa, riippuu minkätyyppisestä koneesta on kysymys. Tosin viime aikoina on trendinä ollut käyttää esitysmuotoa, jonka spesioi IEEE:n (Institute of Electrical and Electronics Engineering) standardi 754 (1985) binaariselle liukulukuaritmetiikalle. Emme toki tarkasti kuvaa tiettyä esitystapaa, vaan tyydymme yleisesti luonnehtimaan sitä miten reaalilukuja tietokoneessa tallennetaan ja manipuloidaan. Edellä kuvsttu eksponentiaalinotaatio muistuttaa reaalilukujen esitystapaa tietokoneessa. Joitakin eroja kuitenkin löytyy. Tietokoneet käyttävät 2:n potensseja 10:n potenssien sijasta tietoa manipuloidessaan. Myös eksponentti tallennetaan muunnettuun muotoon, kuten tulemme näkemään. Ennenkuin reaaliluvun tietokone-esitys voidaan löytää, se täytyy ensin muuntaa binaarimuotoon ja sen jälkeen esittää normalisoidussa binaarisessa eksponenttimuodossa. Sanomme, että reaaliluku on normalisoidussa binaarisessa eksponenttimuodossa, jos se on ilmaistu muodossa ±m 2 d, missä signikantti m on binaarimuodossa ja välillä 0.1 2 m < 1 2 ja d on kokonaisluku, joka on kirjoitettu desimaalimuodossa. Kantaluku 2 on niin ikään desimaalimuodossa. Muitakin esityksiä normalisoiduksi binaariseksi eksponentiaalimuodoksi voitaisiin käyttää; normalisoinnin tarkoitus on varmistaa jokaiselle luvulle yksikäsitteinen esitystapa. Huomattakoon, että nollaa ei voida esittää normalisoidussa binaarisessa eksponentiaalimuodossa, koska m = 0 ei kuulu m:n sallittuihin arvoihin. Reaaliluvun tallennukseen tietokoneelle tavallisesti käytetään neljää tavua ( 32 bittiä) tai kahdeksaa tavua (64 bittiä) 2. Ensimmäinen bitti on etumerkkibitti, jäljelle jäävät jaetaan eksponentin ja signikantin kesken. Eksponentille varattujen bittien lukumäärä kertoo tallennettavien lukujen arvoalueen; signikantin tallennukseen käytettyjen bittien lukumäärä puolestaan tarkkuuden, jolla luvut esitetään. Kun bittien kokonaismäärä on kiinteä, on kyse 2 Mikäli molemmat formaatit ovat tietokoneella saatavilla, puhutaan neljän tavun tapauksessa yksinkertaisesta ja kahdeksan tavun tapauksessa kaksinkertaisesta tarkkuudesta 26

aina arvoalueen ja tarkkuuden välisestä kompromissista. Normaali menettelytapa nykyaikaisessa tietokoneessa on 8 bittiä eksponentin tallennukseen ja 23 signikantille. Tavallisesti eksponentin binaariesitystä ei sellaisenaan tallenneta, vaan muistiin pistetään luku, jota kutsutaan karakteristikaksi. Karakteristika on einegatiivinen kokonaisluku, joka saadaan, kun eksponenttiin lisätään eksponenttipoikkeama, luku, joka on muotoa 2 n 1 1, missä n on eksponenttia varten (ja siten karakteristikan tallentamiseen) varattujen bittien lukumäärä. Kun eksponentti tallennetaan edellä kuvatulla tavalla, tietokone voi käyttää yksinkertaisempia algoritmeja reaalilukuaritmetiikkaa toteuttamaan paljolti samalla tavalla kuin kokonaislukuaritmetiikkaa yksinkertaistettiin esittämällä negatiiviset luvut kakkosen komplementtina. Oletetaan, että karakteristikan k tallentamiseen on varattu n bittiä. Karaketristika on ei-negatiivinen kokonaisluku, joten k saa arvoja: 0 2 n 1. Eksponenttia e ja karakteristikaa k sitoo yhtälö k = 2 n 1 1 + e. Siispä e saa arvoja: 0 2 n 1 + 1 2 n 1 (2 n 1 1) eli e : 2 n 1 + 1 2 n 1. Joissakin esitystavoissa (IEEE-standardi mukaanlukien) ensimmäinen signikantin bitti (joka väistämättä on 1) jätetään tallentamatta, jolloin tarkkuutta voidaan lisätä ylimääräisen bitin verran. Kaikkissa meidän esimerkeissä signikantin ensimmäinen bitti on mukana. Esim. 17. Etsi seuraavien lukujen 32-bittinen tietokone-esitys. (a) 0.11001101 2 2 5 (b) 0.110111 2 2 3 missä käytetään 8 bittiä karakteristikaan ja eksponenttipoikkeama on 2 7 1. Ratkaisu. (a) Etumerkkibitti on 0. Karakteristika on luvun 5 + 2 7 1 kahdeksanbittinen binaariesitys, joka saadaan laskemalla yhteen 2 7 :n binaariesitys 10000000 2 ja luvun 4 binaariesitys 100 2. Saadaan 10000000 2 + 100 2 = 10000100 2. Signikantti laajennetaan 23-bittiseksi nollia lisäämällä; saadaan 11001101000000000000000. Huomattakoon, että desimaalipilkkua edeltävää nollaa ei tallenneta. Tietokone-esitykseksi saadaan 01000010 01100110 10000000 00000000. (b) Etumerkkibitti on 0. Karakteristika on luvun 3 + 2 7 1 kahdeksanbittinen binaariesitys, joka saadaan yksinkertaisesti laskemalla luvun 4 seitsemänbittinen kakkosen komplementti ja varustamalla tämä etumerkkinollalla. Luvun 4 seitsemänbittinen binaariesitys: 0000100 2. Luvun 0000100 2 kakkosen komplementti: 1111100 2. Karakteristika: 01111100. Tietokone-esitykseksi 27

saadaan 001111110 01101110 00000000 00000000. Reaaliluvun tietokone-esitys voidaan siis löytää seuraavasti. 1. Muuta luku binaarimuotoon; työskentele sillä tarkkuudella, jonka signikanttiin varattujen bittien lkm edellyttää: 2. Esitä binaariluku normalisoidussa binaarisessa eksponenttimuodossa. Huomaa, että jos luku on itseisarvoltaan pienempi kuin yksi, desimaalipistettä välittömästi seuraavat nollat (silloin kun niitä on) siirtyvät eksponenttiin ja signikantti voidaan vastaavasti laskea suuremmalla tarkkuudella. 3. Määritä karakteristika. 4. Kirjoita tietokone-esitys. Esim. 18. Etsi 32bittinen tietokone-esitys luvulle 1873.42, kun karakteristikaan käytetään 8 bittiä ja eksponenttipoikkeama on 2 7 1. Ratkaisu. Aikaisemmin esitettyjä tekniikoita käyttäen muunnetaan luku 1873.42 aluksi 23-bittiseksi binaariluvuksi. Saadaan 1873.42 10 = 11101010001.011010111000 2. Ilmoitetaan tulos normalisoidussa binaarisessa eksponenttimuodossa: 11101010001.011010111000 2 = 0.11101010001011010111000 2 11. Etumerkkibitti on 1 ja karakteristika 10001010. Tietokone-esitys on siten 11000101 01110101 00010110 10111000. Edellinen esimerkki osoittaa sen, että reaaliluvun tietokone-esitys voi olla epätarkka, koska binaarimuotoon muutettaessa lukua typistetään käytettävissä olevaan tarkkuuteen. Lisää epätarkkuuksia voi syntyä reaalilukuaritmetiikan pyöristysvirheistä. Tilanne on toinen kuin kokonaislukujen tapauksessa, jolloin lukuja tallennetaan ja käsitellään tarkasti tietokoneessa. Eräs käytännön seuraus tästä on, että reaalilukujen yhtäsuuruuden testaus sisältää riskin. Turvallisempaa on arvioida ovatko kaksi reaallilukua x ja y ovat suunnilleen yhtäsuuria testaamalla onko voimassa x y < q, 28

missä q on pieni positiivinen luku (esim 10 6 ). Minkäkokoisia reaalilukuja tietokoneella sitten kyetään esittämään? Oletetaan, että tietokoneemme tallentaa reaaliluvut 32 bitillä, jossa 8 bittiä on varattu karakteristikalle. Tällöin eksponenttipoikkeama on 2 7 1 ja karakteristika voi saada arvoja 0:sta lukuun 2 8 1. Koska karakteristika = 2 7 1 + eksponentti, voi eksponentti saada arvoja luvusta 0 (2 7 1) lukuun 2 8 1 (2 7 1) eli joukossa 127, 126,..., 127, 128. Signikantti vaihtelee luvusta 0.1 2 lukuun 1 2. Ne positiiviset luvut, joita tietokone voi esittää sijoittuvat siten välille [0.1 2 2 127, 1 2 2 128 ). Huomattakoon, että 0.1 2 2 127 0.29 10 38 ja 1 2 2 128 0.34 10 39. Sellaiset negatiiviset luvut, joiden itseisarvo on yo. välillä, voidaan niinikään esittää tietokoneella. Mikäli laskennan tuloksena saadaan luku, joka ei mainittuihin rajoihin mahdu, tapahtuu joko alivuotoa 3 tai ylivuotoa. Esim. 19. Oletetaan, että tietokone tallentaa reaalilukuja 32 bitillä, jossa 10 bittiä on varattu karakteristikalle ja eksponenttipoikkeama on 2 9 1. Arvioi aluetta, jossa posit. reaalilukuja pystytään tietokoneella esittämään. Ratkaisu. Karaktristika voi saada arvoja 0:sta lukuun 2 10 1, joten eksponentin vaihteluväli on 0 (2 9 1):stä 2 10 (2 9 1):een eli luvusta 511 lukuun 512. Siispä reaalilukuja väliltä [0.1 2 2 511, 1 2 2 512 ) voidaan esittää. Nyt log 10 2 511 = 511 log 10 2 153.8263278. Siksipä 2 511 10 153.8263278 = 10 153 10 0.8263278 0.149 10 153. Lukua 2 512 voidaan arvioida vastaavalla tavalla, jolloin saadaan, että välillä [0.75 10 154, 0.13 0.13 10 155 ) olevat luvut ovat tietokoneella esitettävissä. 3 Alivuotoa tapahtuu, kun laskennan tuloksena saadaan reaaliluku, jonka itseisarvo on pienempi kuin pienin posit. luku, joka voidaan esittää. Tilanteesta riippuen voi olla tai olla olematta sopivaa arvioida alivuodon suuruutta nollalla. 29

2.6.4 Reaalilukuaritmetiikka Tarkastellaan seuraavassa hiukan sitä miten aritmeettisia operaatioita suoritetaan normalisoidussa eksponenttimuodossa olevilla reaaliluvuilla. Tämä antaa yleiskuvan siitä miten tietokone suorittaa reaalilukuaritmetiikkaa. Kun halutaan laskea yhteen (vast. vähentää), menetellään seuraavasti. 1. Kirjoitetaan luvut eksponenttimuodossa yhteistä eksponenttia käyttäen siten, että signikantti on pienempi kuin 1. 2. Lasketaan signikantit yhteen (vastaavasti vähennetään signikantit toisistaan); saadaan vastauksen signikantti; yhteinen eksponentti on vastauksen eksponentti. 3. Normalisoidaan vastaus tarvittaessa. Kun halutaan kertoa (vast. jakaa), menetellään seuraavasti. 1. Kerrotaan (vast. jaetaan) signikantit, jolloin saadaan vastauksen signikantti. 2. Lasketaan eksponentit yhteen (vast. vähennetään eksponentit toisistaan), jolloin saadaan tuloksen eksponentti. 3. Normalisoidaan vastaus tarvittaessa. Jäljitelläksemme tapaa, jolla tietokone suorittaa laskutoimituksia, oletetaan seuraavassa, että luvun normalisoidun esityksen signikantissa numerojen lukumäärä on kiintä ja että vastauksessa signikantti aina pyöristetään lukumäärän mukaisesti. Esim. 20. Suorita laskinta käyttäen seuraavat laskutoimitukset. Oletetaan, että signikantti esitetään neljän numeron tarkkuudella. Ratkaisu. (a) 0.4932 10 3 + 0.2881 10 4 0.3096 10 4 (b) (0.2174 10 5 ) (0.1482 10 7 ) (0.9497 10 4 ) (a) 0.4932 10 3 + 0.2881 10 4 0.3096 10 4 = 0.0493 10 4 + 0.2881 10 4 0.3096 10 4 = 0.0278 10 4 = 0.2870 10 3. (b) (0.2174 10 5 ) (0.1482 10 7 ) (0.9497 10 4 ) = 0.03393 10 2 = 0.3393 10 3. 30

Luku 3 Logiikka (propositiokalkyyli, predikaattikalkyylin alkeet) 3.1 Logiikka ja laskeminen tietokoneella Tässä kappaleessa tarkastelemme logiikkaa matematiikan näkökulmasta. Logiikkaa sovelletaan monella alueella tietojenkäsittelyssä, esim. (i) digitaalipiirien suunnittelussa; (ii) kontrollirakenteiden ehtoina ohjelmoinnissa; (iii) tietokantakyselyissä; (iv) asiantuntijajärjestelmien tietämyspohjaisissa ohjelmistoissa; (v) tietokonemallinnuksessa; ja (vi) formaalissa spesioinnissa. 3.2 Propositiot Luvut ovat aritmetiikan perusobjekteja. Vastaavalla tavalla propositiot ovat logiikan keskeisiä rakennuspalikoita. Propositio on väittämä, joka on joko tosi (totuusarvo 1 tai T) tai epätosi (totuusarvo 0 tai F). Esimerkkejä propositioista: 31

'Canberra on Australian pääkaupunki'; 'Aurinko kiertää maata'; 'Isaac Newton syntyi vuonna 1642'; '5 on suurempi kuin 7'; 'Jokainen kakkosta suurempi parillinen kokonaisluku voidaan ilmaista kahden alkuluvun summana'. Edellä ensimmäinen ja kolmas ovat tosia propositioita. Toinen ja neljäs on epätosia. Tällä hetkellä ei tiedetä on viides propositio tosi vai epätosi. Kyseessä on ns. Goldbachin väittämä. Seuraavat ilmaisut eivät ole propositioita: 'Minne menet?'; 'Tule tänne!'; 'Tämä lause on epätosi'. Ensimmäinen on kysymys, toinen käsky. Kolmas viittaa itseensä ja johtaa ristiriitaan tai paradoksiin. Jos se on tosi, sen sisältämä väittämä johtaa ristiriitaan oletuksemme kanssa. Jos se taas on epätosi, päättelemme, että se on tosi ja olemme jälleen ristiriidassa oletuksen kanssa. Tarkastellaan ilmaisuja: 'Eläirasvojen syönti ei vaikuta kolesteroliin'; 'Olut on terveellistä'; 'x<8'. Kaksi ensimmäistä ovat mielipidekysymyksiä; niiden totuudellisuudesta kiistelemine ei (tällä kurssilla) maksa vaivaa. Emme tule tarkastelemaaan propositioina väitteitä, joiden totuusarvo on epäselvä. Viimeinen yllä esitetty lauseke on predikaatti, väite, josta tulee propostio, kun siinä esiintyvien muuttujien arvot sopivasti kiinnitetään. Pikkasen tarkemmin: Predikaatti on ilmaisu, joka - sisältää yhden tai useampia muuttujia; - ei ole propositio mutta josta tulee propositio, kun siinä esiintyvien muuttujien arvot sopivasti sidotaan. Tietokoneohjelma (tai algoritmi) voi sisältää lausekkeen ' x < 8' esim. jossakin kontrollirakenteessa. Tällöin sen totuusarvo voidaan määrittää syötteen ja ohjelman sen hetkisen tilan perusteella, joten lauseketta ' x < 8' voidaan 32