mikkoheino.fi

MAA11


Algoritmit ja lukuteoria (MAA11)

Laajuus

2 op


Yleiset tavoitteet (LOPS 2021)

Moduulin tavoitteena on, että opiskelija


Keskeiset sisällöt (LOPS 2021)


Aikataulu


Suoritus


Arviointi


Pisteet Arvosana Muuta
0 - 9 i \(\rightarrow\) K Pakko täydentää.
10 - 17 i \(\rightarrow\) 4 Oikeus täydentää.
18 - 25 5
26 - 33 6
34 - 41 7
42 - 49 8
50 - 57 9
58 - 60 10

Keskeyttäminen

Opettaja keskeyttää opiskelijan opintojakson, jos

Opettaja voi keskeyttää opiskelijan opintojakson, jos opiskelijalla on viisi poissaoloa. Tällaiset tilanteet opettaja käy läpi tapauskohtaisesti ja on ennen lopullista keskeytystä yhteydessä opiskelijaan.

Keskeyttämisestä opettaja merkitsee opintojaksosta opiskelijalle K-merkinnän Wilmaan ja poistaa opiskelijan sen jälkeen Wilman ryhmästä. Opettaja lähettää keskeyttämisestä viestin opiskelijalle, alaikäisen opiskelijan huoltajalle, ryhmänohjaajalle ja opolle.


Sivun alkuun.



1 LOGIIKKA


1.1 Peruskäsitteitä

Logiikka on tieteenala, jonka kiinnostuksen kohteena on päättely. Matemaattisessa logiikassa luonnollisen kielen lauseet käännetään formaalille kielelle.

Atomilauseita merkitään isoilla kirjaimilla. Konnektiivien avulla atomilauseista voidaan muodostaa yhdistettyjä lauseita.


Merkitseminen konnektiivien avulla

Merkintä Nimitys Lukutapa
\(\neg A\) \(A\):n negaatio ei \(A\)
\(A\wedge B\) \(A\):n ja \(B\):n konjunktio \(A\) ja \(B\)
\(A\vee B\) \(A\):n ja \(B\):n disjunktio \(A\) tai \(B\)
\(A\Rightarrow B\) \(A\):n ja \(B\):n implikaatio (seuraus) jos \(A\), niin \(B\)
\(A\Leftrightarrow B\) \(A\):n ja \(B\):n ekvivalenssi (yhtäpitävyys) \(A\), jos ja vain jos \(B\)


Huom.

Matematiikassa tai-sana (eli konnektiivi \(\vee\)) tulkitaan inklusiivisesti ''jompikumpi tai molemmat''.


Monimutkaisempia yhdistettyjä lauseita voidaan muodostaa käytämällä sulkeita ja sopimalla konnektiivien keskinäisestä järjestyksestä.

Konnektiivien suoritusjärjestys

1) Negaatiot \(\neg\)

2) Konjunktiot \(\wedge\) ja disjunktiot \(\vee\)

3) Implikaatiot \(\Rightarrow\)

4) Ekvivalenssit \(\Leftrightarrow\)


Esim. 1

Formalisoi seuraavat luonnollisen kielen lauseet.

a) Aurinko paistaa ja on kuuma.

b) Jos aurinko ei paista, niin ei ole kuuma.

c) Joko aurinko paistaa tai on kuuma (mutta ei molemmat).


Esim. 2

Olkoon \(A\): ''sataa'', \(B\): ''tuulee'' ja \(C\): ''on myrsky''.

Suomenna lause \(C\Leftrightarrow(A\wedge B)\).


Sivun alkuun.



1.2 Totuusarvo

Väitelausetta, joka on joko tosi tai epätosi, kutsutaan suljetuksi lauseeksi eli propositioksi.

Merkitään toden lauseen totuusarvoa 1 ja epätoden 0.


Totuustaulut

Negaatio
\(A\) \(\neg A\)
1 0
0 1

Konjunktio
\(A\) \(B\) \(A\wedge B\)
1 1 1
1 0 0
0 1 0
0 0 0

Disjunktio
\(A\) \(B\) \(A\vee B\)
1 1 1
1 0 1
0 1 1
0 0 0

Implikaatio
\(A\) \(B\) \(A\Rightarrow B\)
1 1 1
1 0 0
0 1 1
0 0 1

