maanantai 27. toukokuuta 2019

9999 potenssiin 9999

Silmiini osui tehtävä, jossa piti selvittää, kuinka monta numeroa on luvussa $9999^{9999}$ ja mitkä ovat kolme ensimmäistä numeroa. Ilmeisestikin kyseessä logaritmien harjoittelu ja käytettävissä laskin tai vastaava tietokoneohjelma.

Samantyyppisiä tehtäviä lienee aina käytetty logaritmien harjoittelemiseen. Klassikossa, K. Väisälän algebran kirjassakin on tehtävä, jossa kysytään luvun $9^{9^9}$ numeroiden lukumäärää. Tuolloin ei ollut laskimia, ainoastaan viisidesimaaliset logaritmitaulut.  Näilläkin tehtävän saattoi ainakin melkein ratkaista, numeroita oli noin 370 miljoonaa.  Paljon tarkempaan ei ollut mahdollista päästä eikä ensimmäisten numeroiden selvittämiseenkään tarkkuus riittänyt.

Potenssi $9999^{9999}$ on vaatimattomampi kuin $9^{9^9}$ ja ensimmäiseksi tekee mieli koettaa, selvittäisiinkö ilman logaritmeja, yksinkertaisesti laskemalla kokonaislukupotenssi suoraan normaalilla ohjelmiston aritmetiikalla. GeoGebralle ja TI-Nspirelle luku on liian suuri, GeoGebra antaa kysymysmerkin, TI-Nspire $\infty$-symbolin ja varoituksen ylivuodosta.

Mathematica sen sijaan laskee luvun ja antaa pitkän jonon numeroita. Näiden lukumäärän laskeminen olisi ikävä tehtävä, mutta tarkoitukseen on valmis funktio IntegerLength, jolla tulokseksi saadaan 39996 numeroa. Kolme ensimmäistä ovat 367. Mathematicaan pohjautuva verkossa toimiva Wolfram|Alpha ei anna suoraan kaikkia numeroita, mutta kertoo niiden lukumäärän. Onko enää tarpeen miettiäkään logaritmeja, jos laskentaohjelmien kapasiteetti kasvaa näinkin suureksi?

Jos kuitenkin käytetään logaritmeja, kannattaa aluksi laskea potenssin logaritmi muodosta $9999\lg(9999)$, missä $\lg$ tarkoittaa kymmenkantaista (Briggsin) logaritmia. GeoGebra antaa tulokseksi $39995.57$. Tämän kokonaisosa $39995$ on logaritmin ns. karakteristika.  Tämä on yhtä pienempi kuin luvun numeroiden määrä, joka siis on 39996. Desimaaliosa $0.57$ on logaritmin mantissa, jonka avulla saadaan luvun numeroiden alkupää. Tämä perustuu hajotelmaan
\[ 9999^{9999} = 10^{39995.56\dots} = 10^{39995} \cdot 10^{0.56\dots}. \]
GeoGebra kuitenkin tuottaa pienen yllätyksen: $10^{0.57} = 3.72$, mutta jos talletetaan muuttujaan alkuperäinen logaritmi, $s = 9999\lg(9999)$, ja lasketaan $10^{s-39995}$, saadaankin $3.68$. Ovatko oikeat alkupään numerot siis 372 vai 368?

Lasku GeoGebralla

TI-Nspirellä käy suurin piirtein samoin.

Selityksenä on, että ohjelmistojen numeerisessa laskennassa on käytössä huomattavasti enemmän desimaaleja kuin käyttäjälle normaalisti näytetään. Tarkkuuden säilyttämiseksi kannattaa siis tallettaa välitulokset muistiin eikä kopioida niitä uudelleen näytön mukaisina. Tämäkään ei poista kaikkia virheitä, koska laskennassa kuitenkin käytetään rajallista desimaalimäärää (tai oikeastaan bittimäärää). Jossakin tilanteessa virhe tulee aina esiin.

Olisiko logaritmien lisäksi jotakin muuta tapaa suoriutua tehtävästä, jos laskentaväline ei suoriudu suurista luvuista ilman ylivuotoa? Kantaluvun $9999$ voi skaalata jakamalla sen $10000$:lla. Tällöin syntyy luku $0.9999$, jonka korottaminen potenssiin $9999$ ei aiheuta ylivuotoa. Tulos on $0.36789\dots$, mikä antaa ensimmäiset numerot. Numeroiden lukumäärä saadaan kertomalla tämä skaalauksen takia tekijällä $10000^{9999} = 10^{39996}$.

