26  Prosessit ja algoritmit

Tekijä

Olli Järviniemi

26.1 Johdanto

Joissakin kombinatoriikan tehtävissä tulee vastaan prosessi, jota pitää analysoida ja todistaa jokin tietty ominaisuus (kuten että prosessi jossain kohtaa päättyy). Joissakin tehtävissä pitää taas itse keksiä prosessi, jolla on tietyt ominaisuudet. Tässä tekstissä käsitellään tämäntyyppisiä tehtäviä.

Monissa prosessitehtävissä on jokin suure, joka käyttäytyy jollain tavalla säännöllisesti ja jonka kautta tehtävän saa ratkaistua. Tällaisia suureita kutsutaan invarianteiksi. Tätä ideaa käsitellään heti aluksi.

26.2 Invariantit

Invariantti: suure, joka ei muutu prosessin aikana.

Laatoitukset ovat klassisia esimerkkejä invarianteista: värittämällä ruudukko sopivasti huomataan, ettei sen laatoittaminen tietyillä palikoilla onnistu. Otetaan tästä esimerkki.

Tehtävä 26.1 5×55 \times 5 -ruudukosta poistetaan jokin ruutu. Käy niin, että loput 2424 ruutua voidaan peittää 1×31 \times 3 -laatoilla. (Palikoita saa kääntää, mutta ne eivät saa mennä toistensa päälle tai laudan ulko­puolelle.) Osoita, että poistettu ruutu on laudan keskellä sijaitseva ruutu.

Kuva 26.1: 5×55 \times 5 -lauta.

On helppo keksiä laatoitus tapauksessa, jossa keskimmäinen ruutu poistetaan. Mutta miksei laatoitus onnistu muissa tapauksissa? Tutkitaan esimerkki­tapausta.

Kuva 26.2: Miksei tämän laudan laatoitus onnistu?

Ideana on värittää laudan ruudut siten, että osaamme sanoa jotakin siitä, montako kunkin värin ruutua jokainen laatta peittää. Luonteva idea on värittää lauta kolmella värillä niin, että kukin laatta peittää yhden ruudun kutakin väriä. Tämä onnistuu seuraavasti:

Kuva 26.3: Laudan väritys kolmella värillä.

Jokainen 1×31 \times 3 -laatta peittää yhden ruudun kutakin väriä. Punaisia ruutuja on kuitenkin 99 ja sinisiä 77, joten toisaalta peittämiseen tulisi käyttää 99 laattaa ja toisaalta 77. Tämä ei tietysti käy.

Koko tehtävän saa ratkaistua tällä idealla. Tutkitaan alla olevia värityksiä.

 

 

 

Kuva 26.4: Kaksi väritystä.

Kummassakin värityksessä on 99 punaista ruutua ja 88 sinistä ja 88 vihreää ruutua. Jotta laatoitus onnistuu, tulee laudalta poistaa sellainen ruutu, joka on punainen sekä vasemmassa että oikeassa värityksessä. Ainoa tällainen ruutu on laudan keskimmäinen ruutu, eli laatoitus onnistuu vain jos keskimmäinen ruutu poistetaan.

Tässä on toinen esimerkki­tehtävä, joka on enemmän prosessimainen.

Tehtävä 26.2 Liitu­taululla on kirjoitettuna luvut 1,2,,1001, 2, \ldots , 100. Anna tekee toistuvasti seuraavan operaation: valitaan jotkin kaksi taulun lukua AA ja BB, pyyhitään ne ja kirjoitetaan taululle luku AB+A+BAB + A + B. Näin tehdään, kunnes taululla on vain yksi luku. Osoita, että lopuksi taululla oleva luku on sama riippumatta siitä, missä järjestyksessä Anna valitsee lukuja.

Tehtävässä on kätkettynä jokin invariantti: riippumatta siitä, mitä Anna tekee, jokin suure pysyy samana. Mikä tämä suure on?

Pyöritellään ideoita mielessä. Mitä suureita ylipäätään pystymme muodostamaan luvuista? Voimme tutkia lukujen summaa. Tämä ei tietenkään pysy samana: AB+A+BA+BAB + A + B \neq A + B. Huomataankin, että luvut kasvavat hyvin nopeasti, minkä takia summa ei todellakaan toimi.

