Kokeellista matematiikkaa SAGE:lla



Samankaltaiset tiedostot
ISSN-L ISSN (Painettu) ISSN (verkkojulkaisu) edimensio on MAOLin sähköinen lehti. Julkaisija: Matemaattisten aineiden

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

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin perusteet Y Python

Matematiikan tukikurssi, kurssikerta 1

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Matematiikan tukikurssi

Matematiikassa väitelauseet ovat usein muotoa: jos P on totta, niin Q on totta.

Ohjelmoinnin perusteet Y Python

58131 Tietorakenteet ja algoritmit (syksy 2015)

LUKUTEORIA A. Harjoitustehtäviä, kevät (c) Osoita, että jos. niin. a c ja b c ja a b, niin. niin. (e) Osoita, että

Todistusmenetelmiä Miksi pitää todistaa?

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Matematiikan ja tilastotieteen laitos Matematiikka tutuksi Harjoitus 2, malliratkaisut

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

4.3. Matemaattinen induktio

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

plot(f(x), x=-5..5, y= )

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Ohjelmoinnin perusteet Y Python

Harjoitus 3 -- Ratkaisut

Lukuteoria. Eukleides Aleksandrialainen (n. 300 eaa)

Ohjelmoinnin perusteet Y Python

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

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

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Matematiikan tukikurssi

Ohjelmoinnin peruskurssien laaja oppimäärä

B. 2 E. en tiedä C ovat luonnollisia lukuja?

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

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Python-ohjelmointi Harjoitus 5

Ohjelmoinnin perusteet Y Python

Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa 1. Lähdetään sieventämään epäyhtälön vasenta puolta:

Diskreetin matematiikan perusteet Malliratkaisut 2 / vko 38

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin perusteet Y Python

Funktio 1. a) Mikä on funktion f (x) = x lähtöjoukko eli määrittelyjoukko, kun 0 x 5?

Jokaisen parittoman kokonaisluvun toinen potenssi on pariton.

} {{ } kertaa jotain

Matematiikan tukikurssi

LUKUTEORIA johdantoa

Tee konseptiin pisteytysruudukko! Muista kirjata nimesi ja ryhmäsi. Lue ohjeet huolellisesti!

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Matematiikan peruskurssi 2

Ohjelmoinnin peruskurssi Y1

Matemaatiikan tukikurssi

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Matematiikan pohjatietokurssi

Matematiikan tukikurssi, kurssikerta 2

MATP153 Approbatur 1B Ohjaus 2 Keskiviikko torstai

Diskreetin Matematiikan Paja Ratkaisuhahmotelmia viikko 1. ( ) Jeremias Berg

Alkulukujen harmoninen sarja

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

KERTAUS KERTAUSTEHTÄVIÄ K1. P( 1) = 3 ( 1) + 2 ( 1) ( 1) 3 = = 4

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

Yhtäpitävyys. Aikaisemmin osoitettiin, että n on parillinen (oletus) n 2 on parillinen (väite).

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

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

b) Määritä/Laske (ei tarvitse tehdä määritelmän kautta). (2p)

Matematiikan mestariluokka, syksy

Johdatus diskreettiin matematiikkaan (syksy 2009) Harjoitus 3, ratkaisuja Janne Korhonen

Osoitin ja viittaus C++:ssa

MS-A010{3,4} (ELEC*) Differentiaali- ja integraalilaskenta 1 Luento 3: Jatkuvuus

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

811120P Diskreetit rakenteet

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Matemaattisen analyysin tukikurssi

Kuinka määritellään 2 3?

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

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

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

Datatähti 2019 loppu

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Vastausehdotukset analyysin sivuainekurssin syksyn välikokeeseen

Transkriptio:

Kokeellista matematiikkaa SAGE:lla Tutkin GeoGebralla 1 luonnollisen luvun jakamista tekijöihin 2. GeoGebran funktio Alkutekijät jakaa luvun tekijöihin ja tuottaa alkutekijät listana. GeoGebrassa lista esitetään kaarisulkujen {lista} avulla. Alla mustalla Courier-fontilla oleva teksti on GeoGebran Syöttökenttään kirjoitettu teksti ja sininen Algebra-ikkunaan ilmestyvä arvo. Alkutekijät[42] lista1 = {2, 3, 7} Listan jäsenet voi laskea yhteen Summa-funktiolla. Summa[lista1] a=12 Toistetaan laskutoimituksia eteenpäin eli iteroidaan ja katsotaan mitä tapahtuu. Alkutekijät[12] lista2 = {2, 2, 3} Summa[lista2] b = 7 Alkutekijät[7] lista3 = {7} Koska 7 on alkuluku iterointi jää jumiin lukuun 7. Kuva 1 GeoGebran objektiluettelo Näin voidaankin alkaa tutkia mitä tahansa luonnollista lukua ja pohtia mihin iterointi päättyy. Kun keksin tämän leikin, niin työmatkallani sain ajan kulumaan kun yritin laskea päässä eri luvun alkutekijöiden summia. Tosin autoillessa pitää kiinnittää huomio myös ajamiseen. Tarkempi määrittely voisi olla vaikka seuraava. Toki ensin pitäisi todistaa, että jokaisella x:n arvolla iterointi päättyy siten, että sama luku toistuu. Laitan tässä tarinassa laatikkoon sellaiset kohdat, jotka vaativat lukijalta ongelmanratkaisua. Todista, että edellä esitetty iterointi päätyy jossain vaiheessa tilanteeseen, että sama luku toistuu. 1 http://www.geogebra.org 2 http://www.geogebratube.org/material/show/id/25106 1

Määritelmä: Olkoon x ykköstä suurempi luonnollinen luku ja f(x) = luvun x alkutekijöiden summa. Määritellään jono a = a 1,a 2,... ( ) seuraavasti: a 1 = x a n+1 = f ( a n ),kun n > 1 Funktio mr(x) = a n,kun a n = a n+1. Tutkitaan GeoGebralla mr-funktiota muutamalla luvulla. Kuva 2 mr-funktion arvoja GeoGebralla Näin ollen mr(2) = 2 mr(3) = 3 mr(4) = 4 mr(5) = 5 mr(6) = 5 Tuntuu siltä, että lukua 4 lukuunottamatta mr -funktion arvot tulevat olemaan alkulukuja. Jätetään tämän asian perustelu todistettavaksi lukijalle. Funktion tutkimista SAGE:lla GeoGebralla on aika vaikeata tutkia tällaista funktiota ohjelmallisesti. Niinpä päätin käyttää SAGE-ohjelmaa 3 apuna 4. SAGE on ilmainen Python-ohjelmointikielellä toimiva matemaattinen ohjelma. Katsotaan aluksi muutama esimerkki SAGE:n funktioista. Alla mustalla Courier-fontilla ovat SAGE-ohjelmaan kirjoitettuja syötteitä ja siniset SAGE:n laskemia tulosteita. 3 http://sagemath.org 2

factor(42) 2 * 3 * 7 SAGE:n factor-funktio tuottaa tekijät kertolaskumuodossa. prime_factors(42) [2, 3, 7] prime_factors(18) [2, 3] Prime_factors-funktio näyttäisi hyvältä, mutta se ei kerro tekijöiden lukumäärää. list(factor(42)) [(2, 1), (3, 1), (7, 1)] Sagen list-funktion avulla factor tulostuu lista, jonka jäseninä ovat tekijät ja niiden lukumäärät Python-kielen tuple-tyyppisinä olioina. Tällä tavalla saadaan tekijöiden summa laskettua ohjelmallisesti. Määritellään ensin apufunktio f, joka laskee luvun tekijöiden summan. Esimerkiksi: f(42) = 2 1 + 3 1 + 7 1 = 12. def f(luku): summa = 0 lista = list(factor(luku)) for i in lista: summa = summa + i[0]*i[1] return summa SAGE:ssa ohjelmat ja funktiot määritellään def-komennon avulla. Kahdella ensimmäisellä rivillä luodaan apumuuttujat summa ja lista. Kolmannella rivillä luodaan silmukka, jonka avulla listan alkioiden tekijät kerrotaan lukumäärällä ja lasketaan yhteen. Esimerkiksi jos tutkittava luku on 18 niin ohjelma toimii seuraavasti: f(18) luku = 18 summa = 0 lista = [(2, 1), (3, 2)] for-silmukassa i = (2, 1) #listan [(2, 1), (3, 2)] nollas alkio #huomaa, että SAGE indeksöi listan alkiot #alkaen nollasta i[0] = 2 #tuplen (2, 1) nollas jäsen i[1] = 1 summa = 0 + 2 1 = 2 i = (3, 2) i[0] = 3 i[1] = 2 summa = 2 + 3 2 = 8 return(8) = 8 #return palauttaa funktion arvoksi 8. Lasketaan muutamia arvoja. 3

