MAT-71000 Tieto ja laskenta laskuharjoituksia



Samankaltaiset tiedostot
MAT Tieto ja laskenta laskuharjoituksia

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Datatähti 2019 loppu

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Tietotekniikan valintakoe

Tietorakenteet ja algoritmit - syksy

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 1. Luento 8 Ke Timo Männikkö

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

811120P Diskreetit rakenteet

Algoritmit 2. Luento 8 To Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

ITKP102 Ohjelmointi 1 (6 op)

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö

811120P Diskreetit rakenteet

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 1. Demot Timo Männikkö

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

1 Erilaisia tapoja järjestää

Algoritmit 2. Luento 2 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Zeon PDF Driver Trial

Algoritmit 2. Luento 13 Ti Timo Männikkö

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

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

Tietorakenteet (syksy 2013)

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

1. Esitä rekursiivinen määritelmä lukujonolle

13 Lyhimmät painotetut polut

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

Algoritmit 2. Luento 13 Ti Timo Männikkö

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

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

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

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

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

TIE Tietorakenteet ja algoritmit 25

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Onko kuvaukset injektioita? Ovatko ne surjektioita? Bijektioita?

58131 Tietorakenteet ja algoritmit (syksy 2015)

Algoritmit 2. Luento 14 Ke Timo Männikkö

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

9 Erilaisia tapoja järjestää

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Python-ohjelmointi Harjoitus 2

Algoritmit 2. Luento 10 To Timo Männikkö

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit

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

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 1. Luento 5 Ti Timo Männikkö

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op)

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Äärellisten mallien teoria

Algoritmit 2. Luento 6 To Timo Männikkö

Ohjelmoinnin perusteet Y Python

isomeerejä yhteensä yhdeksän kappaletta.

Ohjelmoinnin peruskurssi Y1

4.3. Matemaattinen induktio

Ohjelmoinnin perusteet Y Python

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen)

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

Python-ohjelmointi Harjoitus 5

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

Ohjelmoinnin perusteet Y Python

Tiraka, yhteenveto tenttiinlukua varten

Algoritmit 1. Luento 2 Ke Timo Männikkö

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

811120P Diskreetit rakenteet

Luku 8. Aluekyselyt. 8.1 Summataulukko

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

Transkriptio:

MAT-71000 Tieto ja laskenta laskuharjoituksia Antti Valmari Tampereen teknillinen yliopisto 23.1.2015 Pisteytys Arvosanan 1 raja tulee olemaan välillä 40%... 50% tentin maksimipisteistä. Muiden arvosanojen rajat tulevat olemaan suunnilleen 10 %-yksikön välein. Laskuharjoituspisteet lisätään tenttipisteisiin kuten jäljempänä on kerrottu. Laskuharjoitusten tehtävät on jaettu ryhmiin viikkojen mukaan. Jos opiskelija esittää hyväksytysti ryhmästä yhden ratkaisun, hän saa kolme pistettä. Kahdella ratkaisulla samasta ryhmästä saa viisi ja kolmella kuusi pistettä. Tämän säännön tavoitteena on kannustaa ratkaisemaan tehtäviä useista eri aiheista. Tentin arvostelussa otetaan huomioon korkeintaan 30 laskuharjoituspistettä. Yksi laskuharjoituspiste vastaa 1 3 % tentin maksimipisteistä. Jokaisella opiskelijalla on ensisijaisuusnumero alla olevan taulukon mukaan (Esim. Alan Turing = AT): JC TH IK OK EK AaK TK AnK 0 1 2 3 4 5 6 7 VL VM MN MP LS CT JTu JTä 8 9 A B C D E F Jos tehtävän numero modulo 16 on sama kuin opiskelijan ensisijaisuusnumero, niin opiskelija saa varmasti mahdollisuuden esittää ratkaisunsa, jos haluaa. Jos tällaista opiskelijaa ei ole, niin seuraavaksi oikeus on heillä, joilla ensisijaisuusnumero eroaa kahdeksalla. Heidän jälkeensä tulevat he, joilla ero on kolme jompaan kumpaan suuntaan. Tällä säännöllä pyritään siihen, että useita eri tehtäviä olisi ratkaistu ja siihen, että opiskelija voisi joidenkin tehtävien kohdalla olla varma siitä, että saa ratkaisustaan pisteen. Kun kaikki tällaiset ratkaisut on esitetty, opettaja voi harkintansa mukaan antaa muillekin tilaisuuden, jos uskoo sen olevan kuulijoille hyödyksi. Ratkaisujen esittämisessä on olennaista perustella ratkaisu. Kokeellisten tehtävien tapauksessa kerro kokeen lopputuloksen lisäksi myös koejärjestely ja miksi uskot, että se mittaa oikeaa asiaa. Ohjelmointitehtävien tapauksessa kerro ohjelman lisäksi miksi uskot, että se laskee luvatun tuloksen. Päättelytehtävien tapauksessa kerro, miksi kukin päättelyaskel pitää paikkansa. Tiedonhakutehtävien tapauksessa kerro, mistä hait tiedon ja miksi juuri sieltä. Muiden tyyppisten tehtävien tapauksessa esitä tehtävän luonteeseen sopiva perustelu.

MAT-71000 laskuharjoituksia AV 23.1.2015 2 1 Tiedon esittämistavoista 1. Selvitä kirjoittamalla sopivia C++-ohjelmia, voiko tietokoneesi C++-toteutuksen char-luku olla negatiivinen. 2. Selvitä kokeilemalla kaikki neljä tapausta joissa n ja m ovat positiivisia tai negatiivisia, milloin n%m on negatiivinen. Mihin suuntaan n/m pyöristetään kokeilemissasi tapauksissa? 3. Kokeile, ovatko tietokoneesi C++-toteutuksessa kaikki osoittimet (tarkemmin sanoen niiden osoittamien muistipaikkojen osoitteet) neljällä jaollisia. Keksitkö tietotyypin, jolle osoittimet ovat jaollisia suuremmalla luvulla kuin neljä? 4. Kirjoita C++-ohjelma, joka ei käytä sellaisia toimintoja kuin sizeof, MAXINT tai <limits> ja jonka avulla voit selvittää, montako bittiä on unsigned-luvuissa. 5. Mitä laskevat C++:n (a) n&m, (b) n m, (c) nˆm, (d) n ja (e) (n-1)ˆn? Tee ohjelma, joka havainnollistaa jokaisen. 6. Opeta muille läsnäolijoille, mikä on heksadesimaalijärjestelmä ja miten luvun voi muuttaa heksadesimaalijärjestelmästä 10-järjestelmään ilman tehokkaampia apuvälineitä kuin kynä, paperi ja nelilaskin (laskin, jossa on yhteen-, vähennys-, kerto- ja jokalasku). 7. Opeta muille läsnäolijoille, miten luvun voi muuttaa 10-järjestelmästä heksadesimaalijärjestelmään ilman tehokkaampia apuvälineitä kuin kynä, paperi ja nelilaskin (laskin, jossa on yhteen-, vähennys-, kerto- ja jokalasku). 8. Selvitä, kuinka monta tavua tietokoneesi C++-toteutus varaa std::vectorille siihen talletettavalle aineistolle varatun tilan lisäksi. Voit esimerkiksi varata kaksi vektoria ja verrata niiden osoitteita. Kerro, mitkä tavut ilmoittavat vektorin koon, mitkä vektorille varatun tilan ja mitkä vektoriin talletettavan aineiston osoitteen. 9. Tee ohjelma, joka havainnollistaa säiliön std::vector sisällön siirtymistä muistin alueesta toiseen. 10. Esitä perusteluja puolesta ja vastaan sille, että liukuluvuissa on erikseen +0 ja 0. Voit käyttää lähteenä Wikipediaa. 11. Liukuluvuilla laskettaessa tapahtuu pyöristysvirheitä. Siksi kaksi laskutoimitusta, joiden tarkat tulokset ovat samat, saattaa tuottaa eri luvut. Tämä täytyy usein ottaa huomioon liukulukujen yhtäsuuruutta verrattaessa. Yksi keino on laskutoimituksen jälkeen muuntaa lopputulos lähimmäksi luvuksi, jonka kolme vähiten merkitsevää bittiä ovat 100. Tee (mielellään mahdollisimman tehokas) aliohjelma, joka tekee tämän tietokoneesi C++-toteutuksen float-luvuille. Ota huomioon, että aivan kaikkia lukuja ei ole järkevää muuntaa näin. 12. Kerro mikä on Base64 encoding ja miksi sitä tarvitaan. Voit käyttää lähteenä Wikipediaa.