Ekvivalenssi
\(A\) \(B\) \(A\Leftrightarrow B\)
1 1 1
1 0 0
0 1 0
0 0 1

Esim. 1

Millä lauseiden \(A\) ja \(B\) totuusarvoilla lause \(\neg\left(A\vee B\right)\) on tosi?


Esim. 2

Formalisoi lause ''Jos on pilvistä, niin kala syö hyvin, tai ei ole pilvistä ja kala syö hyvin''. Milloin lause ei ole tosi?


Sivun alkuun.



1.3 Tautologia

Tautologia on lause, joka on aina tosi.


Esim. 1

Osoita, että niin kutsuttu modus ponens -päättely \(A\wedge\left(A\Rightarrow B\right)\Rightarrow B\) on tautologia.


Kontradiktio on lause, joka on aina epätosi.


Esim. 2

Tutki, onko lause ''Olen parhaimmillani täsmälleen silloin, kun en ole parhaimmillani.'' kontradiktio.


Loogisesti yhtäpitävillä eli loogisesti ekvivalenteilla lauseilla on sama totuusarvo.


Esim. 3

Ovatko lauseet ''Jos on pimeää, niin on yö.'' ja ''Jos ei ole yö, niin ei ole pimeää.'' loogisesti yhtäpitävät?


Sivun alkuun.



2 LUKUTEORIA


2.1 Kokonaislukujen jaollisuus

Jaollisuus

Kokonaisluku \(a\) on jaollinen positiivisella kokonaisluvulla \(b\), jos on olemassa kokonaisluku \(q\), jolla pätee \(a=bq\).


Merkintä:

Luku \(12\) on jaollinen luvulla \(4\) voidaan merkitä: \(4\mid12\).

Luku \(15\) ei ole jaollinen luvulla \(4\) voidaan merkitä: \(4\cancel\mid15\).


Esim. 1

Osoita, että

a) luku 63 on jaollinen luvulla 7

b) luku 54 ei ole jaollinen luvulla 8.


Jakoyhtälö

Olkoon \(a\) kokonaisluku ja \(b\) positiivinen kokonaisluku. Tällöin kaikilla \(a\) pätee jakoyhtälö $$a=bq+r,$$ missä \(q\) ja \(r\) ovat kokonaislukuja ja \(0 \leq r < b \).


Esim. 2

Kirjoita jakolaskun \(132:5\) jakoyhtälö.


Esim. 3

Kirjoita jakolaskun \(-132:5\) jakoyhtälö.


Sivun alkuun.



2.2 Suurin yhteinen tekijä

Tekijä

Positiivisen kokonaisluvun \(a\) tekijöitä ovat ne positiiviset kokonaisluvut, joilla luku \(a\) on jaollinen.


Suurin yhteinen tekijä

Positiivisten kokonaislukujen \(a\) ja \(b\) suurin yhteinen tekijä on suurin positiivinen kokonaisluku, jolla luvut \(a\) ja \(b\) ovat jaollisia.


Esim. 1

Määritä lukujen \(64\) ja \(36\) suurin yhteinen tekijä tekijöihin jakamalla.


Jakoyhtälö ja syt

Olkoot \(a\) ja \(b\) positiivisia kokonaislukuja. Oletetaan, että \(a=bq+r\), missä \(q\) ja \(r\) ovat positiivisia kokonaislukuja ja \(0< r< b\).

Tällöin pätee \(\text{syt}(a,b)=\text{syt}(b,r)\).


Eukleideen algoritmi

Olkoot \(a\) ja \(b\) positiivisia kokonaislukuja ja \(a>b\). Lukujen \(a\) ja \(b\) suurin yhteinen tekijä saadaan selville alla kuvatulla algoritmilla.

  1. Muodostetaan jakolaskun \(a:b\) jakoyhtälö \(a=bq_{1}+r_{1}\).
  2. Jos \(r_{1}>0\), niin muodostetaan jakolaskun \(b:r_{1}\) jakoyhtälö \(b=r_{1}q_{2}+r_{2}\).
  3. Jos \(r_{2}>0\), niin muodostetaan jakolaskun \(r_{1}:r_{2}\) jakoyhtälö \(r_{1}=r_{2}q_{3}+r_{3}\).
  4. Jatketaan algoritmin suorittamista, kunnes tulee \(r_{n-1}=r_{n}q_{n+1}+r_{n+1}\), missä \(r_{n+1}=0\) (jako menee tasan).

