Aapo Rantalainen's blog

Experiences with Information Technology and Open source

Matemaattinen valehtelu

Posted by Aapo Rantalainen on September 9, 2011

Suomeksi ja englanniksi on helppo valehdella, mutta onnistuu se matematiikallakin (tai tilastoilla). Mutta ei tilastot ja matematiikka aina valehtele, niin kuin ei luonnollinenkaan kieli.

Valitaan x=1 ja y=1.

Itsestään selvästi
x=y

kerrotaan yhtälön molemmat puolet x:llä
x*x = y*x
x2 = y*x

vähennetään molemmilta puolilta  y2
x-y2 = y*x -y2

puretaan vasen puoli tekijöihin (kts. esim “Samankorkuisten potenssien erotus” )
(x+y)(x-y)  = y*x -y2

oikealla puolella otetaan y yhteiseksi tekijäksi
(x+y)(x-y)  = y*(x -y)

Jaetaan molemmat puolet (x-y):llä (häviää molemmilta puolilta)
(x+y) = y

Sijoitetaan x:n ja y:n lähtöarvot
1+1=1
2=1

Todistettu: 2=1.


Tietokoneohjelman kirjoittaminen on aika lailla samanlaista kuin matemaattisen todistuksen. Alkuarvoista yritetään päästä lopputulokseen. Näin ajateltuna yllä olevassa todistuksessa sattuu olemaan pieni(?) bugi, joka aiheuttaa omituisia tuloksia (niin helposti niitä bugeja livahtaa, joskus sen löytää helposti, joskus vaikeasti).