MAT-71000 laskuharjoituksia AV 23.1.2015 3 13. Kirjoita www-sivu, jossa lukee X : X ξ : ξ X Huolehdi, että X on kursivoitu eli näyttää suunnilleen siltä, kuin tässä. Tuota symbolit käyttäen sopivia character entity. 14. Käyttäen CSS-kielen keinoja, kirjoita www-sivu, jossa yksi tekstikappale on vihreää taustaa vasten mutta teksti on keltaista taustaa vasten kuten tässä. Rivien tulee olla keskitettyjä (siis sekä rivin alussa että lopussa voi olla tyhjää). 15. Mitä erilaisia väliviivoja, tavuviivoja, ajatusviivoja yms. Unicode sisältää? Entä mitä erilaisia välejä ja sen kaltaisia? 16. Suunnittele esitystapa monikulmioille tasossa. Monikulmioita ovat kolmiot, nelikulmiot ja niin edelleen. Tasoa edustaa x y-koordinaatisto. Monikulmion ei tarvitse olla säännöllinen ja sivut voivat mennä ristiin. Esitystapasi on todennäköisesti sellainen, että kaksi eri bittikuviota tuottaa monikulmioiksi piirrettyinä saman kuvan. Kuvaile testi, jolla voi selvittää, esittävätkö kaksi eri bittikuviota samaa monikulmiota. 17. Esitä laskukaava, jolla merkkijonot ja luonnolliset luvut voidaan asettaa 1 1- vastaavuuteen siten, että tyhjää merkkijonoa vastaa luku 0, yhden pituisia merkkijonoja vastaavat luvut 1,..., n missä n on erilaisten merkkien määrä, kahden pituisia merkkijonoja vastaavat luvut n+1,..., n+n 2 ja niin edelleen. 18. Tarkastellaan vaihtoehtoista etumerkin esitystapaa 10-järjestelmän kokonaisluvuille. Olkoot n k 1,...,n 0 numeroita (eli 0, 1,..., 9). Positiiviset luvut ja 0 esitetään tuttuun tapaan. ~n k 1 n 0 esittää luvun (n k 1 n 0 ) 10 k. Esim. ~612 = 612 1000 = 388. (a) Osoita ~n k 1 n 0 = ~9n k 1 n 0. (b) Vanhassa järjestelmässä lasketaan eri tilanteissa eri tavoilla. Esim. 41 17 = 24 lasketaan normaalisti, mutta 17 41 lasketaan laskemalla 41 17 = 24 ja vaihtamalla tuloksen etumerkki tuottaen 24. Miten yhteen- ja vähennyslasku lasketaan uudessa järjestelmässä, ja kuinka monta eri tapaa tarvitaan? 19. Tampereen bussien aikataulut on esitetty muodossa, jossa rivin alussa on tunnin numero t ja rivillä on ne minuutit m, joille bussi lähtee kello t:m. Ihan alussa on bussilinjan numero omalla rivillään. Laadi BNF-määritelmä, joka esittää tämän muodon. 20. Joukon A ositus on kokoelma joukkojaa 1,...,A n siten, ettäa 1 A n = A, A i A j = kun 1 i < j n, ja A i kun 1 i n. Ekvivalenssirelaatio joukossa A on A:n alkioita vertaava toiminto a b siten, että jokaiselle A:n alkiolle a, b ja c pätee a a; jos a b niin b a; ja jos a b ja b c niin a c. Osoita, että ositukset ja ekvivalenssirelaatiot ovat kaksi tapaa ilmaista sama asia. Täsmällisemmin, osoita, että jokainen ositus synnyttää ekvivalenssirelaation ja jokainen ekvivalenssirelaatio synnyttää osituksen siten, että jos 1 :n synnyttämä ositus on A 1,..., A n ja sen synnyttämä ekvivalenssi on 2, niin 1 ja 2 ovat sama ekvivalenssi. Mihin tarvitaan oletusta A i?

MAT-71000 laskuharjoituksia AV 23.1.2015 4 2 Lausekkeet, lauseet ym. 21. Piirrä seuraavien lausekkeiden lausekepuut. Jos sama puu tulee monesti, riittää viitata jo piirrettyyn. (a) 1+2*3+4 (b) (1+2)*3+4 (c) 1+(2*3)+4 (d) 1+2*(3+4) (e) (1+2*3)+4 (f) 1+(2*3+4) (g) (1+2)*(3+4) (h) 1+(2*(3+4)) 22. Piirrä seuraavien lausekkeiden lausekepuut. (a) A[i+1]*p->n (b)!!!0 (c) std::cout<<1 2<<3&&4 (d) p*=*q 23. Piirrä seuraavien lausekkeiden lausekepuut. Jos sama puu tulee monesti, riittää viitata jo piirrettyyn. (a) (i=-j)-=1 (b) i=-(j-=1) (c) i=--j-=1 (d) --i=j-- 24. Kirjoita lauseke, joka hyödyntää operaattoreiden erilaisia presedenssejä mutta ei erilaisia merkityksiä, ja jonka tuottama arvo muuttuu, jos && korvataan &:lla. Myös kirjoita lauseke, joka hyödyntää operaattoreiden erilaisia merkityksiä mutta ei erilaisia presedenssejä, ja jonka tuottama arvo muuttuu, jos && korvataan &:lla. Vaihtoehtoisesti voit toisessa tai molemmissa kohdissa käyttää operaattoreiden && ja & sijaan ja. 25. Olkoot i ja j C++-ohjelman muuttujia ja α mikä tahansa merkkijono, jossa ei ole muita merkkejä kuin välilyöntiä ja merkkiä -. Mitkä eri toiminnot voi saada aikaan C++-lausekkeilla muotoa iαj? Muutama malliksi: ij ei käänny, i-j laskee vähennyslaskun i j, i -j laskee saman kuin i-j, ja i-- -j sekä laskee vähennyslaskun i j että pienentää i:n arvoa yhdellä. 26. Opeta muille läsnäolijoille, mitä lausekkeiden käänteinen puolalainen esitystapa tarkoittaa ja miten sillä saadaan lausekepuut halutunlaisiksi ilman sulkuja. Kerro, miksi puolalaisella esitystavalla toimiva laskin on erityisen helppo toteuttaa. 27. Ohjelmoi käänteisen puolalaisen esitystavan mukainen laskin, joka laskee liukulukujen yhteen-, vähennys-, kerto- ja jakolaskuja. Ohjelmoinnin helpottamiseksi oleta, että jokaisen luvun edessä on #. 28. Selvitä lausekkeesta (1+2)*(3+4), kumman yhteenlaskun tietokoneesi C++toteutus laskee ensin. Vihje: tee oma lukutyyppi, jolle määrittelet operator+ ja operator*. 29. Kirjoita ohjelma, jossa on tämä rivi siten, että se tulostaa 1321. Rivin sisälle ei saa lisätä mitään eikä riviä saa muuttaa. Tehtävän voi ratkaista määrittelemättä omia tietotyyppejä. i=j=123; std::cout<<i; i=321; std::cout<<i; 30. Millä muuttujan i arvoilla silmukan for(int i=32; i--; ){...} vartalo suoritetaan? Entä for(unsigned i=32; i>=0; --i){...}? 31. Taulukko A sisältää luvut 0, 1,..., n 1 jossain järjestyksessä. Kirjoita algoritmi seur, joka muuttaa järjestystä siten, että kun seur toistetaan riittävän monta kertaa, käydään kaikki järjestykset läpi.

MAT-71000 laskuharjoituksia AV 23.1.2015 5 32. Tässä tehtävässä saat käyttää silmukoina vain perusmuotoisia for-silmukoita. Aliohjelmien, poikkeusten yms. käyttö on kielletty, mutta if on sallittu. Laskutoimituksia varten saat käyttää vain operaattoreita ++ ja-- (siis +,* jne. on kielletty). Sijoitukset, syöttö std::cin >> ja tulostus std::cout << on sallittu. Jokainen ohjelma lukee kaksi lukua n ja m. (a) Käyttäen enintään yhtä silmukkaa, kirjoita ohjelma, joka tulostaa n+m. (b) Käyttäen enintään kahta silmukkaa, kirjoita ohjelma, joka tulostaa nm. (c) Käyttäen enintään kolmea silmukkaa, kirjoita ohjelma, joka tulostaa n m. (d) Tee jonossa seuraava ohjelma (joka siis käyttää neljää silmukkaa) ja perustele, että jos lukualue ei loppuisi kesken, niin varsin lyhyellä ohjelmalla voitaisiin tuottaa valtavan suuri luku. 33. Oletetaan, että ohjelmassa saa olla vain yksi silmukka eikä rekursiivisia aliohjelmia saa käyttää. Tällainen rajoitus tekee ohjelmoinnista kömpelöä, mutta tekeekö se kokonaan mahdottomaksi laskea jotakin, mitä ilman rajoitusta voisi laskea? 34. Kerro, miten silmukat ja if-lauseet saa aikaan ohjelmointikielellä Brainfuck. 35. Yksisuuntaisen rengasmaisen listan viimeinen alkio osoittaa ensimmäiseen ja osoitin listaan osoittaa viimeiseen. Kirjoita seuraavat aliohjelmat. (a) Aliohjelma, joka lisää alkion listan ensimmäiseksi. (b) Aliohjelma, joka lisää alkion listan viimeiseksi. (c) Aliohjelma, joka poistaa listan ensimmäisen alkion. 36. Aja seuraava ohjelma ja kerro, miksi tulostukset ovat ne mitä ne ovat. #include <iostream> #include <vector> std::vector<int> A(4,7); void print(){ for( unsigned i=0; i<a.size(); ++i ){ std::cout << << A[i]; } std::cout << \n ; } int main(){ print(); int &k = A[2]; k=5; print(); A.push_back(9); print(); k=3; print(); } 3 Aliohjelmat ja abstraktiot 37. Kirjoita aliohjelma, joka kääntää yksisuuntaisen linkitetyn listan takaperin. 38. Tässä tehtävässä toteutetaan nimellä Merge-Sort tunnettu järjestämisalgoritmi yksisuuntaisille linkitetyille listoille. Yleisimmät nopeat järjestämisalgoritmit

