Matematinis trolinimas ir veiksmų prioritetai

Vakar blogo skaitytojams uždaviau provokuojačią matematinę užduotį – suskaičiuoti, kiek bus 48/2(9+3). Ją uždaviau ir ant savo sienos feisbuke. Iš viso sulaukiau 17-os atsakymų, kad gaunasi 288, devynių atsakymų, kad gaunasi 2 ir dar keleto kitokių atsakymų („I can count to potato!“ ir panašių). Jei jūs irgi atsakėte „288“ ir žinote kodėl yra būtent tiek, o ne 2, toliau galite ir neskaityti. O jei nežinote, kodėl atsakymas yra 288, tai šis rašinys – kaip tik jums.

Prieš aiškindamas skirtingų atsakymų atsiradimo esmę, išsklaidysiu keletą abejonių ir neaiškumų, kuriuos paminėjo įvairūs komentatoriai. Atrodo, visi suprato, jog sąlygoje tarp dvejeto ir skliaustelio yra praleistas daugybos ženklas. Daugybos ženklų mes dažnai nerašome matematinėse formulėse, ypač jei jos susideda iš raidžių, o ne skaitmenų; šiuo atveju būtų truputį aiškiau, jei daugybos ženklas būtų nurodytas, bet nemanau, kad jo nebuvimas sukelia didelių problemų. Kitas neaiškumas – pasviro brūkšnio (/) reikšmė. Tai yra paprasčiausias dalybos ženklas, visiškai tolygus dvitaškiui (:) arba dvitaškiui, padalintam brūkšniu.

Taigi, dabar pasižiūrėkime, kaip iš sąlygos 48:2*(9+3) galima gauti 2, o kaip – 288. Vienu atveju mąstoma taip: 48:2*(9+3) = 48:2*12 = 48/24 = 2, kitu – 48:2*(9+3) = 48:2*12 = 24*12 = 288. Kaip jau užsiminiau pradžioje, antrasis atsakymas teisingas. Kodėl? Priežastis slypi matematinių veiksmų atlikimo tvarkoje. Atkreipkime dėmesį, kad beveik visi galvojantys apie šitą uždavinį pirmiausia sudeda 9+3, nes ta išraiška yra skliaustuose. Čia pasireiškia matematinių veiksmų prioritetai – veiksmai skliaustuose atliekami pirmiau, nei veiksmai ne skliaustuose. Šie prioritetai nėra kažkas labai ypatingai ezoteriško, ko išmokstama tik giliai MIF‘o požemiuose. Apie juos pasakojama turbūt dar pradinėje mokykloje (tik gal prioritetais nevadinama) ir tos žinios padeda mums suprasti, kodėl 1+2*3 yra lygu septyniems, o ne devyniems. Nes daugybos veiksmas turi aukštesnį prioritetą, nei sudėties, todėl atliekamas pirmiau. Problema (kai kam) iškyla tada, kai susiduriama su sudėties ir atimties arba daugybos ir dalybos veiksmais vienoje išraiškoje.

Kodėl tai problema? Todėl, kad daugyba ir dalyba turi vienodą prioritetą, kaip ir sudėtis bei atimtis. Tokiu atveju veiksmus reikia atlikti iš kairės į dešinę, kaip kad skaitome užduotį. Bet šitai žino ne visi. Pasirodo, daug kur aiškinama, kad daugybą atliekame pirmiau, o dalybą – paskiau. Anglakalbiuose kraštuose tokios neteisingos žinios užtvirtinamos mnemoniku „Please Excuse My Dear Aunt Sally“, kuris šifruojasi PEMDAS – Parentheses, Exponents, Multiplication, Division, Addition, Subtraction, t.y. skliaustai, kėlimas laipsniu, daugyba, dalyba, sudėtis, atimtis. Būtent ta tvarka moksleiviai išmoksta atlikinėti veiksmus, tad susidūrę su ne visai kasdiene užduotimi pasimeta ir taip pat padaugina prieš dalindami, taip gaudami neteisingą atsakymą. Beje, kai kur naudojami kitokie mnemonikai, šifruojami BEDMAS – B reiškia Brackets, t.y. irgi skliaustus, tačiau D ir M sukeista vietomis. Šitaip išmokytiems moksleiviams problemų kilti turėtų mažiau, nes sprendžiant užduotį X*Y:Z nesvarbu, kuria tvarka bus atlikti veiksmai, atsakymas gausis vienodas. Tiesa, išlieka analogiška problema su painiava tarp sudėties ir atimties, o BEDMSA neskamba taip gerai…

Kokia situacija Lietuvoje? Apie mnemonikus neteko girdėti. Taip pat neatsimenu tiksliai, kaip mane mokė mokykloje, bet man atrodo, kad buvo išaiškinta teisingai. Buvę klasiokai atsakyti irgi negalėjo – per seniai tas buvo. Naobetačiau kitose mokyklose, pasirodo, kartais aiškinama ir neteisingai – kad daugyba atliekama pirmiau už dalybą. Gana keista ir, mano supratimu, tai nėra smulkmena, taigi vertėtų susirūpinti pedagogų rengėjams.