Viimeinen nollaa suurempi jakojäännös \(r_{n}\) on lukujen \(a\) ja \(b\) suurin yhteinen tekijä.


Esim. 2

Määritä lukujen suurin yhteinen \(261\) ja \(144\) suurin yhteinen tekijä Eukleideen algoritmilla.


Huom.

Murtoluku supistuu yksinkertaisimpaan muotoonsa, kun supistajana on osoittajan ja nimittäjän suurin yhteinen tekijä. Kääntäen, jos osoittajan ja nimittäjän ainoa yhteinen tekijä on 1, murtolukua ei voi supistaa.


Huom.

GeoGebralla suurin yhteinen tekijä voidaan määrittää komennoilla gcd(luku,luku) (greatest common divisor) tai syt(luku,luku).

Myös SpeedCrunchilla voidaan määrittää suurin yhteinen tekijä komennolla gcd(luku;luku) (huomaa erottimena puolipiste).


Sivun alkuun.



2.3 Pienin yhteinen monikerta

Pienin yhteinen monikerta

Positiivisten kokonaislukujen \(a\) ja \(b\) pienin yhteinen monikerta, pym (eli pienin yhteinen jaettava, pyj) on pienin positiivinen kokonaisluku, joka on jaollinen luvuilla \(a\) ja \(b\).


Lause

Olkoon \(a\) ja \(b\) positiivisia kokonaislukuja. Tällöin on voimassa $$\text{syt}(a,b)\cdot\text{pym}(a,b)=ab.$$


Esim.

Lavenna samannimisiksi \(\frac{1}{28}\) ja \(\frac{1}{56}\) nimittäjänä pienin mahdollinen positiivinen kokonaisluku.


Huom.

GeoGebralla pienin yhteinen monikerta voidaan määrittää komennoilla lcm(luku,luku) (least common multiple) tai pym(luku,luku).

SpeedCrunch ei määritä pienintä yhteistä monikertaa.


Sivun alkuun.



2.4 Kongruenssi

Olkoot \(a\) ja \(b\) kokonaislukuja ja \(n\) lukua yksi suurempi kokonaisluku.

Lukujen \(a\) ja \(b\) sanotaan olevan kongruentteja modulo \(n\), jos erotus \(a-b\) on jaollinen luvulla \(n\).

Toisaalta lukujen \(a\) ja \(b\) kongruenssi modulo \(n\) tarkoittaa, että jaettaessa luvut \(a\) ja \(b\) luvulla \(n\) saadaan sama jakojäännös \(r\).

Kongruenssi merkitään \(a\equiv b\ (\text{mod}\ n)\).


Esim. 1

Luvut \(18\) ja \(6\) ovat kongruentteja modulo \(4\) eli \(18\equiv 6\ \left(\text{mod}\ 4\right)\), koska \(18-6=12\) on jaollinen \(4\):llä, tai toisaalta lukujen \(18\) ja \(6\) yhteinen jakojäännös on \(2\), jos jakana on \(4\).


Jakojäännöksen kongruenssi

Jos jakolaskun \(a:n\) jakojäännös on \(r\), niin \(a\equiv r\ (\text{mod}\ n)\).


Esim. 2

Jakolaskun \(6:4\) jakojäännös on \(2\) eli \(6\equiv 2\ (\text{mod}\ 4)\).

Jakolaskun \(18:4\) jakojäännös on myös \(2\) eli \(18\equiv 2\ (\text{mod}\ 4)\).

Siten luvut \(18\) ja \(6\) ovat kongruentteja keskenään: \(18\equiv 6\ \left(\text{mod}\ 4\right)\).


Huom.

Kongruenssi modulo \(n\) luokittelee kokonaisluvut jäännösluokkiin jakojäännöksen \(0,1,2\ldots,n-1\) mukaan. Luvut, joilla \(n\):llä jaettaessa on sama jakojäännös, kuuluvat samaan luokkaan.


Esim. 3

a) Osoita, että \(289\equiv 25\ (\text{mod}\ 4)\).