MAT-71000 laskuharjoituksia AV 23.1.2015 6 Quicksort ja Heapsort edellyttävät kykyä valita mikä tahansa alkio nopeasti indeksoimalla, mikä ei onnistu listoille. Merge-Sort on nopea eikä vaadi tätä kykyä. Se on niin ollen hyvä algoritmi listojen järjestämiseen. (a) Kirjoita aliohjelma, joka yhdistää kaksi yksisuuntaista linkitettyä listaa seuraavasti. Se vertaa, kumman listan ensimmäinen alkio on pienempi. Se poistaa näin valitun alkion listastaan ja lisää sen tuloslistan jatkeeksi. Se toistaa tätä, kunnes jompikumpi lista on tyhjä. Lopuksi se kytkee jäljelle jääneen listan tuloslistan jatkeeksi. Tuloslista on alun perin tyhjä. (b) Tee aliohjelma, joka poimii saamastaan listasta k ensimmäistä ja k niiden jälkeen tulevaa alkiota, ja tekee niille edellisen kohdan toiminnon. Sitten se tekee saman seuraaville k+k alkiolle ja lisää tuloksen tuloslistan jatkeeksi. Se toistaa tätä, kunnes kaikki syötelistan alkiot on siirretty tuloslistaan. Valitse järkevä käyttäytyminen siihen tilanteeseen, että listassa on jäljellä vähemmän kuin 2k alkiota. (c) Tee aliohjelma, joka järjestää listan tekemällä edellisen kohdan toiminnon k:n arvoilla 1, 2, 4, 8,... kunnes lista on järjestyksessä. 39. Selvitä sopivalla koejärjestelyllä, varaako tietokoneesi C++-toteutus muistia (a) muuttujalle (b) aliohjelman parametrille i, joka on tyyppiä int &. Huomaa, että &i ei anna i:n omaa osoitetta (vaikka sellainen olisi olemassa), vaan sen muuttujan tms. osoitteen, johon i viittaa. 40. Lisää alla olevaan aliohjelmaan static-muuttujaa käyttävä kirjanpito siitä, kuinka monesti sitä on kutsuttu. Muuta se sellaiseksi, että kun kutsujen määrä ylittää 1 000, se ei toimi normaalisti vaan tulostaa en jaksa enää. Mikä on pienin n, jolla se antaa periksi? unsigned Fib( unsigned n ){ if( n<2 ){ return n; } else{ return Fib(n-1) + Fib(n-2); } } 41. Aapo kyllästyi taulukoiden ohi-indeksoinnin aiheuttamiin virheisiin ja tietoturvaongelmiin, ja kirjoitti seuraavat aliohjelmat. Mikä toisessa niistä on vikana? void sijoita( std::vector<int> &A, int i, int x ){ if( 0 <= i && i < A.size() ){ A[i] = x; } } int palauta( std::vector<int> A, int i ){ if( 0 <= i && i < A.size() ){ return A[i]; } else{ return 0; } } 42. Kirjoita aliohjelma kopioi(a, i, n, B, j), joka kopioi taulukon A alkiot A[i], A[i+1],..., A[i+n 1] taulukkoon B alkioiksi B[j], B[j+1] jne. Mitä tapahtuu kutsussa kopioi(a,1,5,a,3)? Voiko tältä suojautua, edes jossain määrin?

MAT-71000 laskuharjoituksia AV 23.1.2015 7 43. Kahden muuttujan sisältö voidaan yleensä mutta ei aina vaihtaa ilman apumuistia seuraavasti. Selitä, miten se toimii, ja anna esimerkki tilanteesta, jossa se ei toimi oikein. void vaihda( int &x, int &y ){ xˆ=y; yˆ=x; xˆ=y; } 44. Tavoitteena on tulostaa taulukossa A[1... n] annettu teksti riveille siten, että lyhyin muu kuin viimeinen rivi on mahdollisimman pitkä. Kahden peräkkäisen sanan välissä on A:ssa yksi välilyönti, eikä A:ssa ole muita välilyöntejä. Myös tulostuksessa kahden samalla rivillä peräkkäin olevan sanan väliin pitää tulostaa yksi välilyönti, eikä muita välilyöntejä saa tulostaa. Rivillä on tilaa l merkille. Osoita esimerkillä, että oikeaa jakoa ei välttämättä saada siten, että A käydään läpi alusta loppuun ja uusi rivi aloitetaan aina kun seuraavana vuorossa oleva sana ei enää mahdu edelliselle riville. 45. Alla on alettu laatia aliohjelmaa toteuttamaan edellisen tehtävän tavoite. Se ei tulosta jakokohtia, mutta kertoo, kuinka pitkä huonoin rivi on. jako(i) N if n i l then return l h := 0 for j := 2 to l+1 do if A[i+j] = then k := jako(i+j) if k > j 1 then k := j 1 if k > h then h := k return h (a) Miten aliohjelmaa pitää kutsua, jotta se laskisi vastauksen koko tekstille? (b) Miten aliohjelmassa on otettu huomioon, että viimeisen rivin pituudella ei ole väliä? (c) Miksi for-silmukka aloittaa muuttujan j arvolla 2, eikä 1 tai 0? (d) Mitä aliohjelma tekee, jos jokin sana on pitempi kuin l? 46. Ohjelmoi edellisen tehtävän aliohjelma tietokoneellesi. Laadi jokin niin iso syöte, että suoritusaika tietokoneessasi on ainakin 10 sekuntia. Sitten muuta aliohjelmaa siten, että aina laskettuaan vastauksen se laittaa sen talteen, ja aina kun siltä kysytään vastausta, se käyttää aikaisemmin laskemaansa, jos se on sellaisen tallettanut. Mittaa suoritusaika uudelleen. Jos havaitset merkittävän eron, selitä, mistä se johtuu. 47. Muunna tehtävässä 45 annettu aliohjelma tarkoitukseen sopivaksi ja laadi sitä hyödyntäen ohjelma, joka tulostaa tekstin jaettuna riveille. Pseudokoodina annettu vastaus riittää.

MAT-71000 laskuharjoituksia AV 23.1.2015 8 48. Seuraavilla aliohjelmilla Fib(n) N voi laskea Fibonaccin lukuja. Vertaa niiden ajan ja muistin kulutusta toisiinsa olettaen, että lukutyyppi pystyy tallettamaan niin isoja lukuja, että Fib(n) voidaan laskea kun 0 n 100. (Tämä on päättelytehtävä. Ohjelmia ei tarvitse toteuttaa.) Onko muita tekijöitä, jotka tulee ottaa huomioon, kun tehdään valintaa niiden välillä? (Operaattori & laskee bitittäisen ja-operaation kuten C++:ssa.) (a) if n < 2 then return n else return Fib(n 1)+Fib(n 2) (b) A[0] := 0; A[1] := 1 for i := 2 to n do A[i] := A[i 1]+A[i 2] return A[n] (c) if n < 2 then return n j := 0; k := 1 for i := 2 to n do h := k; k := k +j; j := h return k ( (d) return 1 5 ( 1+ 5 2 ) n ( 1 5 2 ) n) (e) return 1 5 5 (1+ 2 ) n + 1 2 (f) if n < 2 then return n j := 0; k := 1; m := 1 while m n/4 do m := 2m while m > 0 do h := (2j +k)k; j := k 2 +j 2 ; k := h if m&n then h := k; k := k+j; j := h m := m/2 return k 49. Hanoin tornit on tehtävä, jossa on kolme pystysuoraa puikkoa ja n kiekkoa. Kiekoissa on keskellä reikä, niin että niitä voidaan pinota puikkoihin kuten kuvassa. Kiekkojen koot ovat 1, 2,..., n. Kiekkojen tulee olla koko ajan puikoissa, mutta yhden kiekon kerrallaan saa siirtää puikosta toiseen. Isompaa kiekkoa ei saa koskaan laittaa pienemmän päälle. Aluksi kaikki kiekot ovat puikossa 1. Tee ohjelma, joka kertoo, miten kiekkoja pitää siirtää, jotta ne kaikki saadaan puikkoon 2. 50. Olkoon sailio tyyppiä std::vector<int>. Aja alla oleva ohjelmanpätkä siten, että säiliön sisältö on muotoa 0, 0, 1, 1, 2, 2, 3, 3,..., n, n. Valitse niin suuri n, että suoritusaika tietokoneessasi on ainakin 10 sekuntia. Sitten vaihda säiliön tyypiksi std::list<int>. Miten suoritusaika muuttuu? Mistä ero johtuu? s1 = sailio.begin(); while( s1!= sailio.end() ){ s2 = s1; ++s2; if( s2!= sailio.end() && *s1 == *s2 ){ sailio.erase( s2 ); } else{ s1 = s2; } }

