Google Classroom
GeoGebraGeoGebra Classroom

Utolsó ... előre fuss!

Image
Az imént arra láttunk példát, hogy miként kezelhető a GeoGebrában az olyan "esemény"-sorozat, amelyről nem tudjuk előre, hogy mikor ér véget.
  • Röviden: Iteráció Az informatikában iterációnak nevezzük valamely eljárás ismétlődő végrehajtását. Az iteráció esetén a programozónak saját kezűleg kell gondoskodni a leállásról, különben az iteráció végtelen ciklussá válhat. (Ez a Google rövid válasza az "iteráció fogalma" kérdésre.)
E téma kezeléséhez a GeoGebra több egyéni ötletet igényel, mint a ciklusok kezelésére épülő programnyelvek. Most erre mutatunk egy újabb "esettanulmányt".

Az (alap)feladat:

Melyik az a legkisebb 4-re végződő természetes szám, amelynek az utolsó jegyét elhagyva és a szám elé írva a szám 4 -szeresét kapjuk? A feladat általános iskolások számára is kitűzhető, bár kell hozzá egy nem szokványos ötlet: Próbáljuk írásban elvégezni a feladatban kitűzött szorzást! . . . . 4 * 4 . . . . 6 4 * 4 . . . . 6 . . . 5 6 Az utolsó jegy 4-szerese lesz a szorzat utolsó jegye, amely egyben az eredeti szám utolsó előtti jegye, így folytathatjuk a szorzást mindaddig... ... amíg a szorzat elején meg nem jelenik a 4-es számjegy úgy, hogy nincs a szorzásban átvitelre váró tízes. Így a keresett szám 120564 *4 = 4102056. A feladat kitűzésében azért volt szükség a "legkisebb" kikötésre, mert enélkül az írásbeli szorzás addig folytatható, amíg meg nem unjuk. Ehelyett próbálkozzunk egy szerény általánosítással.

A (kissé általánosabb) feladat:

Melyik az a legkisebb n-re végződő természetes szám, amelynek az utolsó jegyét elhagyva és a szám elé írva a szám n -szeresét kapjuk, ahol n = 2, 3, ..., 9 ? Gyanútlanabb olvasóink, akik hozzáfognak az írásbeli szorzáshoz az előző ötletet kihasználva, csakhamar rá fognak jönni, hogy más számjegy nagyobb kitartást igényel, hosszabb lesz a keresett szám, már ha egyáltalán létezik. Ez a probléma már számítógépért - inkább programozási ötletért - kiált. Ezért foglalkozunk vele. Javasoljuk olvasóinknak, hogy először vegyék szemügyre az alábbi applet - talán meglepő - eredményeit, ezt követően próbálják elemezni, hogy miként kaphatjuk meg ezeket a többnyire igen nagy számokat.
Az algebra ablakot és a táblázatkezelőt vizsgálva látszik, hogy miután a ◀ ▷ gombokkal megadjuk n értékét, majd ezt a számjegyet átírjuk a táblázatkezelő A1 mezőjébe, az A oszlopban rendre megjelennek a keresett szám jegyei, B -ben az aktuális számjegy n-szeresének a tizesei C -ben az egyesei, amelyek egyben a következő sor A oszlopába kerülnek. Vagy nem. Akkor nem, ha az adott sor B oszlopába 0, a C oszlopába n kerül. Ezt a táblázat D oszlopába írt logikai változó "figyeli". Így a táblázatkezelő második sorában kialakítottuk a ciklus ismétlődő részét az un. ciklus magot, amit csak "le kell húzni" a szükséges mezőig (úgy, mint az excel programokban). Azok számára, akiknek ebben nincs kellő gyakorlatuk:
  • Jelöljük ki az egérrel a 2. sor A, B, C, D mezőjét, ekkor megjelenik a kijelölt rész jobb alsó sarkában egy jel.
  • Ezt megfogva húzzuk le legalább a 60-adik sorig, ezzel minden sorban a négy mező kapcsolata ugyanaz lesz, mint amit a második sorban kialakítottunk.
  • Az N=A1:A60 és k=D1:D60: parancsokkal listákba exportáljuk e két oszlop elemeit, eltávolítjuk az adott n esetén üresen maradó elemeket, végül a kiíráshoz megfordítjuk a számjegyek N sorozatát.
Az ördög persze a részletekben még ott van. Aki a fenti applet letöltése és offline futtatása helyett megkísérli ugyanezt a programot elkészíteni az innen kiolvasható utasítások alapján, várhatóan úgy jár, mint e sorok írója. Ez a program csak az első futás alkalmával működött helyesen. Úgy tűnt, hogy ez a láthatóan rossz eredmény csak úgy javítható ki, ha a Ctrl+R paranccsal mindent újraszámoltatunk. Egy program (pontosabban: programozói) hiba elemzése olykor több tanulsággal jár, mint sok jól megírt program. Jelen esetben pl. ezt a kellemetlen hibát az okozta, hogy nem tisztítottuk ki az előző futás "szemetét" az N és k listákból. Ezt az n változó scriptjébe írt N={} és k={} , valamint az utolsó D60 mező sriptjébe írt N=A1:A60 és k=D1:D60 parancsokkal lehet kiküszöbölni. Ezzel együtt a fenti applet észrevehetően lassan működik, aminek nyilván az az oka, hogy a táblázatkezelő 4*60 mezőjét akkor is kiszámolja, ha n=4, vagyis a keresett szám, csak 6 jegyű. Vajon nem lehetne ezt az egész problémát kevesebb számolással megoldani?