Kasvu­nopeudesta johtuen lukujen tulo tuntuu paremmalta idealta, mutta tämäkään ei toimi, koska AB+A+BABAB + A + B \neq A \cdot B. Tämä on kuitenkin jo lähempänä: AB+A+BAB + A + B ja ABAB ovat kohtalaisen lähellä toisiaan.

Suure todennäköisesti liittyy jotenkin lukujen tuloihin, muttei ole selvää miten. Voi auttaa tutkia pieniä tapauksia, joissa taululla on aluksi vähemmän kuin sata lukua. Lopussa olevan luvun selvittämiseksi riittää käydä vain yksi skenaario läpi, koska vastaus ei tehtävän­annon mukaan riipu järjestyksestä (vaikkemme tätä vielä osaakaan todistaa).

  • Taululla on aluksi luvut 11 ja 22. Lukujen tulo on 22. Lopuksi taululla on luku 55.
  • Taululla on aluksi luvut 1,21, 2 ja 33. Lukujen tulo on 66. Lopuksi taululla on luku 2323.
  • Taululla on aluksi luvut 1,2,31, 2, 3 ja 44. Lukujen tulo on 2424. Lopuksi taululla on luku 119119.
  • Taululla on aluksi luvut 1,2,3,41, 2, 3, 4 ja 55. Lukujen tulo on 120120. Lopuksi taululla on luku 719719.

Säännön­mukaisuus alkaa erottumaan: lukujen ollessa 1,2,,n1, 2, \ldots , n on vastaus (n+1)!1=123(n+1)1.(n+1)! - 1 = 1 \cdot 2 \cdot 3 \cdot \ldots \cdot (n+1) - 1. Lukuja tulee siis jotenkin kasvattaa yhdellä.

Tästä keksitään ratkaisu: haluttu suure on tulo luvuista, jotka vastaavat taulun lukuja mutta joihin on jokaiseen lisätty yksi. Pätee nimittäin AB+A+B+1=(A+1)(B+1)AB + A + B + 1 = (A+1)(B+1). Tämä suure ei muutu ja aluksi se on (n+1)!(n+1)!. Täten lopussa olevan luvun tulee olla (n+1)!1(n+1)! - 1.

Esitetään vielä yksi opettavainen esimerkki samasta teemasta.

Tehtävä 26.3 Olkoot kk ja nn positiivisia kokonais­lukuja. Anna ja Bella pelaavat peliä laudalla, joka koostuu n+1n+1 ruudusta, jotka on numeroitu 0,1,,n0, 1, \ldots , n. Pelin alussa ruudussa 00 on kk kolikkoa. Muut ruudut ovat tyhjiä. Kullakin vuorolla Anna valitsee kaksi epätyhjää kolikoiden joukkoa AA ja BB laudalta niin, etteivät AA ja BB sisällä yhteisiä kolikoita (mutta joukkojen AA ja BB ei tarvitse sisältää kaikkia laudan kolikoita). Bella valitsee joukoista AA ja BB jommankumman ja poistaa valitsemansa joukon kolikot laudalta. Jäljelle jäävän joukon kolikoita siirretään yksi ruutu eteenpäin. Anna voittaa pelin, jos hän siirrettyä vähintään yhden kolikon ruutuun nn, ja Bella voittaa, mikäli hän saa tyhjennettyä laudan kolikoista.

Osoita, että Annalla on voitto­strategia jos ja vain jos k2nk \ge 2^n.

Voitto­strategia Annalle tapauksessa k=2nk = 2^n (ja siten tapauksessa k2nk \ge 2^n) on helppo keksiä: jaetaan nykyinen joukko aina kahtia, jolloin toinen puolisko pääsee yhden askeleen eteenpäin. Tällöin aina ruutuun ii siirretään 2ni2^{n - i} kolikkoa, joten ruutuun nn siirretään 20=12^0 = 1 kolikko.