MAT-71000 laskuharjoituksia AV 23.1.2015 9 51. Olkoon edellisen tehtävän koodinpätkän sailio tyyppiä std::deque<int>. Kuinka monta erilaista virhetoimintoa saat havainnollistettua käyttämällä erilaisia säiliön sisältöjä? Ainakin yksi pitää löytää (niitä on enemmän). 4 Asymptoottinen suoritusaika 52. (a) Osoita, että tasan neljä alkiota on pienempiä kuin x ei aina ilmaise sitä, että jos alkiot pannaan suuruusjärjestyksessä jonoon, niin jonon viides on arvoltaan x. (b) Anna samaan ajatukseen perustuva, mutta paremmin toimiva ilmaus. 53. Kirjoita ei-rekursiivinen algoritmi, joka etsii suuruusjärjestyksessä kohtaan k osuvan alkion taulukosta A[1...n] ja toimii keskimäärin ajassa Θ(n). Vihje: tee siitä Quicksortia muistuttava, mutta osituksen jälkeen se hylkää jomman kumman osan. 54. Oletetaan, että Quicksortin toteutuksen keskimääräinen suoritusaika on noin 10nlog 2 n + 2n ja Insertion-sortin noin n 2. Ne voidaan yhdistää siten, että kun osataulukon koko on enintään k, Quicksort jättää sen järjestämättä. Lopuksi ajetaan Insertion-sort koko taulukolle. Tämä toimii isoille taulukoille nopeammin kuin kumpikaan algoritmi yksinään. (a) Miksi lopun Insertion-sort on nopea? (b) Mikä kannattaa valita k:n arvoksi? (Jos et keksi parempaa tapaa löytää vastaus, tee vaikka tietokoneohjelma, joka kokeilee k:n arvoja 1, 2, 3,... kunnes vastaus löytyy.) 55. Toteuta edellisen tehtävän algoritmit C++:lla käyttäen lähtökohtana luentojen pseudokoodeja, ja kokeile mittaamalla, mistä luvun k arvosta alkaen yhdistelmä on nopein. Käytä aineistona lukuja 1, 2,..., n laitettuna satunnaiseen järjestykseen. 56. Oletetaan, että n on niin iso, että todellinen suoritusaika käyttäytyy Θ- merkinnän ennustamalla tavalla. Kun tietokoneen teho kaksinkertaistuu, niin miten kymmenessä sekunnissa ratkeavan tehtävän koko muuttuu, kun suoritusaika on (a) Θ(n) (b) Θ(n 2 ) (c) Θ(n 3 ) (d) Θ(1,41 n )? 57. Ilmaise seuraavien sarjojen summat Θ-merkinnällä. (a) 1 2 +2 2 +...+n 2 (b) log 2 1+log 2 2+...+log 2 n (c) 1+ 2+...+ n (d) sin1 π 4 +sin2 π 4 +...+sinn π 4 (e) 1 2 + 2 3 +...+ n n+1 (f) 2 1 +2 2 +...+2 n

MAT-71000 laskuharjoituksia AV 23.1.2015 10 58. Keksi kaksi funktiota t(n) ja f(n) siten, että kumpikin tuottaa vain positiivisia arvoja kun n N, ja t(n) ei ole O(f(n)) eikä Ω(f(n)). Vihje: tee toisesta sellainen, että se aaltoilee ylös ja alas. 59. Osoita, että Θ(2 n ) ei ole sama kuin Θ(3 n ), mutta ne molemmat ovat 2 Θ(n). 60. Arvioi seuraavien algoritmien hitaimman ja nopeimman tapauksen suoritusaikaa O-, Ω- ja/tai Θ-merkinnällä. (a) i := 1; while i n A[i] x do i := i+1 (b) h := 0; x := A[1]; i := 1 while h < n do i := i+1; if i > n then i := 1 if x+1 = A[i] then x := A[i]; h := 0 else h := h+1 (c) i := 1; while i < n do i := 2i+1

MAT-71000 laskuharjoituksia AV 23.1.2015 11 61. Arvioi seuraavien algoritmien hitaimman ja nopeimman tapauksen suoritusaikaa O-, Ω- ja/tai Θ-merkinnällä. (a) s := 0; i := 1; while s < n do s := s+i; i := i+1 (b) for i := 2 to n do p[i] := true for i := 2 to n do if p[i] then print(i); j := 2i while j n do p[j] := false; j := j +i (c) Oletetaan, että A[1] A[2]... A[n]. a := 1; y := n while A[a]+A[y] x a < y do if A[a]+A[y] < x then a := a+1 else y := y 1 62. Arvioi seuraavien algoritmien hitaimman ja nopeimman tapauksen suoritusaikaa O-, Ω- ja/tai Θ-merkinnällä. (a) m := 0 for i := 0 to n do j := i while j > 0 do if j mod2 = 1 then m := m+1 j := j/2 (b) t := n for i := 1 to n do s := t for j := 1 to s do t := t+1 63. Suunnittele algoritmi, joka ei käytä monimutkaisia tietorakenteita, ja joka selvittää, esiintyykö mikään luku ainakin kahdesti taulukossa A[1... n]. (Vain ne tietorakenteet on sallittu, joita on jo käsitelty luennoilla tai jotka olet itse keksinyt.) Mikä on algoritmisi asymptoottinen suoritusaika? Saatko suoritusajaksi O(n log n) siten, että keskimääräisen suoritusajan takaava vastaus ei riitä? 64. On n opiskelijaa ja m esitelmäaikaa. S[i, j] = true jos ja vain jos opiskelijalle i sopii pitää esitelmä aikana j. Samana aikana ei voi olla useampaa kuin yksi esitelmä. Seuraava algoritmi yrittää etsiä jokaiselle opiskelijalle esitelmäajan. for j := 1 to m do O[j] := 0 for i := 1 to n do for k := 1 to i do Y[k] := false if yritä(i) then return false return true yritä(i) {false, true} if Y[i] then return false Y[i] := true for j := 1 to m do if S[i,j] then if O[j] = 0 yritä(o[j]) then O[j] := i; return true return false (a) Perustele, että jos yritä(i) palauttaa true, niin jokaisella opiskelijalla 1, 2,..., i on aika. Miten opiskelijalle i varattu aika on ilmaistu taulukoiden sisältöinä?

MAT-71000 laskuharjoituksia AV 23.1.2015 12 (b) Tarkastellaan tilannetta, jossa opiskelijoilla 1, 2,..., i 1 on ajat. Perustele, että jos aikoja siirtämällä on mahdollista varata aika myös opiskelijalle i, niin algoritmi onnistuu tekemään niin. (c) Mikä on taulukon Y tehtävä tai vaikutus algoritmin suoritukseen? (d) Arvioi algoritmin hitaimman tapauksen suoritusaikaa O- tai Θ-merkinnällä. 65. Osoita, että Insertion-sortin keskimääräinen suoritusaika on Θ(n 2 ), jos kaikki alkiot ovat erisuuria. Vihje: tarkastele niiden i ja j määrää, joille 1 i < j n ja A[i] > A[j]. Ajattele, että x on aukon kohdalla. Miten parien määrä muuttuu sijoituksessa A[j] := A[j 1]? Ajattele, että alkuperäinen taulukko luodaan arpomalla luvuille 1, 2,..., n paikat siten, että kun i 1 lukua on saanut paikkansa, i osuu samalla todennäköisyydellä minkä tahansa niistä eteen tai kaikkien perään. 66. Lukujen x 1, x 2,..., x n liukuva mediaani ikkunan koolla 2w+1 tarkoittaa lukujonoa m 1, m 2,..., m n 2w, missä kukin m i on luvuista x i, x i+1,..., x i+2w suuruusjärjestyksessä keskimmäinen. Tarkastellaan algoritmia, joka ottaa ensin vastaan luvut x 1, x 2,..., x 2w. Sitten se ottaa lukuja vastaan yksi kerrallaan ja aina luvun x 2w+i saatuaan palauttaa luvun m i. Oletetaan, että se perustuu vertailemiseen ja käyttää aikaa t(w) lukua kohti. Osoita, että hitaimmillaan t(w) Ω(log w). 5 Tärkeimmät tietorakenteet 67. Näytä, miten jono voidaan rakentaa kahdesta pinosta siten, että yksittäinen toiminto voi olla hidas, mutta tyhjästä jonosta aloittavan n:n mittaisen toimintojonon suoritusaika on silti Θ(n). 68. Oletetaan, että osoitin vie yhden sanan ja samoin kokonaisluku. Pino toteutetaan linkitettynä listana, jonka jokaisessa tietueessa on korkeintaan kolme pinon alkiota ja osoitin seuraavaan tietueeseen. Lisäksi on osoitin listan alkuun sekä muuttuja, joka pitää kirjaa pinossa olevien alkioiden määrästä eli luvusta n. (a) Etsi mahdollisimman pieni vakio a ja sen jälkeen mahdollisimman pieni vakio b siten, että kun pinossa on n alkiota, niin muistin kulutus on enintään an+b sanaa. (b) Vertaa tämän toteutuksen muistin kulutusta suurilla n tavalliseen tapaan linkitettynä listana toteutettuun pinoon. (c) Vertaa tämän toteutuksen muistin kulutusta suurilla n taulukkona toteutettuun pinoon, jossa taulukon koko kaksinkertaistuu aina, kun n ohittaa kahden potenssin. Älä laske taulukkototeutuksen muistin kulutukseen mukaan sitä muistia, jota taulukko ei enää käytä. 69. Etsi esim. Wikipediasta, mikä on hyppylista (skip list) ja kerro se muille läsnäolijoille.