6 Responses to “Matemaattinen valehtelu”

  1. En keksinyt.. (x+y)(x-y) = y*(x -y) pitää vielä kutinsa (olettaen että x=y) mutta siitä (x-y):n jakaminen saa aikaan jotain jännää, (x+y)=y ei enää päde.. Nyt varmaan pitäisi muistaa joku jakoon liitty..

    Hei, ei nollalla voi jakaa!
    Koska x=y niin x-y=0 eikä sillä voi jakaa ja tästä vekkulit tulokset.

    Eli taisin sittenkin keksiä..

  2. timo said

    Ei tässä varmaan siitä ole kyse, että nollalla ei voi jakaa. Kaavaa pyöritellessä kun ei käsittääkseni tarvitse ottaa arvoja huomioon. Itse lähtisin ensimmäisenä kyseenalaistamaan itsestäänselvyyksiä (todellisuudessa toki aloitin etsimällä tahallista virhettä kaavoista).

  3. Aapo said

    Timo, mitäköhän matematiikan opettajasi sanoisi tuosta =)

  4. timo said

    No pahus, niinhän se tietenkin on kuin Risto H. Kurppa sanoo. Eli kyllä tästä uusintaan olisi jouduttu.

    En keksinyt, missä menin vikaan, joten googlasin proof that 1=2. Hämäännyin tuosta, että symboleille annettiin arvot ennakkoon, joka on ylimääräinen askel ja ajattelin, että siinä se virhe varmaan on jo tehty. Yhtälön molempia puolia voi kohdella samalla tavoin, ja yhtäpitävyys säilyy, joten ajattelin, että se, että 1-1 sattuu olemaan 0, ei tarkoita sitä, että mitkä tahansa x-y olisi nolla. Tässä kohden olisi tietysti pitänyt huomatta, että määritelmän mukaan x=y.

    On kyllä sellainen virhe, jonka varmasti tekisin, jos tällaisen tekemiseen olisi käytännössä mahdollisuus, eli alla olevasta sievistäisin pois (x-y) enempää ajattelematta
    (x+y)(x-y) = y*(x -y)

    Toisaalta, jos yhtälöparina olisi annettu x=y, niin en lähtisi tuota yllä olevaa toista yhtälöä käsittelemään lainkaan.

    Tarvitsen matematiikkaa käytännön ongelmien ratkaisuun, enkä todistamiseen. Toistaiseks ei ole tällaista virhettä tullut tehtyä. Voi olla, että tämäkin oppitunti silti osoittautuu hyödylliseksi.

    Aapo, onko tämä sellainen virhe, joka tulee käytännössä vastaan, ja millaisessa yhteydessä? Onko esim. matriiisin singulariteetti tähän yhteydessä? Minulle matriisit kääntää tietokone (joko matlab, ublas tai java matrix package), joka tietysti tarkistaa singulariteetin puolestani, mutta ajatuksen tasolla käänteismatriisilla yritän kertoa -> saataisiin varmaan mielettömiä tuloksia, jos singulaarisella käänteismatriisilla kertominen jotenkin käytännössä toteutettaisiin (ja saadaankin, kun ollaan lähellä singulariteettia, ja virheet diskretoinnista johtuen kasvavat).

  5. rhk said

    Vaikka arvoja ei olisi määritelty etukäteen, eikö jakaminen aina tuo ehdon että jakaja!=0? Käytännössä tota vaan varmaan aika harvoin muistaa mihinkään merkata ja tarkastaa (kuten yo. tapauksessa ;)

  6. Aapo said

    Moniin (kaikkiin?) laskutoimituksiin liittyy ehtoja milloin niitä voi käyttää. Esim yhteenlaskussa osapuolten pitää olla ‘suunnilleen samanlaisia’. Reaalilukuja ja kokonaislukuja voi summata, mutta kokonaislukua ja matriisia ei voi. Matriisikertolaskussa on erittäin tarkasti määrätty minkälaiset matriisit voi kertoa keskenään (n*m X m*n). Neliöjuurta ei voi ottaa negatiivisesta luvusta. Tai toki voi, mutta päätyy kompleksilukuihin. Jakajana ei voi olla nolla, koska silloin voi tapahtua mitä tahansa.

    Ajattele laskutoimitus tietokoneohjelmana. Joka kerta kun suoritat laskutoimituksen, tarkista alkuarvot ja -ehdot (aivan kuten tietokoneohjelmankin pitäisi tehdä).

    Matriisin singulariteetillä on yhteyttä nollalla jakamiseen, paitsi erittäinkin lähellä nollaa olevilla luvuilla jakaminen ei välttämättä aiheuta mitään hankaluuksia. Matemaattisesti en kutsuisi sitä hankaluudeksi, että kun jakaja lähestyy nollaa, niin tulos kasvaa rajatta (kohti ääretöntä).

    Tuleeko käytännössä vastaan? En tiedä. En ole oikeastaan koskaan tehnyt vakavasti käytännössä matematiikkaa. Kaiketi kaikki käytännön matematiikka on tietokoneistettua, joten riittää vastata ohjelmoinnin näkökulmasta. Tietokoneen prosessorilla (tai sen matikkayksikössä) on yksi muistipaikka (lippu, flag register) varattu vain ja ainoastaan sitä varten, että siitä voi tarkistaa kävikö edellisessä laskutoimituksessa ‘division by zero’ (kts esim ‘bit 2’ http://softpixel.com/~cwright/programming/simd/sse.php ). Ongelmia tulee siinä vaiheessa kun ohjelmoija “tietää”, että laskutoimituksessa ei voi koskaan olla mukana nollaa ja säästää aikaa ja ohittaa tarkistukset. Sitten tapahtuukin vioittunut data / verkkoliikennevirhe / ilkeämielinen käyttäjä / jne (kts esim 8. kappale: http://www.wired.com/science/discoveries/news/1998/07/13987 ) Katso myös: http://cache.ohinternet.com/images/5/56/Dukeby0.jpg (tiedostonimi antaa vinkin mistä on kyse).

    Yhteenveto: Emme voi tietää kuinka moni tietokoneohjelman kaatuminen (esim ylivuotoon) johtuu nollalla jakamisesta (toisinaan ohjelma kertoo sen). Monessa tapauksessa ohjelma ei edes näytä/tunnu/ole mitenkään erityisen matemaattinen tai laskentaan tarkoitettu.

Leave a comment