for j in range(2, 11): print j, f(j) 2 2 3 3 4 4 5 5 6 5 7 7 8 6 9 6 10 7 Pythonin range(alku, loppu)-funktio luo listan, jonka ensimmäinen alkio on alku ja viimeinen loppu 1. Luodaan lopullinen mr-funktio käyttämällä while-silmukkaa. SAGE:ssa erisuuruus merkitään vertailuissa!= -merkeillä. Tässä luotetaan siihen, että iterointi päättyy jossain vaiheessa. def mr(n): eka = n toka = f(n) while eka!= toka: eka = toka toka= f(eka) return(eka) Katsotaan miten SAGE laskee kun suoritetaan mr(18). mr(18) n = 18 eka = 18 toka = f(18) = 8 eka toka eka = 8 toka = f(8) = 6 eka toka eka = 6 toka f (6) = 5 eka toka eka 5 toka 5 eka = toka return(5) Kuvaajia ja ongelmia Tehdään lista, jossa on luetteloitu (x, f(x)). SAGE:ssa kommetti merkitään #-merkillä. def tulostuslistaksi(n): lista = [] for i in range(2, n): #range tuottaa listan [2, 3,, n-1] lista.append((i,mr(i))) #metodi append lisää listan loppuun return(lista) print tulostuslistaksi(51) [(2, 2), (3, 3), (4, 4), (5, 5), (6, 5), (7, 7), (8, 5), (9, 5), (10,7), (11, 11), (12, 7), (13, 13), (14, 5), (15, 5), (16, 5), (17, 17),(18, 5), (19, 19), (20, 5), (21, 7), (22, 13), (23, 23), (24, 5), (25, 7), (26, 5), (27, 5), (28, 11), (29, 29), (30, 7), (31, 31), (32, 4

7), (33, 5), (34, 19), (35, 7), (36, 7), (37, 37), (38, 7), (39, 5), (40, 11), (41, 41), (42, 7), (43, 43), (44, 5), (45, 11), (46, 7), (47, 47),(48, 11), (49, 5), (50, 7)] Listasta nähdään, että kun x > 4 niin f:n arvot ovat alkulukuja. Ja tietysti f(x) = x kun x on alkuluku. Tulostetaan lista koordinaatistoon scatter_plot(tulostuslistaksi(100), marker = ".") Kuva 3 mr-funktion arvoja Kuvaajasta nähdään, että osa pisteistä näyttäisi olevan lähes samalla suoralla. Lisätään kuvaan muutamia suoria muotoa y = x, missä n saa arvoja [1, 2,, 8] n scatter_plot(tulostuslistaksi(100), marker = ".") + plot([x/n for n in [1..8]], (1,100)) Kuva 4 mr-funktio suorien kanssa Lisätään pisteitä. 5

