Simo K. Kivelä / 29.9.1999

Kexleruksen tehtävä

Simon Kexlerus oli Turun Akatemian ensimmäinen matematiikan professori 1640 – 1669. Seuraava on eräs Kexleruksen tehtävä Turun Aboa Vetus -museon näyttelyn mukaan:

Sinulla on viinejä, jotka maksavat 3, 5, 8 ja 10 markkaa litralta. Tee 10 litraa sekoitusta, joka maksaa 6 markkaa litralta. [Oletettaneen lisäksi, että sekoitukseen käytetään vain täysiä yhden litran pulloja.]

Ratkaisu Mathematicalla:

Remove["Global`*"]

Eri viinilajeja otetaan a, b, c ja d litraa. Kokonaismäärän tulee olla kymmenen litraa:

litrat =  
      a  +  b  +  c  +  d  ==  10

Kymmenen litran hinta saadaan toisaalta eri viinilajien hintojen perusteella ja toisaalta sen tulee olla 6 markkaa litralta:

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

Listataan kaikki vaihtoehdot viinimääriksi, kun kutakin viinilajia on otettava vähintään 0 litraa ja enintään 10 litraa. Tässä vaiheessa ei vielä välitetä edellä muodostetuista rajoitusehdoista. Koska vaihtoehtoja tulee paljon, katsotaan varovaisesti ensin, millainen vaihtoehtolista saadaan, jos viinejä on vain kolmea lajia ja kutakin niistä otetaan vähintään 0 ja enintään 2 litraa:

vaihtoehdot = 
      Table[{a, b, c}, {a, 0, 2}, {b, 0, 2}, {c, 0, 2}]

Hieman  selkeämmässä muodossa:

vaihtoehdot // TableForm

Vaihtoehdoista voidaan saada myös vain yksinkertainen lista:

Flatten[vaihtoehdot, 2]

Ja sitten varsinaisen tapauksen vaihtoehtolista edellä olevan mallin mukaisesti yksinkertaiseksi listaksi muunnettuna; puolipiste komennon lopussa estää tulostuksen, ts. lauseke vain lasketaan, mutta sitä ei näytetä:

vaihtoehdot =  
        Flatten[
          Table[{a, b, c, d}, {a, 0, 10}, {b, 0, 10}, {c, 0, 10}, {d, 
              0, 10}], 3];

Tässä on vaihtoehtoja kaikkiaan

Length[vaihtoehdot]

Tarkoituksena on poimia tästä listasta ne vaihtoehdot, jotka toteuttavat alussa muodostetut kaksi ehtoa. Tätä varten muodostetaan funktio, joka saa arvon tosi, jos sen argumentti toteuttaa molemmat ehdot:

ehto[{a_, b_, c_, d_}] =  rahat  &&  litrat

Tällöin on esimerkiksi

ehto[{1, 2, 3, 4}]

Poimitaan ne vaihtoehdot, joilla ehto toteutuu:

tulos = Select[vaihtoehdot, ehto]

Ratkaisuja löytyy siis kaikkiaan kahdeksan. Jos vaaditaan, että jokaista viinilajia on käytettävä, ratkaisuja on vain kolme:

Select[tulos, Apply[Min, #] > 0 &]