Tikk-takk



"A módszer olyan fogás amit kétszer alkalmazunk." / Pólya György/

Az alábbi appletben is bevezetünk egy tiktakk nevű rövid (mindössze kétállapotú) csúszkát, amelynek a - frissítéstől (mozgásától) függő - scriptjében helyezzük el a ciklus magját, amelyet ugyanott előállított logikai változó vezérel. Ebben lényegében négy szám(jegy) változik, ugyanúgy, mint az előző applet táblázatkezelőjében. Az újdonság az, hogy ezek a számokkal az írásbeli szorzás algoritmusát követve jobbról balra haladva számjegyekből álló szövegként előállítjuk a keresett számot, annak az n-szeresét, miközben külön kiírva megjelenítjük az írásbeli szorzásnál kapott "átvitt" számot. n kiválasztása ugyancsak a ◀ ▷ gombokkal oldható meg, az algoritmus a csúszka mozgatásával , vagy az algoritmus sebességének a megválasztásával követhető nyomon. Az ördög -mint mindig - a "Részletek"-ben van. A célunk éppen az alkalmazott technikai fogásoknak a bemutatása.
A fenti GeoGebra applet változói és az ezekkel végzett műveletek az algebra ablakban , valamint az n és a tiktakk nevű változók scriptjeiben vannak. A scriptekben csak azokkal a változókkal végezhetők műveletek, amelyek ugyanazon a néven szerepelnek az algebra ablakban is. (Figyelni kell arra, hogy ha az algebra ablakban új nevet kap egy változó, akkor ehhez "kézzel" lehet csak hozzáigazítani a scriptben szereplő nevet, ott nem változik meg automatikusan. Az algebra ablaknak csak azokat a változóit soroltuk fel, amelyeket a scriptek is használnak. Az algebra ablakban megadott A, B , C és D számok kezdő értékeit az n szám scriptjében adtuk meg. Az iterációt, és az iteráció végét jelző logikai értéket a tiktakk scriptje tartalmazza. Az algoritmus lényege - ugyanúgy mint az első appletben - az, hogy a "kézbe vett" A számjegy n-szerese az az egy- vagy kétjegyű D szám, amelynek a számjegyeit szétválasztjuk: C az egyesek B a tízesek száma. Majd ezekből az írásbeli szorzás szabályait követve ismét előállítjuk a következő D szorzatot. Figyeljük meg a tiktakk scriptjében a műveletek sorrendjét: előbb felhasználjuk D-t B és C meghatározásához, C érékét átadjuk A-nak, majd A és B értékéből kap új értéket D. Az algebra ablakban felsorolt változók közül emeljük ki azokat, amelyek lehetővé tették az olykor igen nagy számok megjelenítését. Itt már nyilvánvalóan nem magukat a számokat, hanem e számokból képzett betűket és szöveget jelenítettük meg. Például a C egyjegyű számot számjegy- azaz betű - formátummá a c=UnicodeBetűvé(C+48) utasítás alakítja át. Ezt "írtuk az elejére" az s és e nevű szövegeknek. Mindeközben a csupán szóközökből álló h változó hosszát úgy alakítottuk, hogy a keresett s szorzandó és e szorzat, valamint a tízes átvitelét jelző m számjegy minden lépésnél a helyére kerüljön. Hogyan működik a GeoGebra négy Unicode... függvénye? Miért kellett éppen 48-at adnunk a C számhoz, hogy megkapjuk a c számjegyet? Miként kezeli a GeoGebra az egymáshoz csatolt betűket és szavakat? Ezekre a kérdésekre egy erről szóló önálló anyagban próbálunk válaszolni.

Rövidebben....

... és kicsit gyorsabban is. Akit nem érdekel (eléggé), hogy miként kaptuk a keresett számokat, csak a számolás végeredményére kíváncsi, itt van a rövidített változat, Az appletet letöltve azonban szemügyre vehetjük a leegyszerűsített, és így talán áttekinthetőbb algoritmust.

A főnix számok

Megjegyezzük még, hogy fönix számoknak, vagy ciklikus számoknak szokás nevezni azokat a számokat, amelyeket valamilyen matematikai műveletnek alávetve valamilyen más ciklikus sorrendben kapjuk vissza az eredeti szám számjegyeit. Itt most nyolc főnix számot állítottunk elő amellett, hogy a GeoGebra eszköztárának finomságaira próbáltunk felhívni olvasóink figyelmét.