Kaip ten bebūtų, skliaustų buvimas užduotyje ją supaprastintų, ir šiaip skliaustų pridėliojimas dažnai padaro matematines išraiškas aiškesnes, bet jie nėra būtini. O vienas man labai keistas dalykas, pasakytas vieno iš komentatorių, buvo tas, kad Maple ir MathCAD programos tokį užrašą interpretuoja neteisingai (tuo tarpu Google kalkuliatorius ir Wolfram Alpha / Mathematica interpretuoja teisingai). Tai tik parodo, kad dirbant su kompiuteriais verta gerai pagalvoti apie galimus neaiškumus ir negailėti skliaustų, kaip puikaus prioritetų identifikatoriaus.

Taip pat viena įdomybė – nors sudėtis/atimtis ir daugyba/dalyba atliekami iš kairės į dešinę, keletas kėlimų laipsniu atliekami iš dešinės į kairę. Taigi 2^3^2 = 2^(3^2) = 2^9, o ne (2^3)^2 = 8^2. Dar nėra tiksliai aišku, koks yra logaritmų prioritetas, taigi užrašas log a*b gali būti interpretuojamas ir kaip log(a*b), ir kaip b*log(a); aišku, log a + b interpretuojamas tik kaip b + log(a) ir jokiu būdu ne kaip log(a+b).

Taigi šitaip sėkmingai jus sukonfūzinęs atsisveikinu iki kitų, nematematinių, įrašų.

Laiqualasse

P.S. LABAI nusivyliau, kad niekas į klausimą neatsakė „42“.

P.P.S. Iš komentarų feisbuke supratau, jog žmonės skirtingai interpretuoja dalybos ženklus „:“ ir „/“ – pirmąjį kaip tiesiog dalybą, antrąjį kaip atskiriantį trupmenos skaitiklį ir vardiklį. Nors net ir antru atveju atsakymas turėtų gautis toks pat, bet suprantu, kad čia gali būti nesusipratimo šaltinis. Taigi atsiprašau, kitą kartą jus trolindamas pasistengsiu nesukelti papildomų neaiškumų :)

P.P.P.S. Komentatorius rwc paprotino mane, jog kėlimo laipsniu veiksmų eiliškumas nėra griežtai apibrėžtas, taigi programavimo kalbos užrašą „2^3^2“ gali interpretuoti abejaip.