MAT-71000 laskuharjoituksia AV 23.1.2015 13 70. Oletetaan, että on n alkiota, ja etsintä kohdistuu alkioon i todennäköisyydellä p i, missä 1 i n. Alkiot on talletettu linkitettyyn listaan. Alkioita ei lisätä eikä poisteta. Joka kerta kun käsitellään alkiota i, se siirretään listan ensimmäiseksi. (a) Oletetaan, että p i = 1 n. Mikä on haun asymptoottinen ajan kulutus? (b) Oletetaan, että p i = 2 i /(1 2 n ) ja lista on i:n mukaisessa järjestyksessä, alkio 1 ensin. Mikä on haun asymptoottinen ajan kulutus? (c) Oletetaan, että p i = c n /i 2 ja lista on i:n mukaisessa järjestyksessä, alkio 1 ensin. Luku c n = ( n i=1 i 2 ) 1 vaihtelee n:n mukana niin vähän, että sitä ei tarvitse ottaa huomioon. Mikä on haun asymptoottinen ajan kulutus? 71. Kirjoita epätyhjästä keosta poistamisen algoritmi uusiksi siten, että keon suurin on lokerossa A[0] ja keko ulottuu lokeroon A[n 1] asti. 72. Oletetaan, että k on paljon pienempi kuin n. Luonnostele algoritmi, joka ajassa O(n log k) tulostaa n alkion joukosta k suurinta. Keskimääräisen suoritusajan takaava vastaus ei riitä. 73. Oletetaan, että rekisteritunnus koostuu enintään kolmesta kirjaimesta ja enintään kolmesta numeromerkistä. Kaikki suomalaisen aakkoston 29 kirjainta ovat käytössä. Numero-osuus voi alkaa nollalla vain jos se on 0. Kumpikaan osuus ei ole tyhjä. (a) Kuinka monta erilaista rekisteritunnusta on olemassa? (b) Oletetaan, että rekisterissä on noin 5 000 000 ajoneuvoa. Valitse hajautustaulun koko ja suunnittele hajautusfunktio. 74. Heebo ehdotti, että jos käytetään tarpeeksi suurta hajautustaulua, niin kahden eri avaimen osuminen samaan lokeroon on niin epätodennäköistä, että siihen ei tarvitse varautua. Tällöin voitaisiin käyttää taulua, jossa alkiot ovat suoraan, eikä linkitettyjä listoja tarvittaisi. Etsi netistä syntymäpäiväongelma ja selvitä, kuinka monta alkiota enintään voidaan laittaa 365 alkion tauluun, jos todennäköisyyden on oltava alle 50% sille, että kaksi eri alkiota osuu samaan lokeroon. Kommentoi Heebon ehdotuksen toimivuutta. 75. Tavoitteena on tallettaa 7 000 kappaletta 21-bittisiä lukuja mahdollisimman vähällä muistilla, kun lukujen jakauma voidaan olettaa satunnaiseksi. (a) Luvut talletetaan peräkkäisiin tavuihin mahdollisimman tiiviisti. Ensimmäinen luku varaa kaksi ensimmäistä tavua ja kolmannesta tavusta 5 bittiä. Toinen luku varaa kolmannen tavun loput 3 bittiä, kaksi seuraavaa tavua ja kuudennesta tavusta 2 bittiä. Kolmas luku varaa kuudennen tavun loput bitit, seitsemännen tavun ja yhtä bittiä vaille kahdeksannen tavun. Näin jatketaan. Kuinka monta tavua tarvitaan kaikkiaan?

MAT-71000 laskuharjoituksia AV 23.1.2015 14 (b) Luvut talletetaan erikoisvalmisteiseen hajautustauluun. Siinä on perustaulukko, jossa on 1 024 kappaletta 9-tavuisia tietueita sekä ylivuototaulukko, jossa on 1 700 kappaletta 3-tavuisia tietueita. Luvun vähiten merkitseviä 10 bittiä käytetään valitsemaan yksi perustietue. Perustietueessa on 6 kappaletta 11-bittisiä lokeroita. Luvun eniten merkitsevät 11 bittiä talletetaan ensimmäiseen vapaaseen lokeroon. Perustietueessa on myös 3-bittinen koodi, jonka arvot 0,..., 6 tarkoittavat, että lokeroista niin monta on käytössä, ja arvo 7 tarkoittaa, että 5 lokeroa on käytössä ja kuudes lokero sisältää linkin ylivuototietueeseen. Ylivuototietueessa on kaksi 11-bittistä lokeroa sekä samanlainen koodi. Tarkasta, että perustietue mahtuu sille varattuun määrään tavuja. Jääkö muistia hyödyntämättä? Tee sama tarkastus ylivuototietueelle. Onko linkeissä riittävästi bittejä? (c) Arvioi, montako ylivuototietuetta tarvitaan. Pituutta k olevien listojen määrä on laskettu oheen kaavasta me n/m (n/m) k /k!, missä m = 1024 ja n = 7 000. Kaava on paljon tarkempi kuin tarvittaisiin. Onko varattu riittävästi ylivuototietueita? pituus 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 määrä 1 8 26 59 100 137 156 152 130 99 68 42 24 13 6 3 1 (d) Laske hajautustaulun käyttämän muistin määrä. Huomaatko mitään yllättävää? Keksitkö selityksen? 76. Oletetaan, että binäärihakupuun jokaisessa solmussa on ylimääräinen kenttä n, jonka sisältö kertoo, montako solmua on siinä alipuussa, jonka juuri on ko. solmu. Kirjoita hitaimmillaan puun korkeuteen verrannollisessa ajassa toimiva algoritmi, jolle annetaan osoitin solmuun, ja joka palauttaa luvun, joka kertoo, kuinka mones ko. solmu on suuruusjärjestyksessä. 77. Radix-puu on binääripuu, jonka jokaisessa solmussa on yksi bitti ja solmulla on korkeintaan kaksi lasta, 0-lapsi ja 1-lapsi. Radix-puu tallettaa joukon bittijonoja. Bittijono on joukossa, jos ja vain jos sen mukaan voidaan kulkea puussa (ts. vuorossa olevan bitin arvoa vastaava lapsi on aina olemassa) ja päädytään solmuun, jonka bitti on päällä. Olkoon n puussa olevien bittijonojen määrä ja m puussa olevien solmujen määrä. (a) Kirjoita algoritmi, joka lisää bittijonon radix-puuhun. Olkoon bittijonossa b bittiä. Mikä on algoritmin asymptoottinen ajan kulutus? (b) Miten radix-puun avulla voidaan järjestää joukko keskenään erisuuria bittijonoja, ja mikä on sen asymptoottinen ajan kulutus? 78. Mittaa, kuinka monta tavua C++:n set-säiliön tietue vie, jos avain vie (a) yhden (b) neljä (c) 8 (d) 12 tavua. 79. C++:n säiliöt set, multiset, map ja multimap edellyttävät, että avainten vertaamista varten on operaattori. Merkitsemme sitä <. Siltä vaadittavat ominaisuudet esitetään C++-kirjallisuudessa eri tavoin. Aina vaaditaan ainakin seuraavat ominaisuudet jokaisella x, y ja z:

MAT-71000 laskuharjoituksia AV 23.1.2015 15 Irrefleksiivisyys: (x<x). Transitiivisuus: jos x<y ja y <z, niin x<z. (a) Toisinaan vaaditaan myös asymmetrisyys: jos x < y, niin (y < x). (Jos C++kirjasi kutsuu tätä antisymmetrisyydeksi, niin se on väärässä.) Osoita, että asymmetrisyys seuraa irrefleksiivisyydestä ja transitiivisuudesta. (Sitä ei siis tarvitse vaatia erikseen.) (b) Operaattori == määritellään x==y (x<y) (y<x). Osoita, että == on refleksiivinen, eli jokaisella x pätee x == x. (c) Osoita, että == on symmetrinen, eli jokaisella x ja y, joille x==y pätee, pätee myös y ==x. (d) Osoita, että == ei välttämättä ole transitiivinen. Vihje: vastaesimerkin voi rakentaa olettamalla, että on olemassa vain kolme erisuuruista arvoa. Erilaisia irrefleksiivisiä transitiivisia < on silloin niin vähän, että ne voi vaikka kokeilla kaikki. 80. Olkoot < ja == kuten edellisessä tehtävässä. (a) Osoita, että kullekin x ja y pätee täsmälleen yksi seuraavista: x<y, x== y tai y <x. (b) Osoita, että jos == on transitiivinen, x 1 ==x 2, y 1 ==y 2 ja x 1 <y 1, niin x 2 <y 2. 81. Tarvitaan tietorakenne tallettamaan monijoukko. Toisin sanoen, sama avain voi esiintyä useasti, eikä alkiossa ole mitään muuta tietoa kuin avain. Oletetaan, että jos alkio on joukossa ainakin yhden kerran, se on siinä keskimäärin kolme kertaa. Voit vastata kysymyksiin todellisen tai kuvitellun tietokoneen mukaan. (a) Kuinka paljon muistia kuluu alkion talletuskertaa kohden, jos tietorakenteeksi valitaan C++:n multiset? (b) Kuinka paljon muistia kuluu alkion talletuskertaa kohden, jos valitaan map, ja talletetaan alkiosta ja luvusta koostuvia pareja, missä luku kertoo alkion esiintymiskertojen määrän? (c) Minkälaisessa tilanteessa multiset on hyödyllinen? Vihje: etsi paperisesta suomenkielisestä sanakirjasta Watti tai puhelinluettelosta Wikström. 6 Algoritmien oikeaksi todistaminen 82. Anna oheisen ohjelman sisemmälle silmukalle invariantti. Ei tarvitse osoittaa, että se on pätevä. for i := 1 to n 1 do k := i for j := i+1 to n do if A[j].x < A[k].x then k := j apu := A[i]; A[i] := A[k]; A[k] := apu

MAT-71000 laskuharjoituksia AV 23.1.2015 16 83. (a) Miksi k;2 k < i : A[k 1].x A[k].x ei ole edellisen tehtävän ohjelman ulomman silmukan invariantti? (b) Anna edellisen tehtävän ohjelman ulommalle silmukalle invariantti. Ei tarvitse osoittaa, että se on pätevä. 84. Seuraavan ohjelman tehtävä on laskea polynomin n i=0 A[i]xi arvo tehokkaasti. Anna sille silmukkainvariantti ja osoita, että se on silmukkainvariantti. y := 0 for i := n downto 0 do y := x y +A[i] 85. Anna seuraavalle ohjelmalle silmukkainvariantti. Ei tarvitse osoittaa, että se on pätevä. { ( i;1 i < n : A[i] A[i+1] ) i : j;1 i < j n : A[i]+A[j] = x } a := 1; y := n while A[a]+A[y] x a < y do if A[a]+A[y] < x then a := a+1 else y := y 1 { A[a]+A[y] = x } 86. Tarkoittakoon #(A[a...y],x) (osa)taulukossa A[a...y] olevien alkioiden x määrää. Osoita seuraava ohjelma oikeaksi. Huomaa, että lsk ei välttämättä ole siihen mennessä kohdattujen oikeiden ja väärien alkioiden määrien erotus eikä sen vastaluku. { #(A[1...n], avain) > n 2 } lsk := 0 for i := 1 to n do if lsk = 0 then arvaus := A[i] if A[i] = arvaus then lsk := lsk+1 else lsk := lsk 1 { arvaus = avain } 87. Luentojen muunnettu binääripotenssi jää ikuiseen silmukkaan, kun n = 1. Muunna sitä edelleen niin, että se tuottaa silloin oikean vastauksen. 88. Risteykset on numeroitu 1,..., n. Alun perin P[i,j] sisältää risteyksestä i risteykseen j vievän tienpätkän pituuden tai erityisen arvon, jota merkitsemme, kertomaan, että tienpätkää ei ole. Suunnittele Θ(n 3 ) algoritmi, jonka lopetettua P[i, j] sisältää lyhimmän risteyksestä i risteykseen j vievän reitin pituuden. Algoritmin pääsilmukan kierroksen alussa P[i, j] sisältää lyhimmän sellaisen risteyksestä i risteykseen j vievän reitin pituuden, joka lukuunottamatta aloituskohtaa i ja lopetuskohtaa j ei kulje sellaisen risteyksen kautta, jonka numero on k tai enemmän. 89. Lasten pelissä jokainen pelaaja on aluksi ameeba. Pelaajat kiertelevät huoneessa sinne tänne. Kun kaksi ameebaa kohtaa, he heittävät lanttia. Sen voittaja

MAT-71000 laskuharjoituksia AV 23.1.2015 17 ylenee hiireksi ja häviäjä jää ameebaksi. Kun kaksi hiirtä kohtaa, he heittävät lanttia. Sen voittaja ylenee apinaksi ja häviäjä palaa ameebaksi. Samalla lailla kahden apinan kohdatessa toinen ylenee ihmiseksi ja toinen palaa ameebaksi. Ihmiset eivät jatka peliä. Osoita, että peli päättyy joskus. 90. Anna päättymätön kasvavassa suuruusjärjestyksessä oleva jono toinen toistaan pidempiä sanoja, joista mikään ei ole toisen aito alkuosa. 91. Laske seuraavat heikoimmat esiehdot. Taulukon A indeksialue on 1,..., n. (a) wp(i := i+1, 1 i n) (b) wp(x := y +2, x < y) (c) wp(x := a x, x a) (d) wp(a[1] := 3, 1 i n A[i] = 3) (e) wp(a[i] := 0, 1 i j n A[i] < A[j]) (f) wp(apu := A[i]; A[i] := A[j]; A[j] := apu, k;1 k < n : A[k] < A[k +1]) 92. Laske seuraavat heikoimmat esiehdot. Taulukon A indeksialue on 1,...,n ja A 0 sisältää taulukon A arvon juuri ennen lausetta. (a) wp(x := x 3, x 0 x 1) (b) wp(vaje := vaje 2 2b x 2 b+1 ; x := x+2 b, 0 vaje < x 2 b+1 +2 2b ) (c) wp( b := b 1 if x 2 b+1 +2 2b vaje then vaje := vaje 2 2b x 2 b+1 ; x := x+2 b, 0 vaje < x 2 b+1 +2 2b ) (d) wp(a[i] := A[i]+A[i 1], 1 < i n A[i] = i j=1 A 0[j]) (e) wp(a[i] := A[i]+A[i 1], 1 < i n A[i] = i j=1 A[j]) (f) wp(a[i] := A[i]+A[i 1], 1 < i n A[i] = i 1 j=1 A[j]) 93. Todista, että C (C wp(s 1,Q) C wp(s 2,Q)) jac ( C wp(s 1,Q)) (C wp(s 2,Q)) ovat yhtäpitävät. Propositiologiikka riittää tehtävän ratkaisemiseen. 94. Taulukko A indeksoidaan 1,..., n. Muuta puolitushaku sellaiseksi, että se löytää viimeisen kohdan, jossa A[i] x. Mitä sen pitää tehdä, jos x on pienempi kuin mikään A:n alkio? 95. Osoita, että oheinen ohjelma pysähtyy, ja että lopuksi n on lukujen n 0 ja m 0 suurin yhteinen tekijä.