Mitä kaikesta tästä — ja paljosta muusta vastaavasta — pitäisi oppia? Ohjelmisto on ensisijaisesti laskentaväline olipa kyse numeerisesta tai symbolisesta laskennasta. Se toimii omilla ehdoillaan eikä aina siten, kuin matemaattisessa mielessä pitäisi. Laskentaväline myös vaikuttaa siihen, millaista matematiikkaa on järkevää käyttää. Esimerkiksi logaritmitaulut ja ohjelmistot edellyttävät erilaista näkökulmaa.

maanantai 6. toukokuuta 2019

Kuution pyörittelyä

Linkki liikkuvaan kuvaan

xy-tason pistettä $(x,y)$ voi kiertää origon ympäri kulman $w$ verran kertomalla pystyvektoriksi kirjoitetut koordinaatit kiertomatriisilla matriisitulomielessä:
\[
\begin{pmatrix}\cos(w) & -\sin(w) \\ \sin(w) & \phantom{-}\cos(w)\end{pmatrix}
\begin{pmatrix}x \\ y\end{pmatrix}\ .
\]
Kuvion kiertäminen tapahtuu kiertämällä periaatteessa sen jokainen piste, mutta esimerkiksi neliötä kierrettäessä riittää kiertää sen kärkipisteet ja piirtää kierretty neliö näiden avulla.

Mikä olisi kaksiulotteisen kierron kolmiulotteinen vastine? Kiertokeskuksena oleva origo on tällöin korvattava origon kautta kulkevalla kiertoakselilla, jonka ympäri kierretään kulman $w$ verran. Tällöinkin kierto voidaan kuvata matriisilla, joka nyt on kokoa $3 \times 3$.

Matriisi saadaan suhteellisen helposti, jos käytettävissä on riittävästi matriisilaskentaa tukeva symbolinen ohjelma. Jos kiertoakselin yksikön pituinen suuntavektori on $\vec{n} = n_1\vec{i} + n_2\vec{j} + n_3\vec{k}$, muodostetaan matriisi
\[
N = \begin{pmatrix} 0 & -n_3 & n_2 \\ n_3 & 0 & -n_1 \\ -n_2 & n_1 & 0 \end{pmatrix}.
\]
Eksponenttifunktio voidaan määritellä myös matriiseille ja kiertomatriisi saadaan tämän avulla:
\[ Q = \exp(wN),
\] missä $w$ on kiertokulma.

Matriisieksponenttifunktio voidaan määritellä eksponenttifunktion tavanomaisen sarjakehitelmän avulla:
\[
\exp(A) = \sum_{k=0}^\infty \frac{A^k}{k!}.
\]
Tässä potenssit $A^k$ tarkoittavat matriisituloja ja sarjan suppeneminen täytyy luonnollisesti osoittaa. Symboliset ohjelmat eivät kuitenkaan laske matriisieksponenttifunktion arvoja tästä määritelmästä, vaan matriisien ominaisarvoteoria antaa siihen paremmat mahdollisuudet.

Alla oleva lasku näyttää kiertomatriisin laskemisen Mathematicalla tarkkoja arvoja käyttäen. Graafisiin demonstraatiotarkoituksiin on kuitenkin luonnollisempaa käyttää numeerista laskentaa, ts. riittävän tarkkoja likiarvoja.


Mathematica — kuten monet muutkin kehittyneet ohjelmat — tarjoavat mahdollisuuden laatia animaatioita ja säädettäviä demonstraatioita niin ilmiön kuin sitä kuvaavan koodin tutkimiseen: katso kuvakaappausta artikkelin alussa ja linkin takana olevaa liikkuvaa kuvaa.

Matemaattisen tekstin lukijan on syytä olla hereillä ja aina hieman epäluuloinen. Mistä tiedetään, että menettely todella antaa kiertomatriisin? Onko selvää, että kolmiulotteisella kierrolla on aina akseli, kuten edellä ohimennen oletettiin? Jos kuutiota jotenkin pyöräyttelee, niin pääseekö alkuasennosta loppuasentoon aina yhdellä sopivan suuruisella kierrolla sopivan akselin ympäri? Työkaluiksi tarvitaan melkoinen annos matriisilaskentaa. Alaan perehtynyt lukija voi kokeilla taitojaan.