b) Mikä on jakojäännös, kun luku \(289\) jaetaan \(4\):llä?

c) Mikä on pienin luonnollinen luku, jonka kanssa \(289\) on kongruentti modulo \(4\)?


Kongruenssin laskusääntöjä

Olkoon \(a\equiv b\ (\text{mod}\ n)\), \(c\equiv d\ (\text{mod}\ n)\) ja \(k\in\mathbb{Z}_{+}\).

1) \(a+c\equiv b+d\ (\text{mod}\ n)\)

2) \(ac\equiv bd\ (\text{mod}\ n)\)

3) \(a^{k}\equiv b^{k}\ (\text{mod}\ n)\)


Sivun alkuun.



2.5 Alkuluvut

Alkuluku

Alkuluku on lukua yksi suurempi luonnollinen luku, joka on jaollinen vain luvulla yksi ja itsellään.


Huom.

Alkulukua merkitään usein \(p\) ja alkulukujen joukkoa \(P\) (engl. prime number).

Lukua, joka ei ole alkuluku, kutsutaan yhdistetyksi luvuksi.


Esim. 1

Erastotheneen seula


Luvun osoittaminen alkuluvuksi

Luku \(n\) on alkuluku, jos se ei ole jaollinen millään alkuluvulla, joka on pienempi tai yhtä suuri kuin \(\sqrt{n}\).


Esim. 2

Tutki, onko luku 149 alkuluku.


Aritmetiikan peruslause

Jokainen lukua yksi suurempi kokonaisluku voidaan esittää alkulukujen tulona, ja kullekin luvulle on vain yksi tällainen esitys tekijöiden järjestystä lukuun ottamatta.


Esim. 3

Jaa luku 210 alkutekijöihin.


Huom.

GeoGebralla luvun alkutekijähajotelma saadaan komennoilla factor(luku) tai JaaTekijöihin(luku).


Esim. 4

Määritä alkutekijähajotelman avulla lukujen \(7560\) ja \(8400\) syt ja pym.


Sivun alkuun.



3 ALGORITMINEN AJATTELU


3.1 Algoritmi

Algoritmi on niin tarkka kuvaus tai ohje jonkin tietyn prosessin suorittamisesta, että sitä seuraamalla prosessi saadaan suoritetuksi. Ohjelmoinnissa algoritmi kirjoitetaan tietokoneohjelmaksi, jotta kone voi suorittaa prosessin automaattisesti.

Algoritmi voidaan kuvailla sanallisesti esimerkiksi pseudokoodina tai esittää vuokaaviona.


Esim.

Suunnittele ohjelma, joka kysyy käyttäjältä syntymävuoden, lukee sen ja laskee ja tulostaa tiedon siitä, kuinka monta vuotta käyttäjä tänä vuonna täyttää. Laadi ohjelmasta pseudokoodi ja vuokaavio.

Ratkaisu:


Sivun alkuun.



3.2 Ohjelmointi

Tällä opintojaksolla käytetään Python-ohjelmointikieltä. Ohjelmat kirjoitetaan Abitin (YTL:n ylläpitämä) verkosta löytyvässä ympäristössä cheat.abitti.fi. Valmiin ohjelman voi kopioida leikepöydälle ja liittää tekstimuotoisena oppikirjan tehtävän vastauskenttään.


Ohjelmointikielillä on syntaksi aivan kuten luonnollisillakin kielillä. Syntaksi määrittää, miten kieltä kirjoitetaan oikein.

Pythonin syntaksin piirteitä:


Funktiot

Funktioilla suoritetaan erilaisia toimenpiteitä.

Pythonin funktioita ovat mm.


Muuttujat

Muuttujien avulla kerätään ohjelman käsittelemää tietoa. Ohjelmoija määrittää muuttujat itse syntaksin puitteissa.

Muuttajan arvot voivat olla erityyppisiä. Pythonissa muuttujan tyyppi voidaan määrittää mm. funktioilla


Esim. 1

Kirjoita ohjelma, joka kysyy käyttäjältä nimen ja tulostaa tervehdyksen ''Hei, nimi!''.

Koodi:

1 nimi=input("Kirjoita nimesi.")

2 print("Hei,", nimi,"!")


Operaattorit

Operaattorien avulla muodostetaan laskutoimituksia, suoritetaan vertailua ja yhdistetään lausekkeita.