MAT-71000 laskuharjoituksia AV 23.1.2015 18 { n = n 0 > 0 m = m 0 > 0 } while m > 0 do n := nmodm if n > 0 then m := mmodn else n := m; m := 0 96. Lisää luvun 6.5 kekoon toiminto, jolla voi muuttaa alkiota sen ollessa keossa. Toiminto ei saa perustua alkion poistamiseen ja uudelleen lisäämiseen. 7 (Moni)graafit 97. Määrittele matemaattisesti seuraavat graafiin liittyvät käsitteet. (a) Polku. Se on solmusta solmuun johtava, kaaria pitkin (kaarten suuntaisesti) kulkeva reitti. (b) Yksinkertainen polku. Se on polku, jossa mikään solmu ei toistu. (c) Silmukka. Se on polku, joka päättyy sinne, mistä se alkaa. (d) Yksinkertainen silmukka. Valitse sille edellisten kohtien kanssa johdonmukainen merkitys. 98. Olkoon V = {1,...,2n}. Kun 1 i < n, niin sekä solmusta 2i 1 että solmusta 2i on kaaret solmuihin 2i + 1 ja 2i + 2, ja sekä solmusta 2n 1 että solmusta 2n on kaaret solmuihin 1 ja 2. (a) Piirrä ko. graafi, kun n = 3. (b) Kuinka monta silmukkaa graafilla on (n:n funktiona)? (c) Kuinka monta sellaista silmukkaa graafilla on (n:n funktiona), jossa mikään solmu ei toistu? (Toistumiseksi ei lasketa sitä, että silmukan umpeutuessa tullaan takaisin solmuun, josta silmukka alkoi.) 99. Graafin Eulerin kierros on silmukka, joka käyttää jokaisen kaaren täsmälleen kerran. Suunnittele ihmisten suoritettavaksi sopiva menetelmä, joka löytää Eulerin kierroksen, jos graafissa on sellainen. 100. Voiko leveyteen ensin -haussa syntyä tilanne, jossa u on jonossa, u ja kaikilla v u pätee v.found = true? 101. Leveyteen ensin -haussa voi jonon Q sijaan käyttää kahta joukkoa Q 1 ja Q 2 siten, että ajoittain haku ottaa solmuja Q 1 :stä ja panee niiden löytämättömät seuraajat Q 2 :een, ja ajoittain tekee samaa Q 1 :n ja Q 2 :n roolit vaihdettuina. Joukkojen Q 1 ja Q 2 toteutuksella ei ole väliä. Solmujen poistamisen sijaan algoritmi voi selata Q 1 :n läpi ja sitten tyhjentää Q 1 :n. (a) Kirjoita pseudokoodi.

MAT-71000 laskuharjoituksia AV 23.1.2015 19 (b) Lisätään kolmas joukko Q 3. Oletetaan, että graafi on suuntaamaton ja käytettävissä on tehokkaat testit v Q 1, v Q 2 ja v Q 3. Muuta edellisen kohdan pseudokoodia siten, että solmuissa ei tarvita.found-kenttiä. Perustele, että ratkaisusi toimii oikein. 102. Graafin solmut ovat {(i,j) 1 i 3 1 j 3}. Solmusta (i,j) on kaari solmuun ((imod3)+1,j) ja solmuun (i,(jmod3)+1). Haku alkaa solmusta (1,1) ja tutkii solmusta lähtevät kaaret siinä järjestyksessä, kuin ne on mainittu edellä. (a) Missä järjestyksessä leveyteen ensin -haku löytää solmut? (b) Missä järjestyksessä syvyyteen ensin -haku löytää solmut? 103. Lisää rekursiiviseen syvyyteen ensin -hakuun lauseet, jotka tallettavat.prevkenttiin takaperin polun haun aloitussolmusta kuhunkin solmuun. 104. Suunnittele ajassa O( V + E ) toimiva algoritmi, joka joko kertoo, että opintojaksojen esitietoketjuissa on silmukka, tai luettelee opintojaksot sellaisessa järjestyksessä, että kun opintojakso mainitaan, sen kaikki esitiedot on jo mainittu. 105. Suuntaamattoman graafin katkossolmu on solmu, jonka ja johon liittyvien kaarten poistaminen jakaa graafin ainakin kahteen erilliseen osaan. Suunnittele ajassa O( V + E ) toimiva algoritmi, joka löytää katkossolmut. Vihje: käytä syvyyteen ensin -hakua ja numeroi solmut juoksevilla numeroilla sitä mukaa kuin haku löytää ne. Kun haku peruuttaa, se tuo pienimmän kohtaamansa numeron mukanaan kuitenkin siten, että haku ei katso numeroa siitä solmusta, josta nykyiseen solmuun alun perin tultiin. 106. Vertaa rekursiivisen ja yleisestä hausta tehdyn syvyyteen ensin -haun ajan ja muistin kulutuksia toisiinsa. 107. Osoita vastaesimerkillä, että yleinen haku pinolla ei tuota syvyyteen ensin -hakua, jos.next-mekanismin sijaan W:hen laitetaan u. 108. Suunnatun graafin (V, E) solmut jaetaan kahteen erilliseen joukkoon: jasolmuihin V ja tai-solmuihin V. (Siis V V = ja V V = V.) Lisäksi v 0 V. Tavoitteena on löytää osajoukkomielessä mahdollisimman pieni joukko solmuja U siten, että (1) v 0 U, (2) jos v U V niin v U, ja (3) jos v U V niin v U. Siis U:n pitää täyttää em. ehdot ja jos U U, niin U ei saa täyttää ehtoja. U:n alkioiden määrän ei tarvitse olla mahdollisimman pieni. (a) Osoita esimerkillä, että U ei välttämättä ole yksikäsitteinen. (b) Osoita esimerkillä, että haku, joka aloittaa v 0 :sta ja lisää solmuja seuraavasti ei välttämättä tuota oikeaa vastausta. Olkoon u sen löytämä solmu. Jos u V, se ottaa mukaan jokaisen v u. Jos u V, se katsoo, onko se jo ottanut mukaan ainakin yhden v u. Jollei se ole, se valitsee mielivaltaisen v u ja ottaa mukaan sen.

MAT-71000 laskuharjoituksia AV 23.1.2015 20 (c) Suunnittele ajassa O( V 2 + V E ) toimiva algoritmi, joka löytää (jonkin) oikean vastauksen. Vihje: se perustuu solmujen poistamiseen. Jos poistamisen seurauksena myös v 0 pitäisi poistaa, niin poistaminen perutaan. 109. Junilla matkustettaessa joskus tärkeintä ei ole päästä perille mahdollisimman varhain vaan minimoida matka-aikaa, johon lasketaan mukaan odotukset vaihtoasemilla mutta joka alkaa vasta ensimmäisen junan lähdöstä ja loppuu kun viimeinen juna saapuu perille. Muunna Dijkstran algoritmi ratkaisemaan tämä tehtävä. 110. Osoita, että jos prioriteettijonon toiminta perustuu vertailemiseen, niin Dijkstran algoritmia ei saa toimimaan nopeammin kuin O( V log V ). 111. Suunnittele graafeille esitys, joka mahdollistaa Dijkstran vahvojen komponenttien algoritmin toteuttamisen tehokkaasti. 8 Informaatioteoriaa 112. Ihmisen DNA-sekvenssissä on noin 3,23483 miljardia emäsparia (Wikipedia Human genome 3.4.2014). Emäspari on A T, T A, C G tai G C. Kuinka paljon muistia tarvitaan yhden ihmisen DNA-sekvenssin tallettamiseen? Riittääkö rekkaautollinen muistitikkuja? 113. Etsi Internetistä tietoa UTF-8-koodista. Onko se itserajaava? 114. Olkoon alkio kokonaisluku väliltä 0,..., 255. Joukossa sama alkio ei voi mutta monijoukossa voi esiintyä useasti. (a) Kuinka monta erilaista 2 alkion taulukkoa, 2 alkion joukkoa ja 2 alkion monijoukkoa on olemassa? (b) Kuinka paljon muistia joukko tarvitsee, jos se esitetään varaamalla yksi bitti mahdollista alkiota kohden niin että alkio on joukossa jos ja vain jos sen bitti on 1? (c) Enintään kuinka monen alkion joukko voidaan esittää edellisessä kohdassa tulokseksi saadulla muistin määrällä, jos esitystapana on alkioiden luetteleminen taulukossa? 115. Olkoon erilaisia alkioita m kappaletta. (a) Kuinka monta erilaista k alkion jonoa on olemassa? (b) Kuinka monta erilaista enintään n alkion jonoa on olemassa? (c) Kuinka paljon muistia enintään n alkion jonon esittämiseen vähintään tarvitaan, jos esitystavan muistin määrä ei riipu esitettävästä jonosta? (d) Kuinka paljon rengaspuskuri, jonka kapasiteetti on n, käyttää muistia?

