Simo K. Kivelä, 28.10.2004

Kexleruksen viiniongelma

Simon Kexlerus oli Suomen ensimmäinen matematiikan professori, joka työskenteli Turun akatemiassa sen perustamisesta lähtien vuosina 1640 – 1669. Seuraava probleema on häneltä peräisin:

Sinulla on viinejä, jotka maksavat 3, 5, 8 ja 10 markkaa pullolta. Ota yhteensä kymmenen täyttä pulloa ja tee niistä sekoitus, joka maksaa 6 markkaa pullolta. Montako pulloa kutakin viinilajia on otettava?

Ratkaisu

Pullojen määrät olkoot a, b, c ja d. Tällöin tulee seuraavien ehtojen olla voimassa:

pullot= a+b+c+d==10

rahat= 3 a+5 b+8 c +10 d == 60

On etsittävä ne ei-negatiiviset kokonaisluvut, jotka toteuttavat yhtälöt. Selvää on, että mahdolliset luvut ovat välillä [0,10].

Ehto funktiomuotoisena:

pullotJaRahat[{a_,b_,c_,d_}]=pullot&&rahat

Yksinkertaisin ohjelmointitekniikalla toteutettava ratkaisu on tarkistaa yhtälöiden toteutuminen kaikkien vaihtoehtojen kohdalla. Vaihtoehtoja on

11^4

kappaletta.

Siis:

ratkaisu=Select[Flatten[Table[{a,b,c,d},{a,0,10},{b,0,10},{c,0,10},{d,0,10}],3],pullotJaRahat]

Mahdollisia ratkaisuja on siis 7 kappaletta.

Nykyisillä ohjelmistoilla tällainen ratkaiseminen ei kestä kauan. Kexleruksen aikana tilanne oli toinen ja tehtävälle on toki löydettävissä varsin yksinkertainen ratkaisu päättelemällä. Tämänkin voi toteuttaa Mathematicalla:

Perinteisempi ratkaisu

Ratkaistaan pulloja ja rahoja koskevista ehdoista esimerkiksi a ja b:

rtk=Solve[{pullot,rahat},{a,b}]

Koska kaikkien tuntemattomien tulee olla ei-negatiivisia, saadaan seuraavat ehdot:

ehdot=a≥0&&b≥0&&c≥0&&d≥0/.rtk[[1]]

Piirretään alue, jossa ehdot toteutuvat:

alue=RegionPlot[ehdot,{c,0,10},{d,0,10},GridLines->{Range[0,10],Range[0,10]}]

Ne alueen sisään osuvat cd-tason kokonaislukupisteet, joita vastaavat a ja b myös ovat kokonaislukuja, antavat tehtävän ratkaisut. Kokeiltavia vaihtoehtoja on siis varsin rajallinen määrä.

Tarkistuksena edellisessä ratkaisussa saadut pisteet lisättyinä kuvioon:

Show[alue,Graphics[Map[Point[Drop[#,2]]&,ratkaisu]]]