Esim. 2

Kirjoita ohjelma, joka kysyy käyttäjältä syntymävuoden, lukee sen ja laskee ja tulostaa tiedon siitä, kuinka monta vuotta käyttäjä tänä vuonna täyttää.

Koodi:

1 vuosi=int(input("Anna syntymävuotesi."))

2 print("Täytät tänä vuonna", 2024-vuosi,"vuotta.")


Esim. 3

Kirjoita ohjelma, joka laskee ja ilmoittaa jakolaskun 5:3 tuloksen kahden desimaalin tarkkuudella.

Koodi:

1 #Tehdään muuttuja ja määritetään sen arvoksi jakolasku 5:3.

2 luku=5/3

3 #Tulostetaan vastaus 2 desimaalin tarkkuudella.

4 print(round(luku,2))


Sivun alkuun.



3.3 Valintarakenteet

Ohjausrakenne määrittää ohjelman lauseiden suoritusjärjestyksen. Ohjausrakenteita ovat:


Valintarakenteiden avulla ohjelma voidaan määrittää suorittamaan tietty ohjelman osa vain, jos jokin ehto toteutuu. Ehtoja voidaan esittää vaikkapa vertailuoperaattorien avulla.


Python-ohjelmointikielen valintarakenteita ovat:


Huom.

Python-ohjelmointikielen syntaksissa samaan lohkoon kuuluvat ohjelman rivit määritetään sisentämällä ne samaan tasoon.


if-rakenne

Rakenne vastaa luonnollisen kielen rakennetta: "Jos ehto x toteutuu, niin tapahtuu y.''

Ohjelmaksi kirjoitettuna rakenne testaa, onko ehto tosi. Jos ehto on tosi, ohjelma suorittaa ehdon alle kirjoitetun sisennettyjen lauseiden lohkon ja jatkaa seuraavasta sisentämättöstä rivistä. Jos ehto ei ole tosi, ohjelma jatkaa suoraan seuraavaan sisentämättömään riviin.


Esim. 1

Kirjoita ohjelma, joka kysyy käyttäjältä kokonaisluvun ja tutkii, onko luku positiviinen. Jos luku on positiivinen, ohjelma tulostaa ''Luku on positiivinen.''. Lopuksi ohjelma tulostaa ''Loppu.'' merkiksi ohjelman suorittamisesta loppuun.

Koodi:

1 luku=int(input("Anna kokonaisluku."))
2 if luku>0:
3   print("Luku", luku ,"on positiivinen.")
4 print("Loppu.")


if – else -rakenne

Rakenne vastaa luonnollisen kielen rakennetta: "Jos ehto x toteutuu, niin tapahtuu y. Muutoin tapahtuu z.''

Ohjelmaksi kirjoitettuna rakenne testaa, onko ehto tosi. Jos ehto on tosi, ohjelma suorittaa ehdon alle kirjoitetun sisennettyjen lauseiden lohkon. Jos ehto ei ole tosi, ohjelma siirty else-alkuisen rivin alle kirjoitetun sisennettyjen lauseiden lohkon suorittamiseen. Tämän jälkeen ohjelma jatkaa seuraavasta sisentämättömästä rivistä.


Esim. 2

Kirjoita ohjelma, joka kysyy käyttäjältä kaksi kokonaislukua ja tutkii niiden suuruusjärjestystä. Jos ensimmäinen luku on suurempi, ohjelma tulostaa vertailun käyttäen > -merkkiä. Muutoin ohjelma tulostaa vertailun <= -merkillä. Lopuksi ohjelma tulostaa ''Loppu.'' merkiksi ohjelman suorittamisesta loppuun.

Koodi:

1 luku1=int(input("Anna kokonaisluku."))
2 luku2=int(input("Anna toinen kokonaisluku."))
3 if luku1>luku2:
4   print(luku1 ,">", luku2)
5 else:
6   print(luku1, "<=", luku2)
7 print("Loppu.")


Valintarakenteita voidaan kirjoittaa sisäkkäin ja siten testata useita yhtä aikaa voimassa olevia ehtoja taikka useita ehtoja, jotka eivät ole voimassa yhtä aikaa.


Esim. 3