MAT-71000 laskuharjoituksia AV 23.1.2015 21 (e) Olkoon rengaspuskurin kapasiteetti n. Kuinka monta eri esitystapaa on jonolla, jossa on k alkiota? 116. Osoita, että luennoilla esitetyssä lukujen koodissa(2n+1)-bittiset koodisanat esittävät luvut 2 n 1,...,2 n+1 2 ja että jokaiselle luonnolliselle luvulle on tasan yksi koodisana. 117. C++:n tekstialkioihin kuuluvat <, <<, <=, =, ==, >, >= ja >>. Ne käyttävät merkkejä <, = ja >. Ajatellaan välilyönti neljänneksi merkiksi. Merkin voi siis esittää kahdella bitillä. Laske Kraftin summa. Huomaatko mitään omituista, ja keksitkö omituisuudelle selityksen? 118. Verrataan kahta tapaa esittää joukko lukuja väliltä 0,..., 15. Yksinkertaisemmassa tavassa käytetään 16 bittiä. Bitin i arvo on 1 jos ja vain jos i kuuluu joukkoon. Monimutkaisemmassa tavassa käytetään 5 tai 17 bittiä. Jos ensimmäisen bitin arvo on 0, niin seuraavat 16 bittiä esittävät joukon yksinkertaisemmalla tavalla. Jos se on 1, niin joukossa on tasan yksi alkio, ja seuraavat 4 bittiä esittävät sen. (a) Kuinka monta erilaista joukkoa ko. luvuista on olemassa? (b) Kuinka monta bittiä monimutkaisempi esitystapa kuluttaa keskimäärin, jos jokainen joukko on yhtä todennäköinen? 119. Kirjainten esiintymistiheydet kymmenestuhannesosina Suomen kirjakielessä ovat oheisen taulukon mukaiset (Matti Pääkkönen, Kielikello 1/1991 s. 3). Laske Shannonin alaraja sille, kuinka monta bittiä vähintään tarvitaan kirjainta kohti. a i t n e s l k o u ä m 1190 1064 977 867 821 785 568 534 524 506 459 330 v r j h y p d ö g b f c w å q 252 232 191 183 179 174 85 49 13 6 6 4 1 0 0 120. Laadi Huffmanin koodi edellisen tehtävän esiintymistiheystaulukon pohjalta ja laske kirjaimen keskimäärin käyttämä bittimäärä. 121. Oletetaan, että positiivinen kokonaisluku i esiintyy todennäköisyydellä 2 i. Valitse esitystapa, joka vie keskimäärin mahdollisimman vähän muistia. 9 Tiedon pakkaus ja salaus 122. Suunnatun graafin solmut on numeroitu 1,..., V. Kukin luku esitetään yhdellä nelitavuisella sanalla. Kuinka paljon muistia kumpikin seuraavista esitystavoista vie V :n ja E :n funktiona? Missä tilanteissa tapa (b) käyttää vähemmän muistia?

MAT-71000 laskuharjoituksia AV 23.1.2015 22 (a) Tiedoston alussa on sana, jonka sisältö on V. Kukin kaari on ilmaistu kahdella sanalla, joista ensimmäinen ilmaisee alkupään solmun ja jälkimmäinen loppupään solmun. Tiedoston lopun ilmaisee sana, jonka sisältö on 0. (b) Tiedoston alussa on sana, jonka sisältö on V. Sen jälkeen on lueteltu niiden solmujen numerot, joihin solmusta 1 on kaari. Sitten on sana, jonka sisältö on 0. Sen jälkeen on lueteltu niiden solmujen numerot, joihin solmusta 2 on kaari. Sitten on sana, jonka sisältö on 0. Tämä toistuu jokaiselle solmulle. 123. Oletetaan, että LZW-pakkaajan muunnostaulukko kasvaa rajatta. Oletetaan, että syötteessä on n tavua, joiden arvo on 0, eikä mitään muuta. Kuinka paljon muistia pakattu tiedosto vie esitettynä n:n funktiona Θ-merkinnällä? 124. Oletetaan, että LZW-pakkaaja nollaa muunnostaulukon juuri ennen kuin k saisi arvon 13. Oletetaan, että syöte on hyvin pitkä ja siinä on vain 0-tavuja. Pakattu tiedosto koostuu siis jaksoista, joissa muunnostaulukko täyttyy ja sitten tulee nollauskoodi. Kuinka monta bittiä tällainen jakso sisältää ja kuinka monta syötteen bittiä se esittää? 125. Etsi netistä tai muilla keinoin, voidaanko kirjoittaa C++-ohjelma, joka ei lue syötettä eikä tiedostoja, ja joka tulostaa oman lähdekoodinsa ja sen perään /* Hei maailma! */. Äkkipäätä voisi ajatella, että ohjelman lähdekoodi ei voi mahtua itsensä sisään, mutta älä tyydy näin yksioikoiseen ajatukseen. 126. Etsi netistä tietoa DES-salausmenetelmistä. Kuinka pitkien avainten käyttöä nykyisin suositellaan? 127. Yhteydenottajan tunnistamiseen käytetään usein ns. haaste vaste-protokollaa: palvelin esittää yhteydenottajalle kysymyksen, johon luvallinen yhteydenottaja pystyy vastaamaan oikein mutta muut oletettavasti eivät. Pankkitunnusten lukuparit ovat arjesta tuttu esimerkki. Esimerkiksi lähimaksukorttien tapauksessa kummankin osapuolen on varmistuttava toisen osapuolen laillisuudesta. Silloin voidaan käyttää haaste vaste-protokollaa molempiin suuntiin. Osoita, että jos molempiin suuntiin käytetään samaa lukuparien taulukkoa, niin protokolla on murrettavissa erittäin helposti (paitsi jos protokollassa on erikseen varauduttu ko. hyökkäykseen). 10 Ratkeamattomuus ja laskennallinen vaativuus 128. Miksi Cantorin diagonalisointitodistuksessa kielletään päättymättömien 9- jonojen käyttö luettelossa? 129. Ratkeamattomien tehtävien olemassaolo voidaan todistaa suoraan tavalla, joka muistuttaa erityisen paljon Cantorin diagonalisointia. Sanomme, että syötettä lukematon pysähtymätön ohjelma on desimaalitulostin, jos ja vain jos se tulostaa 0, (siis nolla pilkku) ja sen perään loputtoman jonon numeromerkkejä. Oleta, että on olemassa ohjelma, jolla voi testata, onko merkkijono desimaalitulostin. Osoita,

MAT-71000 laskuharjoituksia AV 23.1.2015 23 että sen avulla desimaalitulostimet voi laittaa jonoon. Muodosta diagonalisoimalla desimaalitulostin, joka ei ole jonossa. Mikä tehtävä tuli osoitettua ratkeamattomaksi? 130. Oletetaan, että tietokoneessa on kaikki muisti, rekisterit, yms. huomioon ottaen n bittiä tallennustilaa. (a) Osoita, että jos tietokoneeseen voidaan kytkeä laite, joka laskee tietokoneen suorittamia askelia, ja jonka laskurissa on ainakin n+1 bittiä, niin voidaan selvittää, pysähtyykö ko. tietokone annetulla ohjelmalla ja syötteellä. (b) Perustele, että tämä lähestymistapa on epäkäytännöllinen jo melko pienillä n:n arvoilla, esim. n = 100. 131. Olkoon n-ratkaisija ohjelma, joka ratkaisee kysymyksen pysähtyykö annettu ohjelma annetulla syötteellä viimeistään n askeleen jälkeen. Luku n ei ole osa ratkaisijan syötettä, vaan kukin ratkaisija on tehty jollekin kiinteälle n:n arvolle. (a) Osoita, että jokaisella n N on olemassa n-ratkaisija. (b) Osoita, että jokaisella n-ratkaisijalla on syöte, jolla se joutuu itse suorittamaan melkein n askelta. Täsmällisemmin: on olemassa vakio c siten, että jokaisella n-ratkaisijalla on syöte, jolla se laskee vähintään n c askelta. 132. Tyhjän syötteen pysähtymistesterin olemattomuus voidaan todistaa myös seuraavasti. Tarkastellaan tietokoneohjelmaa P i, missä i N. Se muodostaa kaikki merkkijonot, joiden pituus on enintään i. Kullekin niistä se kokeilee tyhjän syötteen pysähtymistesterillä, onko ko. merkkijono tyhjällä syötteellä pysähtyvä ohjelma. Jos se on, P i ajaa sen. Sen tulosteet ovat osa P i :n tulosteita. Lopuksi P i tulostaa vielä jotain epätyhjää. Kunkin enintään i merkkiä pitkän pysähtyvän ohjelman tulostus on siis osa P i :n tulostusta ja eri kuin P i :n tulostus. (a) Miksi P i laitetaan lopuksi tulostamaan vielä jotain epätyhjää? (b) Ilmoita Θ-merkinnällä P i :n koko i:n funktiona olettaen, että i on esitetty P i :n sisällä numeromerkkien jonona. (c) Johda ristiriita. 133. Loogisessa kaavassa esiintyvä muuttuja x on sidottu jos ja vain jos se esiintyy osakaavassa muotoa x : ϕ tai x : ϕ. Muuttuja on vapaa jos ja vain jos se ei ole sidottu. Kaavan vapaat muuttujat ovat ikään kuin kaavan syöte. Esim. kaavassa y : y 2 = x muuttuja x on vapaa ja y on sidottu, ja kaava väittää, että x:llä on neliöjuuri. Oletetaan, että kaavat puhuvat luonnollisista luvuista. Sanomme, että yhden vapaan muuttujan kaava Q(i) on saatavissa kahden vapaan muuttujan kaavasta P(i,j), jos ja vain jos j : i : Q(i) P(i,j), toisin sanoen, jos ja vain jos sijoittamalla j:lle sopiva arvo P(i,j):ssä saadaan kaava, joka on yhtäpitävä Q(i):n kanssa. Esimerkiksi kaava, joka sanoo, että i on parillinen, on saatavissa kaavasta k : i = j k sijoittamalla j = 2. Osoita diagonalisoimalla, että ei ole olemassa kahden vapaan muuttujan kaavaa P(i,j) siten, että jokainen yhden vapaan muuttujan kaava on saatavissa siitä.