14 komentarų

    1. Dėžutės – blogai. 42 – gerai!
      Visi skaičiai lygūs, tai kai kurie keturiasdešimtantresni už kitus.
      :)

  1. Man rodos, nemaža dalis klaidų gali ateiti iš skirtingos dalybos interpretacijos. Interpretuojant ‘/’ kaip tiesiog dalybos ženklą, prioritetas vienas. Interpretuojant jį kaip paprastosios trupmenos horizontalų brūkšnį — kitas. Nu ir čia jau all hell breaks loose: vieni įsiminė tik vieną, bet ne kitą, kiti juos painioja, treti išvis nemato skirtumo, kiti pagalvoja, kad čia tame bus kabliukas ir vaidina smartassus, ir t.t. :-)

    1. Aha, jau iš komentarų feisbuke supratau, kad skirtinga interpretacija galima ir netgi gana dažna.

  2. Kaip supratau:pirma sudedu skaitmenis skliaustuos (9+3), o po to… iš kairės dešinėn? Tai štai kaip išlaikomi egzai vidurinėse… :D

    1. Visiškai teisingai :) Jei veiksmų prioritetai vienodi, veiksmai atliekami taip pat, kaip ir skaitomi.

  3. Laiqualasse, dėl prioritetų paprieštaravau originaliame poste. Kėlimas laipsnių naudojant „programuotojų notaciją“ nėra universaliai apibrėžtas „iš dešinės kairėn“. Aritmetikos vadovėliuose rodyklės operatorius neapibrėžiamas. Todėl 2^3^2 gali būti skaičiuojamas abiem būdais, priklausomai nuo interpretacijos.

    Visgi čia turbūt labiausiai lemia interpretatoriaus specifika. Galbūt matematiniuose paketuose dažniau intuityviai naudojama notacija 1.3*10^10^100 = 1.3E(10^100) = 1.3 pow(10, pow(10,100)), bet programavimo kalbose paprastai visi aritmetiniai operatoriai (išskyrus priskyrimą, funkcijas ir unarinius operatorius – kas nėra griežtai aritmetiniai operatoriai) interpretuojami iš kairės dešinėn tam, kad nekiltų dviprasmybių.

    Informatikai (priešingai nei matematikai ar fizikai) visuomet linksta į notacijas su kuo mažiau išimčių ir taisyklių. Nenustebčiau, jei daugumoje programavimo kalbų, turinčių kėlimo laipsniu operatorių, jam galiotų tos pačios taisyklės kaip ir sudėties operatoriui.

    Beje, grįžtant prie dalybos. a/b/c – turbūt nekelia klausimų eiliškumas?

    1. Reikės pasitikrinti, kaip tai veikia mano naudojamose C ir IDL. Kadangi programeris nesu, tai įrašą rašiau remdamasis matematinėmis žiniomis, kurios, pasirodo, nėra tokios geros, kaip tikėjausi. Papildysiu įrašą, atkreipdamas skaitytojų dėmesį į šitai.

      a/b/c = (a/b)/c, klausimų nekyla.

  4. Neseniai (pries dvi valandas ) susiduriau su analogiska problema ir pradejau gilintis i situacija ir uzklydau i si sena straipsni :) . ( 6/2(1+2)=?) ir atsakyma gavau 1, o ne 9. Pagal jusu paaiskinima, tikrai supratau kodel 9 turetu but atsakymas, bet taip pat ir pagavau priezasti, kodel skaiciavau ir gavau 1, o ne devynis. Viska keicia „dinges“ daugybos zenklas tarp 2 ir skliaustu, jam esant buciau pasikliovus veiksmais is kaires i desine, o siuo atveju , kai jo nera, grizau prie raidziu atitikmens tarsi ten butu ne 2(1+2), o tarkim 2(a+b) ar pan, todel as visa ta jungini izvelgiu kaip konkretu skaiciu (a+b) :D , kurio turim du kartus daugiau :D ( nezinau kaip paaiskinti tai,kas verda galvoje :) ) Todel ir gaunu ta „klaidinga“ atsakyma 1, o ne 9. Matematika nesidomiu stipriai, bet buvau prijaucianti :) tad idomu ar yra kazkokios apibreztos taisykles del daugybos veiksmo nebuvimo pries skliaustus, ar tai tiesiog „neapibrezta“ ? :)

    PS> kai nori save pateisint, sugalvoji net absurdiskiausiu pateisinimu :D sugebejau net salyga tokiam uzdaviniui sugalvot ir gaut norima atsakyma ( ar nebus taip,kad viskas priklauso ir nuo aplinkybiu???? (vel teisinu save :D ))
    Salyga: Krepsyje yra 6 obuoliai. Dviem vaikams yra padalinama po viena obuoli(ryte), o veliau dar po du (per pietus). Kiek krepsiu reiks, kad apdalintume 2 vaikus obuoliais?
    (Zinau,kad absurdiska, gal kazkiek spragu yra salygoj ir galbut apsirikau ir neatitiks ji uzdavinio, beeeet kaip ir minejau teisinu , teisinu ir dar karta teisinu save del tokio pasirinkimo :D :) )

    1. Seniai jau rašiau šitą straipsnį, tai visų detalių neatsimenu, bet šiaip manau, kad „neadekvačiai/neaiškiai suformuluota sąlyga“ yra gana geras paaiškinimas.

  5. Jeigu matematiškai spręsime,tai veiksmų eilutė skliaustai-daugyba-dalyba-sudėtis-atimtis ( 6/2(1+2)=?). Jokių lygybių tarp daugybos ir dalybos,kaip ir tarp sudėties ir atimties nėra. Taigi atsakymas yra 1. Nežinau kaip informatikoje ar norint pavaidinti protingus,kai brūkšnys neva reiškia trupmeną,bet matematiškai brūkšnys ir dvitaškis reiškia tą patį dalybos veiksmą,kaip ir x ir taškas reiškia daugybą. Prieš skliaustus dažniausiai net nerašomas,nes ir taip aišku,kad reikia dauginti,jei nėra pažymėta kitaip. Vis mandresniais už kitus norima pasirodyti ar taip sukvailėjom,kad 4 klasės uždavinio nebeišsprendžiam? Nueikite pas pradinukų mokytoją,išmokys veiksmų eilutės.

    1. O, kažkas atrado šitą prieštvaninį įrašą ir rodo savo neišmanymą, kaip smagu :)

      Daugyba ir dalyba yra ekvivalentūs veiksmai, todėl jų prioritetas vienodas. Lygiai taip pat ir sudėtis bei atimtis. Jeigu jums mokykloje aiškino ne taip, tai skųskitės savo mokytojai (ar savo mokytoja), o ne matematika.

  6. Atsakyme „288“ nėra jokios logikos!
    Jei kažką daliname, tai daliname iš to kas eina po dalybos ženklu. Tad teisingas ir logiškas atsakymas yra „2“!

    Ir taip, prieš 40 metų mus mokino griežto eiliškumo: daugyba, dalyba. Sudėtis, atimtis. Jokių variacijų!

    Kaip raketas konstruot, kai net matematinių veiksmų sekos nežinom??? :)

    1. Vis kas keletą metų kas nors atranda šitą įrašą ir parodo savo nesupratimą. Siūlau perskaityti įrašą, tada dar galit komentarus paskaityti, o tada dar galit paliūdėti, kad prieš 40 metų jus mokė klaidingai. Pasikartosiu: daugyba ir dalyba yra ekvivalentūs veiksmai, todėl skaitomi ir atliekami iš kairės į dešinę. Lygiai taip pat ir sudėtis bei atimtis.

Komentuoti: rwc Atšaukti atsakymą

El. pašto adresas nebus skelbiamas.