Kuva 5 1000 pistettä Kuva 6 10000 pistettä Vaikuttaa siltä, että suorien y = x n läheisyyteen osuu vähän pisteitä jos n > 1 on pariton ja x on riittävän suuri. Miksi? Luodaan seuraavaksi lista, jossa on pelkät f:n arvot. def tulostuslista(n): lista = [] for i in range(2, n): lista.append(mr(i)) return(lista) arvot = tulostuslista(100) arvot = [0,0]+arvot arvot [0, 0, 2, 3, 4, 5, 5, 7, 5, 5, 7, 11, 7, 13, 5, 5, 5, 17, 5, 19, 5, 7, 13, 23, 5, 7, 5, 5, 11, 29, 7, 31, 7, 5, 19, 7, 7, 37, 7, 5, 11, 41, 7, 43, 5, 11, 7, 47, 11, 5, 7, 5, 17, 53, 11, 5, 13, 13, 31, 59, 7, 61, 5, 13, 7, 5, 5, 67, 7, 5, 5, 71, 7, 73, 5, 13, 23, 5, 5, 79, 13, 6

7, 43, 83, 5, 13, 11, 7, 17, 89, 13, 5, 5, 19, 5, 5, 13, 97, 5, 17] Alkuun lisättiin kaksi nollaa, jotta seuraavassa kuvaajassa x-akselin arvot menevät oikein. bar_chart(arvot) Kuva 7 Pylväskaavio mr:n arvoista Periaatteessa tämä ei tuo lisäinformaatiota, mutta opin piirtämään pylväsdiagrammin. Luodaan lista, jossa on pisteinä funktion kahden peräkkäiset arvot tyyliin (f(x), f(f(x)). arvot=tulostuslista(1000) perakkaiset=[] for i in range(len(arvot)-1): perakkaiset.append((arvot[i],arvot[i+1])) Tässä len(arvot) on arvot-listan pituus (1000) ja range(len(arvot)-1) luo indeksöintiä varten listan[0, 1, 2,, 998]. Listassa on 999 alkiota, jotta viimeisellä ei mentäisi liian pitkälle. perakkaiset [(2, 3), (3, 4), (4, 5), poistetaan välistä muutama (13, 997), (997, 5), (5, 7)] line(perakkaiset) 7

Kuva 8 Viivat peräkkäisistä scatter_plot(perakkaiset, marker = ".") Kuva 9 Peräkkäiset pisteinä Lisätään muutama suora. 8

scatter_plot(perakkaiset, marker = ".")+ plot([n*x for n in [1..4]], (1,220)) Vaikuttaa siltä, että parillisilla n:n arvoilla pisteitä sattuisi lähelle suoria y = nx. Miksi? Jätetään seuraavaksi alkuluvut pois funktion alkuarvoista. Primes() on alkulukujen joukko. def tulostuslistaksi(n): P = Primes() lista = [] for i in range(2, n): if not i in P: lista.append((i,mr(i))) return(lista) ilmanalkulukuja = tulostuslistaksi(100) ilmanalkulukuja [(4, 4), (6, 5), (98, 5), (99, 17)] Piirretään alkuluvut pystyakselille. Koska P muuttuja on määritelty funktion sisällä, se pitää määritellä uudestaan. P = Primes() scatter_plot(ilmanalkulukuja, marker = ".") + plot([p.unrank(n) for n in [1..15]],(0,100)) 9

Kuva 10 Arvojoukko ilman alkulukuja lähtöjoukossa Tietysti kaikki arvot sattuvat alkulukujen kohdalle kun x > 4. Luvun 29 kohdalle ei satu yhtään f:n arvoa, kun alkuluvut on jätetty pois alkuarvoista. Tässä vaiheessa alkaa kiinnostaa osuuko jokaisen alkuluvun kohdalle jokin mr-funktion arvo. Väitteeni on, että tietysti sinne osuu. Jokainen alkuluku, joka on suurempi kuin 4 voidaan esittää kahden tai useamman alkuluvun summana, vai voiko? Riittääkö edellisen virkkeen todistaminen osoittamaan, että mr:n arvojoukko (kun määrittelyjoukossa ei ole alkulukuja) sisältää kaikki kolmosta suuremmat alkuluvut. Kuva 11 Enemmän pisteitä ilman alkulukuja määrittelyjoukossa Luodaan lista nimeltä arvot, siinä on alkioina funktion mr arvot kun alkuarvoista on poistettu alkuluvut. 10

def arvotlistaksi(n): P = Primes() lista = [] for i in range(2, n): if not i in P: lista.append(mr(i)) return(lista) arvot = arvotlistaksi(100000) Listataan alkuluvut ja totuusarvo, jos alkuluku on arvot-listassa. P.unrank-funktion avulla saa alkuluvut. Esimerkissä ensimmäinen ja 42. alkuluku (Sagen mielestä nollas ja 41. alkuluku). P = Primes() P.unrank(0) 2 P.unrank(41) 181 for i in range(2, 1000): print P.unrank(i), P.unrank(i) in arvot WARNING: Output truncated! full_output.txt 5 True 7 True 11 True... 1361 False... 7901 False 7907 True 7919 False Kun testataan 100 000:lla mr:n arvolla ja 1 000 ensimmäisellä alkuluvulla, niin ensimmäinen alkuluku, jolla väittämä ei pidä paikkaansa on 1361. Miljoonalla mr:n alkuarvolla ja 10 000 ensimmäisellä alkuluvulla, ensimmäinen luku, joka ei toteuta väittämää on 8923. arvot = arvotlistaksi(1000000) for i in range(2, 10000): if not P.unrank(i) in arvot: print P.unrank(i), P.unrank(i) in arvot WARNING: Output truncated! 8923 False 8999 False 11

Lisää pohdittavaa Kuinka pitkiä ovat f-funktion iteraatiot? Todista, että jokainen alkuluku voidaan esittää alkulukujen summana. Riittääkö edellisen lauseen todistaminen todistamaan että mr-funktio on hyvin määritelty, eli että jokaisella x:n arvolla f-funktion iteraatio päätyy silmukkaan, jossa sama luku toistuu. Todista, että jokainen luku voidaan esittää alkulukujen summana. Kuinka monta alkulukua tarvitaan, että jokainen alkuluku voidaan esittää niiden summana. Esimerkiksi 5 = 2 + 3 eli tarvitaan kaksi alkulukua mutta 11 = 7 + 2 + 2 = 5 + 3 + 5 eli tarvitaan kolme alkulukua. Riittääkö kolme alkulukua vai tarvitaanko jollekin alkuluvulle enemmän? Miten tilanne muuttuu, jos käytetään f-funktion määrittelyssä luvun alkutekijöitä siten, että summaan hyväksytään vain eri alkuluvut? 18 = 2 3 3 ja f(18) = 2 + 3 = 5. Mitä jos tekijöihin mukaan otetaan luku yksi? 18 = 1 2 3 3 ja f(18) = 1 + 2 +3 + 3 = 9. SAGE SAGE on ladattavissa osoitteesta http://sagemath.org. Tiedosto on reilut 500 Mt ja asentaminen MacOS ja Linux käyttöjärjestelmille on suhteellisen helppoa. Windows vaatii VirtuaBox-ohjelmiston, joten asennus on hankalahkoa. Helpointa on kokeilla SAGE:a Try SAGE Online sivustolla. Kirjautumisen jälkeen SAGE-palvelimelle voi tallentaa omia tiedostoja. SAGE käyttää käyttöliittymänä selainta. SAGE on Python kielen murre tai paremminkin matemaattinen laajennus. Siinä on valtava määrä funktioita matematiikan eri osa-alueilta. Opiskelun apuna voi käyttää Jussi Pekka Kasurisen Python 3 ohjelmointi kirjaa (Dodenco 2009 tai ilmaista Finch, Sage Beginner s Guide, Packt 2011. Jälkimmäinen löytyy myös ilmaiseksi verkosta http://tinyurl.com/b6x7ccb. Tietysti World Wibe Webistä löytyy valtavasti lisämateriaalia SAGE:n opiskeluun ja tämänkin tarinan ongelmien ratkaisemisen avuksi. Lopuksi Tämä tarina ja sen uudemmat versiot ja tarinaan liittyvä SAGE-tiedosto löytyy blogistani osoitteessa http://hylblog.edu.hel.fi/wpmu/mrahikka/2013/02/19/kokeellistamatematiikkaa-sagella-tarina/ 12