Kirjoita ohjelma, joka kysyy käyttäjältä kokonaisluvun ja tutkii, onko luku positiivinen, nolla vai negatiivinen. Sitten ohjelma ilmoittaa tuloksen. Lopuksi ohjelma tulostaa ''Loppu.'' merkiksi ohjelman suorittamisesta loppuun.

Koodi:

1 luku=int(input("Anna kokonaisluku."))
2 if luku>0:
3   print("Luku", luku, "on positiivinen.")
4 else:
5   if luku<0:
6     print("Luku", luku, "on negatiivinen.")
7   else:
8     print("Luku", luku, "ei ole positiivinen eikä negatiivinen.")
9 print("Loppu.")


if – elif – else -rakenne

Rakenteella voidaan testata useita peräkkäisiä ehtoja, jotka eivät ole yhtä aikaa voimassa.

Ohjelmaksi kirjoitettuna rakenne testaa, onko ehto tosi. Jos ehto on tosi, ohjelma suorittaa ehdon alle kirjoitetun sisennettyjen lauseiden lohkon. Jos ehto ei ole tosi, ohjelma siirtyy testaamaan kunkin elif-alkuisen rivin ehdon. Jos mikään elif-alkuisista ehdoista ei ole tosi, ohjelma testaa else-alkuisen rivin ehdon. Tämän jälkeen ohjelma jatkaa seuraavasta sisentämättömästä rivistä.


Esim. 5

Kirjoita ohjelma, joka tiedustelee käyttäjältä opintojakson pistemäärän ja kertoo käyttäjälle pistemäärää vastaavan arvosanan. Käytä tehtävässä tämän opintojakson pistemäärä-arvosanataulukkoa.

Koodi:

1  luku=int(input("Anna pistemäärä."))
2  if luku>=58:
3    print("Pistemäärää", luku, "vastaava arvosana on 10.")
4  elif luku>=50:
5    print("Pistemäärää", luku, "vastaava arvosana on 9.")
6  elif luku>=42:
7    print("Pistemäärää", luku, "vastaava arvosana on 8.")
8  elif luku>=34:
9    print("Pistemäärää", luku, "vastaava arvosana on 7.")
10 elif luku>=26:
11   print("Pistemäärää", luku, "vastaava arvosana on 6.")
12 elif luku>=18:
13   print("Pistemäärää", luku, "vastaava arvosana on 5.")
14 elif luku>=10:
15   print("Pistemäärää", luku, "vastaava arvosana on 4.")
16 else:
17   print("Pistemäärää", luku, "vastaava arvosana on K.")
18 print("Loppu.")


Python-ohjelmointikielessä ehtoja voidaan yhdistää logiikan konnektiiveja vastaavilla loogisilla operaattoreilla.


Esim. 6

Kirjoita ohjelma, joka kysyy käyttäjältä lukuparin x ja y arvot, lukee ne ja ilmoittaa, mihin koordinaatiston neljännekseen lukuparia vastaava koordinaattipiste kuuluu.

Koodi:

1  x=int(input("Anna luku x:"))
2  y=int(input("Anna luku y:"))
3  if x>0 and y>0:
4    print("Piste (", x,",",y, ") kuuluu koordinaatiston 1. neljännekseen.")
5  elif x<0 and y>0:
6    print("Piste (", x,",",y, ") kuuluu koordinaatiston 2. neljännekseen.")
7  elif x<0 and y<0:
8    print("Piste (", x,",",y, ") kuuluu koordinaatiston 3. neljännekseen.")
9  elif x>0 and y<0:
10   print("Piste (", x,",",y, ") kuuluu koordinaatiston 4. neljännekseen.")
11 else x=0 or y=0:
12   print("Piste (", x,",",y, ") on koordinaattiakselilla.")
13 print("Loppu.")


Sivun alkuun.



3.4 Toistorakenteet

Python-ohjelmointikielen toistorakenteita ovat:


while-rakenne

Python-ohjelmointikielessä on esiehtoinen toistorakenne, while, joka toistaa while-alkuisella rivillä olevan ehdon alle kirjoitettua sisennettyjen rivien lohkoa niin kauan, kuin ehto on tosi. (Python-ohjelmointikielessä ei ole loppuehtoista toistorakennetta.)


Esim. 1

