Kevät 20 pitkän matikan tehtävä 12.2 GeoGebralla

[edit 23.3. Lisäsin tarinan loppuun pari eri tapaa ratkaista tehtävän ja kuvan pisteistä.]

Kevään 20 pitkän matikan tehtävässä piti selvittää luonnollisiin lukuihin liittyvä lukumäärälasku. Tämähän on meille ATKnörteille simppeli ohjelmointiongelma.


Jollain ”oikealla” ohjelmointikielellä tuo taitaa olla muutaman rivin ohjelma. Ratkaistaan 2.-kohta GeoGebralla. Tässä tulee 100*100 lukua eli ei kannata käyttää CASia, veikkaan, että kone hyytynee. Käytetään Algebra-ikkunaa. Teenpä tämän GeoGebra 6:lla ihan testatakseni miten se toimii. Kokeilin tätä GG 5:llä ja tehtävä ratkesi ihan OK, mutta ohjelma alkoi himpun verran jumittaa koska listan koko on 10000.

Komento

Jono(Jono(sqrt(a b), a, 1, 100), b, 1, 100)

tuottaa listan matriisin m1. GeoGebra 5:ssä Algebraikkunassa matriisi näkyy matriisin näköisenä, GG6:ssa voi arvata, että se on matriisi sillä alussa näkyy kaksi kaarisulkua. Toisaalta sisäkkäiset Jono-komennot tuottavat aina matriiseja. Matriisin m1 pituus (eli oikeasti m1 listan pituus saadaan komennolla

Pituus(m1)
-> 100

tuottaa luvun a = 100. Matriisin sisällä olevat ”turhat” kaarisulkeet saa pois Tiivistä-komennolla

Tiivistä(m1)

tuottaa listan l1, jonka pituus on

b = Pituus(l1)
-> 100

Selvitetään, mikä näistä luvuista on luonnollinen luku. Ehto

floor(luku) == luku

antaa tulosteeksi true, jos luvun kokonaisosa on yhtäsuuri kuin luku itse eli onko luku kokonaisluku. Käydään läpi kaikki luvut listassa l1 ja tutkitaan mitkä ovat luonnollisia lukuja

l2 = Zip(Jos(floor(aa) == aa, aa), aa, l1)
-> {1, ?, ?, 2, ?, ...

Nuo kysymysmerkit vastaavat niitä lukuja, joilla ehto ei ole voimassa. Poistetaan määrittelemättömän lista oliot eli nuo kysymysmerkit komennolla

l3 = PoistaMäärittelemätön(l2)
-> {1, 2, 3, 4, ...
c = Pituus (l3)
-> 310

Kysytty todennäköisyys on

d = c/b

-> 31/1000

GeoGebra 6:ssa isojen listojen käsittely tuntuu sutjakkaammalta kuin GeoGebra 5:ssä. Tosin molemmissa ohjelmissa ratkaisu onnistui MacBookissani.

Lisäys 22.3.20

En malttanut olla kokeilematta paria muuta tapaa. Idea tuli Edwardilta Facebookista.

m2 = Jono(Jono(Jos(floor(sqrt(a b)) ≟ sqrt(a b), 1, 0), a, 1, 100), b, 1, 100)

tuottaa lista, matriisin, jossa on paljon nollia ja ykkösiä.

l5=Summa(m2)

tuottaa lista, jossa on vaakarivien summat {10, 7, …

Summa(l5) = 310

Toisaalta yhdellä rivillä

Jono(Jono(Jos(floor(sqrt(a b)) ≟ sqrt(a b), 1, 0), a, 1, 100), b, 1, 100) = 310

Jos olisi halunnut nuo pisteet koordinaatistoon, niin sen saa komennolla

Jono(Jono(Jos(floor(sqrt(a b)) ≟ sqrt(a b), (a, b)), a, 1, 100), b, 1, 100)

Carrollin taikatempun tutkistelua

Edellisessä tarinassani https://mikonfysiikka.wordpress.com/2019/12/17/lewis-carrollin-taikatemppu/ kerroin Lewis Carrollin taikatempusta. Tempussa valitaan jokin salainen luonnollinen luku a. Sen jälkeen luvulle suoritetaan erilaisia laskutoimituksia, näiden lopputulokset ovat b, c, …, h ja i. Taikurille kerrotaan alkuperäisen luvun a ja kolmannen c luvun parillisuudesta ja saatu viimeinen luku i. Taikuri pystyy parin laskutoimituksen avulla päättelemään alkuperäisen luvun a.

Ongelman määrittely

Minua kiinnostaa onko ongelma yksikäsitteinen siinä mielessä, että tuottaako taikatempun algoritmi yksikäsitteiset lopputulokset. Tietysti minua kiinnostaa myös millaisen kuvan saan aikaiseksi kolmiulotteiseen avaruuteen. Jos olet jaksanut lukea edes tähän saakka, niin  ymmärrät, että tämä menetelmä ei ole matemaattinen todistus, tässä tutkitaan ”kokeellisesti” matemaattista ilmiötä.

Merkitään alkuperäisen luvun n jakojäännöstä kahdella jaettaessa aa:lla ja luvun c (eli kolmas luku taikatempussa, kun ensimmäinen luku on n) jakojäännöstä kahdella jaettaessa cc:llä. Olkoon N luonnollisten lukujen joukko ja joukko CC algoritmin tuottamien pisteiden (aan, ccn, in) joukko, missä n on luonnollinen luku..

Haluan siis tietää vastaako jokaista luonnollista lukua n, joukon CC:n piste (in, aan, ccn) ja päinvastoin eli onko kuvaus N -> CC bijektio.

Satunnaisuus

Taikatempussa on vaiheita, jossa voidaan valita eri lukuja tyyliin

  • Jos b on
    • pariton, niin lisää joko 5 tai 9. Jaa luku kahdella ja lisää 1. Annetaan luvun nimeksi c.
    • parillinen, niin vähennä siitä 2 tai 6, jaa luku kahdella ja sitten lisää 29 tai 33 tai 37. Annetaan luvulle nimeksi c.

Yksinkertaistan ongelmaa siten, että jätän eri vaihtoehtojen tutkimisen tulevaan artikkeliin, niinpä valitsen taikatempun vaihtoehdoista aina pienimmän luvun tässä tarinassa. Eli edellinen kohta on tässä jutussa:

  • Jos b on
    • pariton, niin lisää 5. Jaa luku kahdella ja lisää 1. Annetaan luvun nimeksi c.
    • parillinen, niin vähennä siitä 2, jaa luku kahdella ja sitten lisää 29. Annetaan luvulle nimeksi c.

Suunnitelma

Ajatuksena on tuottaa GeoGebra 6:lla (onnistuu myös GeoGebra 5:llä ja GeoGebra 3D:llä) sovellus, jossa luodaan funktio c7(x), joka laskee taikatempun algoritmin tuottaman lopullisen luvin i. Koska GeoGebrassa ei voi rajoittaa lähtöjoukkoa vain luonnollisiksi luvuiksi, pitää ottaa huomioon kaikki reaaliluvut x ≥ 0. Tuotetun funktion ja lukujen a ja c parillisuuden avulla tuotetaan taulukkolaskennan avulla 3D pisteet. Nämä yhdistetään janoilla alkuperäisiin a arvoihin. Näin saadaan kuva kuvauksesta.

Kirjoitan komennot GeoGebra 6:n syöttökenttään.

Parillisuusfunktio

GeoGebralla voidaan luvun n parillisuus selvittää käyttämällä jakojäännöstä komennolla mod(n, 2). Esimerkiksi mod(13, 2) antaa tulokseksi 1.

Valitettavasti komento mod(x, 2) ei tuota funktiota. Niinpä tarvitsen funktion, joka antaa arvoksi 0, jos annetun luvun kokonaisosa on parillinen ja 1 jos se on pariton. Funktion luonti onnistuu käyttämällä floor-komentoa, joka tuottaa arvoksi luvun kokonaisosan. Esimerkiksi floor(13.6) tuottaa arvoksi 13. Muutaman kokeilun jälkeen havaitsin, että seuraava toimii. Määritellään syöttökentässä funktio

paril(x) = floor(2 (x / 2 - floor(x / 2)))
Kuva, joka sisältää kohteen sisä, shoji

Kuvaus luotu automaattisesti

Carroll-funktio

Muutetaan taikatempun laskutoimitukset funktioiksi. Ohjeen resepti b tuottaa funktion c1(x) ja c vastaavasti c2(x) ja niin edelleen. Viimeinen kohta ohjeessa eli i on funktio c7(x). Kirjoitetaan syöttökenttään komennot:

c1(x) = 3 x
c2(x) = Jos(paril(c1(x)) == 1,(c1(x)+5)/(2)+1,(c1(x)-2)/(2)+29)
c3(x) = 3 c2(x)
c4(x) = Jos(paril(c3(x)) == 1,(c3(x)+5)/(2)+1,(c3(x)-2)/(2)+29)
c5(x) = (x+19)*10+c4(x)
c6(x) = floor(c5(x)/7)
c7(x) = floor(c6(x)/7)

GeoGebra sieventää sisäkkäisten funktioiden lausekkeet, näin ollen funktion c7 lauseke on aika monimutkaisen näköinen.

Kuva, joka sisältää kohteen näyttökuva

Kuvaus luotu automaattisesti

Tietysti kuvaajakin on aika eksoottinen.

3D-pisteet taulukkolaskennalla

Lasketaan muutamia funktion c7 arvoja luonnollisilla luvuilla. Samalla lasketaan ensimmäisen luvun a ja kolmannen luvun c eli funktion c2 arvojen parillisuus. Teen tämän taulukkolaskennalla, jotta näen luvut rinnakkain, näin minun on helpompi pohdiskella lukujen yhteyksiä toisiinsa.

Kirjoitetaan taulukkolaskennan soluihin A1, …, A4 otsikot: ”x”, aparil, c2paril ja ”c7”. Kirjoitetaan soluun A2 luku 0 ja soluun A3 luku 1. Valitaan alue A2:A3 ja luodaan sarake luonnollisia lukuja 0, …, 50 kahvasta vetämällä. Soluihin B2, …, B4 kirjoitetaan kaavat:

=paril(A2)
=paril(c2(A2))
=c7(A2)

Valitaan alue B2:B4 ja monistetaan kaavat alaspäin kahvalla vetämällä.

Tuota taulukkoa tutkiskelemalla voi pohdiskella millainen säännönmukaisuus lukujonoilla on. Palaan tähän asiaan luultavasti tulevassa artikkelissa.

3D-kuvaajaa varten luodaan kaksi pistelistaa. Aluksi kannattaa valita Piirtoalueen asetuksista Nimeäminen: Nimeäminen pois. Näin pisteiden nimet eivät tule näkyviin 3D piirtoalueelle.  Valitaan alue B2:D32 ja Luo lista -työkalua painamalla valitaan työkalu Luo pistelista. Annetaan listalle nimeksi l1.

Kun testasin komentoja GeoGebra3D:llä, jossa ei ole taulukkolaskentaa käytössä, niin loin l1-listan Jono-komennolla:

l1=Jono((paril(nn),paril(c2(nn)),c7(nn)),nn,0,30)

Luvut 0, …, 30 saadaan pisteiksi 3D-avaruuteen kirjoittamalla syöttökenttään

l2 = Jono((n, 0, 0), n, 0, 30)

Luodaan janat muuttujan arvojen pisteiden ja niiden arvoja vastaavien pisteiden välille. Eli periaatteessa hahmotetaan kuvausta n -> (aan, ccn, in).

Tämän tyyppinen asia kannattaa tehdä Zip-komennolla, toki jono-komennollakin janojen piirto onnistuu.

l3 = Zip(Jana(n, m), n, l1, m, l2)

3D-piirtoalueelle ilmestyvät janat pistelistojen alkioiden välille. Akseleiden skaalausta saa muutettua painamalla Vaihto-näppäimen pohjaan ja vetämällä koordinaattiakseleista. Kuviota saa liikutettua tasossa Vaihto-näppäintä pohjassa siirtelemällä.

Vaikuttaa siltä, että jokaista luonnollista lukua n vastaa yksikäsitteinen piste taikatempun funktioiden tuottama piste (aan, ccn, in). Ja myös päinvastoin, eli jokaista (aan, ccn, in) pistettä vastaa yksikäsitteinen luonnollinen luku n.

Jätän asian täsmällisen matemaattisen todistamisen lukijalle.

Lähteet

Edellinen artikkelini aiheesta: Lewis Carrollin taikatemppu https://mikonfysiikka.wordpress.com/2019/12/17/lewis-carrollin-taikatemppu/

Futility Closet artikkeli: A Late Carroll Game https://www.futilitycloset.com/2019/07/14/a-late-carroll-game/

GeoGebra 3D -appletti liu’un avulla tuotettuna : https://www.geogebra.org/3d/fsa27rx7

Tämän artikkelin esimerkki GeoGebra 6:lla: https://www.geogebra.org/m/zpbkxeh9