Tapauksessa k<2nk < 2^n pitää keksiä Bellalle voitto­strategia. Parikin strategiaa tulee mieleen:

  • Bella poistaa aina sen joukon, jossa on etummaisin kolikko (ja tasa­tilanteet käsitellään jotenkin).
  • Bella poistaa aina sen joukon, jossa on enemmän kolikoita (ja tasa­tilanteet käsitellään jotenkin).

Ikävä kyllä kumpikaan näistä ei toimi: Anna voi antaa Bellalle ”syöttejä” ja näin hyödyntää Bellan strategian heikkouksia.

Ongelma on siinä, etteivät strategiat ota kunnolla huomioon kokonais­kuvaa. Ensimmäinen strategia ottaa huomioon vain etummaiset kolikot. Toinen strategia sentään katsoo kolikoiden määriä, muttei ota niiden sijainteja kunnolla huomioon. Seuraava ratkaisu korjaa nämä ongelmat ottaen jokaisen kolikon sijainnin huomioon.

Määritellään kolikon tärkeys olemaan 2m2^m, missä mm on kolikon nykyinen ruutu. Bellan strategia on aina poistaa se kolikko­joukko, jonka kolikoiden tärkeyksien summa on suurempi (tasa­tilanteessa poistetaan kumpi tahansa).

Väite. Kun Bella pelaa näin, laudalla olevien kolikoiden tärkeyksien summa ei koskaan kasva.

Väitteen perustelu. Oletetaan, että Anna valitsee kolikko­joukot AA ja BB, joiden kolikoiden tärkeyksien summat ovat aa ja bb. Jos aba \ge b, Bella poistaa joukon AA kolikot, ja BB:n kolikot siirtyvät yhden askeleen eteenpäin. Joukon BB jokaisen kolikon tärkeys kaksin­kertaistuu, joten tärkeyksien summakin kaksin­kertaistuu, eli lisääntyy bb:llä. Täten tärkeyksien summan muutos on a+b0-a + b \le 0. Tapaus bab \ge a on symmetrinen.

Ratkaisun viimeistely. Alussa tärkeyksien summa on k<2nk < 2^n. Jos Anna saisi jossakin vaiheessa kolikon ruutuun nn, olisi tämän kolikon tärkeys 2n2^n. Tämä on risti­riidassa sen kanssa, ettei tärkeyksien summa kasva.

Kommentti. Idea määritellä paino­arvoja (tässä tapauksessa ”tärkeys” 2m2^m) eri kolikoille on kohtuu yleinen. Painotus halutaan tietysti valita niin, että paino­arvojen summa pysyy samana, ei koskaan kasva tai käyttäytyy muuten säännöllisesti. Tästä syystä 2m2^m on hyvä valinta tehtävään. Syy idean toimivuudelle selitettiinkin ratkaisussa: tutkimalla paino­arvojen summaa saadaan otettua jokainen kolikko huomioon keskittyen kuitenkin enemmän pitkälle edenneisiin kolikoihin.

26.3 Muita esimerkkejä

Tehtävä 26.4 10×1010 \times 10 -ruudukon ruuduissa on yhteensä tuhat sammakkoa. (Samassa ruudussa voi olla useampi sammakko.) Sammakot hyppivät ruuduista toiseen seuraavan säännön mukaisesti: jos ruudussa on vähintään ruudun naapurien määrän verran sammakkoja, ruudusta hyppää kuhunkin naapuri­ruutuun yksi sammakko. (Ruudun naapureita ovat ne ruudut, joilla on yhteinen sivu tai kärki­piste ruudun kanssa.) Osoita, että kussakin ruudussa käy jossain kohtaa vähintään yksi sammakko.

Ennen väitteen todistamista pohditaan hetki, mitä prosessissa oikein tapahtuu. Lähteekö prosessi edes liikkeelle? Lähtee: Jos jossakin ruudussa on vähintään 88 sammakkoa, ruudusta hyppää sammakoita muualle. Koska alussa sammakoita on tuhat ja ruutuja sata, on jossakin ruudussa aluksi vähintään kahdeksan (ja jopa vähintään kymmenen) sammakkoa.

Samaan tapaan huomataan, että prosessi ei pääty missään vaiheessa.