Kirjoita ohjelma, joka tulostaa positiiviset kokonaisluvut annetusta positiivisesta kokonaisluvusta alaspäin.

Koodi:

1 luku=int(input("Anna positiivinen kokonaisluku:"))
2 while luku>0:
3   print(luku)
4   luku=luku-1


Huom.

Edellinen esimerkki voitaisiin toteuttaa myös käyttäen Python-ohjelmointikielen sijoitusoperaattoreita.


Esim. 2

Kirjoita ohjelma, joka tiedustelee käyttäjältä kaksi lukua ja selvittää niiden suurimman yhteisen tekijän Eukleideen algoritmin avulla.

Koodi:

1  print("Ohjelma määrittää kahden kokonaisluvun suurimman yhteisen tekijän Eukleideen algoritmin avulla:")
2  luku1=int(input("Anna ensimmäinen luku:"))
3  luku2=int(input("Anna toinen luku:"))
4  if luku1<luku2:
5    print("Ensimmäisen luvun on oltava suurempi kuin toisen.")
6  else:
7    jakoj=1
8    lukua=luku1
9    lukub=luku2
10   while jakoj!=0:
11     osam=lukua//lukub
12     jakoj=lukua%lukub
13     print(lukua,"=",lukub,"*",osam,"+",jakoj)
14     lukua=lukub
15     lukub=jakoj
16   print("Lukujen",luku1,"ja",luku2,"suurin yhteinen tekijä on:",lukua)


Huom.

Edellisen esimerkin suurin yhteinen tekijä voitaisiin määrittää myös käyttäen math-moduulin gcd()-komentoa. Muita Python-ohjelmointikielen moduuleita on vaikkapa random-moduuli.


for-rakenne

Python-ohjelmointikielessä for-rakenne on toistorakenne, jossa toistojen määrä määräytyy ennakolta.


Merkkijono osoitetaan Python-ohjelmointikielessä lainausmerkeillä. Lista (vrt. lukujono) merkitään hakasulkeiden [ ] sisään. Toistorakenteella for voidaan tulostaa merkkijonon merkit tai listan alkiot (luvut) yksi kerrallaan seuraavasti:


Esim. 1

Kirjoita ohjelma, joka tulostaa sanan abiturientti kirjaimet yksi kerrallaan.

Koodi:

1 merkkijono="abiturientti"
2 for kirjain in merkkijono:
3   print(kirjain)


Esim. 2

Kirjoita ohjelma, joka tulostaa kokonaisluvut yhdestä neljään.

Koodi:

1 lista=[1,2,3,4]
2 for luku in lista:
3   print(luku)


Listan paikkanumerointi eli indeksointi alkaa Python-ohjelmointikielessä luvusta 0.


Esim. 3

Kirjoita ohjelma, joka tulostaa listan kolmannen luvun.

Koodi:

1 lista=[1,2,3,4]
2   print([2])


Huom.

Listan alkiot voivat olla lukujen lisäksi myös merkkijonoja tai listoja listan sisällä.


Python-ohjelmointikielessä for-rakennetta voidaan ohjata funktion range(alkuarvo,loppuarvo,askel) avulla.


Esim. 4

Kirjoita ohjelma, joka tulostaa parilliset kokonaisluvut nollasta kymmeneen.

Koodi:

1 for n in range(0,11,2):
2   print(n)


Huom.


Sivun alkuun.



3.5 Lukujärjestelmät

Käytössämme oleva lukujärjestelmä on kymmenjärjestelmä eli desimaalijärjestelmä. Järjestelmä on paikkajärjestelmä, jonka kantaluku on \(10\). Kaikki luvut voidaan ilmaista kymmenen numeromerkin \((0,1,2,3,4,5,6,7,8,9)\) avulla. Numeron paikka luvussa ilmaisee paikkaa vastaavan kymmenpotenssin lukumäärän. Luku on näiden kymmenpotenssien summa.


Esim. 1

$$2\ 834{,}15=2\cdot10^{3}+8\cdot10^{2}+3\cdot10^{1}+4\cdot10^{0}+1\cdot10^{-1}+5\cdot10^{-2}$$


Ihmiskunnan historiassa on ollut käytössä erilaisia lukujärjestelmiä, joissa lukujen merkitsemistapa ja myös kantaluku ovat vaihdelleet. Lukujärjestelmän kantaluku voidaankin valita vapaasti. Nykyään erityisesti tietoteknisissä sovelluksissa hyödynnetäänkin kaksi- eli binääri-, kahdeksan- eli oktaali- ja kuusitoista- eli heksadesimaalijärjestelmiä.


Kaksijärjestelmässä kantaluku on kaksi ja luvut ilmaistaan numeromerkeillä \(0\) ja \(1\).


Esim. 2

a) Muunna kaksijärjestelmän luku \(1011\) kymmenjärjestelmän luvuksi.

b) Muunna kymmenjärjestelmän luku \(19\) kaksijärjestelmän luvuksi.


Huom.

Esimerkin 2 b-kohdan muunnos voidaan suorittaa laskemalla jakoyhtälöiden jakojäännökset. Viimeinen jakojäännös on luvun ensimmäinen numero, toiseksi viimeinen toinen jne.


Kahdeksanjärjestelmässä luvut ilmaistaan numeromerkeillä \(0,\dots,7\) ja kuusitoistajärjestelmässä numeromerkeillä \(0,\dots,9\) sekä kirjaimilla \(A,\dots,F\).


Esim. 3

Kuusitoistajärjestelmässä lukua kymmenen vastaa \(A_{16}\), lukua \(15_{10}\) vastaa \(F_{16}\) ja lukua \(16_{10}) vastaa \(10_{16}\) jne.


Sivun alkuun.



3.6 Numeerinen ratkaiseminen

Aina ei ole keinoa selvittää yhtälön ratkaisulle tarkkaa arvoa. Yhtälön ratkaisun likiarvo voidaan kuitenkin määrittää numeerisesti


Puolitusmenetelmä

Puolitusmenetelmä perustuu Boltzanon lauseeseen, jonka mukaan jatkuvalla funktiolla on suljetulla välillä ainakin yksi nollakohta, jos funktion arvot välin päätepisteissä ovat erimerkkiset.


Esim.

Määritetään funktion \(f(x)=3x-2^{x}\) välillä \(\left[0,1\right]\) olevan nollakohdan likiarvo yhden desimaalin tarkkuudella taulukoimalla.

$$ \begin{array}{l|l|l} \text{Funktion arvo}&\text{Väli}&\text{Välin keskipiste}\\ \hline f(0)=-1\lt0&&\\ f(1)=1\gt0&\left]0,1\right[&0{,}5\\ f(0{,}5)=0{,}085\ldots\gt0&\left]0;0{,}5\right[&0{,}25\\ f(0{,}25)=-0{,}439\ldots\lt0&\left]0{,}25;0{,}5\right[&0{,}375\\ f(0{,}375)=-0,171\ldots\lt0&\left[0{,}375;0{,}5\right[&0{,}4375\\ f(0{,}4375)=-0{,}041\ldots\lt0&\left]0{,}4375;0{,}5\right[&0{,}46875\\ f(0{,}46875)=0{,}022\ldots\gt0&\left]0{,}4375;0{,}46875\right[&0{,}453125\\ f(0{,}453125)=-0{,}009\ldots\lt0&\left]0{,}453125;0{,}46875\right[& \end{array} $$

Viimeisen välin päätepisteet pyöristyvät yhden desimaalin tarkkuudella samaan lukuun \(0{,}5\). Siis nollakohta on \(x\approx0{,}5.\)


Kiintopistemenetelmä

Kiintopistemenetelmä perustuu iterointiin. Iterointi tarkoittaa saman toimenpiteen toistamista aina uudelleen.

Muuttujan arvoa \(x=a\), jolla funktion arvo on \(f(a)=a\), kutsutaan funktion \(f\) kiintopisteeksi.

Kiintopistemenetelmällä voidaan löytää muotoa \(x=f(x)\) olevan yhtälön ratkaisu \(x=a\), mikäli funktion kuvaaja ei ole kiintopisteen kohdalla liian jyrkkä ja alkuarvo iteroinnille valitaan riittävän läheltä kiintopistettä.


Esim.

Etsi kiintopistemenetelmällä yhtälön \(x^{3}-2x-7=0\) ainoalle ratkaisulle kaksidesimaalinen likiarvo käyttämällä alkuarvoa \(x_{1}=2\).


Sivun alkuun.