Väitteen todistamiseksi voisi miettiä, missä ruuduissa käy vähintään yksi sammakko. Tämä ei kuitenkaan kerro juuri mitään.

Kuva 26.5: Ei kerro vielä kovin paljoa, että tiedämme punaisissa ruuduissa olevan jossain vaiheessa vähintään yksi sammakko.

Sen sijaan parempi kysymys on miettiä, mihin ruutuihin tulee prosessin aikana sammakko äärettömän monta kertaa. Tiedämme, että vähintään yksi tällainen ruutu on olemassa, koska prosessi jatkuu loputtomiin. Ei ole myöskään vaikea nähdä, että jos ruudulla on tämä ominaisuus, niin myös ruudun naapureilla on tämä ominaisuus, koska ruudusta hyppii sen naapureihin äärettömän monta sammakkoa prosessin aikana.

Tästä seuraa, että jokaiseen ruutuun hyppää prosessin aikana äärettömän monesti sammakko.

Tehtävä 26.5 Annalla on robotteja, jotka hän on laittanut (äärellisen) ruudukon ruutuihin. Mihin tahansa ruutuun mahtuu rajattomasti robotteja. Joidenkin ruudukon ruutujen välillä on seiniä, joiden läpi robotit eivät voi kulkea. Lisäksi robotit eivät voi kulkea ruudukon ulkoreunojen läpi.

Anna antaa roboteille käskyjä ”ylös”, ”vasen”, ”alas” ja ”oikea”. Käskyn annettuaan jokainen roboteista yrittää kulkea käskyn ilmoittamaan suuntaan yhden ruudun verran. Jos vastassa on seinä, robotti ei liiku.

Oletetaan, että mistä tahansa ruudukon ruudusta pääsee mihin tahansa muuhun ottamalla askeleita ylös, vasemmalle, alas tai oikealle. Osoita, että Anna voi antaa roboteille käskyjä niin, että lopuksi kaikki robotit ovat samassa ruudussa.

Ruudukko, seiniä ja kolme robottia.

Yllä oleva kuva esittää yhden esimerkki­tapauksen. Esimerkki ei ole kovin vaikea: voimme vaikkapa aluksi tehdä kolme askelta vasemmalle ja kolme askelta alas, jolloin kaksi robottia saadaan samaan ruutuun vasempaan ala­nurkkaan. Tämän jälkeen tekemällä kolme askelta ylös ja kolme vasemmalle saadaan kolmaskin robotti samaan ruutuun.

Yleisesti huomataan, että riittää ratkaista tehtävä kahden robotin tapauksessa. Jos nimittäin robotit jossain kohtaa päätyvät samaan ruutuun, ne ovat aina samassa ruudussa.

Kahden robotin tapaus ei ole aivan helppo. Esimerkiksi yksin­kertainen suunnitelma ”kuljetetaan ensiksi toinen roboteista vasempaan ala­nurkkaan, ja viedään sitten toinenkin roboteista sinne” ei välttämättä toimi: ensimmäinen robotti saattaa (ainakin periaatteessa) ”karata” sillä välin kun keskitytään toiseen robottiin.

Mietitään asiaa toisesta näkö­kulmasta: yritetään saada robotit koko ajan lähemmäksi toisiaan.

Tarkemmin sanoen määritellään kahden ruudun etäisyydeksi pienin määrä askelia, joka tarvitaan ensimmäisestä ruudusta toiseen ruutuun pääsemiseksi. Tavoitteena on saada liikutettua robotteja niin, että niiden ruutujen väliset etäisyydet pienenevät.

Jos robottien etäisyys on aluksi yksi, eli esimerkiksi toinen roboteista on toisen oikealla puolella ja ruutujen välillä ei ole seinää, voidaan vain toistuvasti liikkua oikealle. Jossakin kohtaa etummaiselle robotille tulee seinä vastaan, jolloin robotit päätyvät samaan ruutuun.

Tutkitaan sitten yleisesti tilannetta, jossa robottien etäisyys on nn, eli ensimmäisen robotin ruudusta pääsee toisen robotin ruutuun jollakin nn siirron sarjalla (muttei nopeampaa). Suoritetaan tämä nn siirron sarja. Mitä tapahtuu? Robottien etäisyys on siirto­sarjan jälkeen selvästikin enintään nn. Jos se on alle nn, olemme saaneet robotit lähemmäksi toisiaan.

Entä jos etäisyys on edelleen nn? Tämä tarkoittaa, että toinen robotti ei törmännyt seinään kertaakaan siirto­sarjan aikana. Tämä puolestaan tarkoittaa, että (yksi) nopein tapa päästä ensimmäisen robotin ruudusta toiseen on käyttää samaa nn siirron sarjaa kuin aiemminkin. Suoritetaan siirto­sarja siis uudestaan ja tarvittaessa vielä useamman kerran uudestaan.

Siirto­sarja ensimmäisestä robotista toiseen on merkitty kuvaan punaisella. Jos robotit eivät lähene toisiaan siirto­sarjan seurauksena, toinen robotti ei törmää seinään siirto­sarjan aikana.

Voiko olla niin, että vaikka tämän siirto­sarjan tekisi kuinka monta kertaa tahansa, niin robottien etäisyys olisi edelleen nn? Ei: siirto­sarjan seurauksena robotit kulkevat johonkin suuntaan aloitusruudusta. Toistamalla siirto­sarjaa robotit kulkevat pidemmälle ja pidemmälle tähän suuntaan. Jossakin vaiheessa ruudukon reuna tulee vastaan.

Siis toistamalla siirto­sarjaa riittävän monta kertaa saadaan robotit lähemmäksi toisiaan. Toistamalla samaa ideaa saadaan robotit yhä lähemmäs ja lähemmäs toisiaan, kunnes ne ovat samassa ruudussa.

26.4 Tehtäviä

Tehtävä 1. 8×88 \times 8 -shakki­laudasta poistetaan kaksi vastakkaista nurkka­ruutua. Osoita, ettei lautaa voi peittää 2×12 \times 1 -domino­palikoilla. (Palikoita saa kääntää, mutta ne eivät saa mennä toistensa päälle tai laudan ulko­puolelle.)

Tehtävä 2. Ringissä on 100100 kuppia. Aluksi kaikki paitsi yksi kupeista on oikein päin. Kupeista valitaan aina jotkin kaksi ja ne käännetään toisin päin. Onko mahdollista päästä tilanteeseen, jossa kaikki kupit ovat oikein päin?

Tehtävä 3. Juhlissa olevista henkilöistä tiedetään, että kukin heistä tuntee enintään kolme muuta henkilöä juhlista. Osoita, että henkilöt voidaan jakaa neljään joukkoon niin, etteivät ketkään kaksi saman joukon henkilöä tunne toisiaan.

Tehtävä 4. Pyöreän pöydän ympärillä istuu 2525 poliitikkoa, jotka äänestävät. Ensimmäisellä äänestys­kierroksella jokainen äänestää satunnaisesti joko ”Kyllä” tai ”Ei”. Jokaisella seuraavista kierroksista jokainen poliitikko äänestää seuraavasti:

  • Jos vähintään toinen poliitikon vierustovereista äänesti edellisellä kerralla samoin kuin poliitikko itse, niin poliitikko äänestää samoin kuin edellisellä kerralla.
  • Muussa tapauksessa poliitikko äänestää päinvastoin kuin edellisellä kierroksella.

Osoita, että jostain kierroksesta lähtien kenenkään poliitikon ääni ei enää muutu.

Tehtävä 5. Pöydällä on n>1n > 1 kolikkoa. Yhdellä operaatiolla saa ottaa kaksi kolikkoa ja siirtää molemmat niistä kolikoiden välisen janan keski­pisteeseen.

  • Osoita, että jos n=2kn = 2^k jollain k1k \ge 1, niin operaatiota toistamalla on mahdollista saada kaikki kolikot samaan pisteeseen (riippumatta kolikoiden alkusijainneista).
  • Osoita, että jos nn ei ole kakkosen potenssi, niin on mahdollista asettaa kolikot pöydälle niin, että kolikoita ei saa samaan pisteeseen.