Utolsó ... előre fuss!

Az [url=https://www.geogebra.org/m/pX7a97q5#material/cxteenhy]imént[/url] 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. [br][br][list][*]Röviden: [i][b]Iteráció [/b][/i]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 "[i]iteráció fogalma[/i]" kérdésre.) [/*][/list] [br]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:
[i]Melyik az a legkisebb [b]4[/b]-re végződő természetes szám, amelynek az utolsó jegyét elhagyva és a szám elé írva a szám [b]4[/b] -szeresét kapjuk?[/i][br][br]A feladat általános iskolások számára is kitűzhető, bár kell hozzá egy nem szokványos ötlet:[br]Próbáljuk írásban elvégezni a feladatban kitűzött szorzást![br] . . . . 4 * 4 . . . . 6 4 * 4[br] . . . . 6 . . . 5 6 [br][br]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... [br]... 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 "[i]legkisebb" [/i]kikötésre, mert enélkül az írásbeli szorzás addig folytatható, amíg meg nem unjuk.[br][br] Ehelyett próbálkozzunk egy szerény általánosítással.
A (kissé általánosabb) feladat:
[i]Melyik az a legkisebb [b]n[/b]-re végződő természetes szám, amelynek az utolsó jegyét elhagyva és a szám elé írva a szám [b]n[/b] -szeresét kapjuk, ahol [b]n = 2, 3, ..., 9[/b] ? [br][br][/i]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.[br][br]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 [b]n[/b] értékét, majd ezt a számjegyet átírjuk a táblázatkezelő [b]A1[/b] mezőjébe, az [b]A[/b] oszlopban rendre megjelennek a keresett szám jegyei, [b]B[/b] -ben az aktuális számjegy [b]n[/b]-szeresének a tizesei [b]C[/b] -ben az egyesei, amelyek egyben a következő sor [b]A[/b] oszlopába kerülnek. [br][br]Vagy nem. Akkor nem, ha az adott sor [b]B[/b] oszlopába [b]0[/b], a [b]C[/b] oszlopába [b]n[/b] kerül. Ezt a táblázat [b]D[/b] oszlopába írt logikai változó "figyeli".[br]Így a táblázatkezelő második sorában kialakítottuk a ciklus ismétlődő részét az un.[i] ciklus mag[/i]ot, amit csak "le kell húzni" a szükséges mezőig (úgy, mint az excel programokban). [br][br]Azok számára, akiknek ebben nincs kellő gyakorlatuk: [br][list][*]Jelöljük ki az egérrel a[b] 2.[/b] sor [b]A, B, C, D[/b] 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 [b]N=A1:A60[/b] és [b]k=D1:D60[/b]: parancsokkal listákba exportáljuk e két oszlop elemeit, eltávolítjuk az adott [b]n[/b] esetén üresen maradó elemeket, végül a kiíráshoz megfordítjuk a számjegyek [b]N[/b] sorozatát.[/*][/list][br]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 [b]Ctrl+R[/b] paranccsal [u]mindent újraszámoltatunk[/u]. [br][br]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 [b]N[/b] és [b]k[/b] listákból. Ezt az [b]n[/b] változó scriptjébe írt [b]N={}[/b] és [b]k={}[/b] , valamint az utolsó [b]D60[/b] mező sriptjébe írt [b] N=A1:A60[/b] és [b]k=D1:D60[/b] parancsokkal lehet kiküszöbölni. [br][br]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 [b]n=4[/b], vagyis a keresett szám, csak 6 jegyű.[br][br]Vajon nem lehetne ezt az egész problémát kevesebb számolással megoldani?
Tikk-takk
 [right] [i]"A módszer olyan fogás amit kétszer alkalmazunk."[br] / Pólya György/[/i][/right]Az alábbi appletben is bevezetünk egy [b]tiktakk [/b]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. [br][br]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 [b]n[/b]-szeresét, miközben külön kiírva megjelenítjük az írásbeli szorzásnál kapott "átvitt" számot.[br][br][b]n[/b] 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.[br][br]Az ördög -mint mindig - a "[u]Részletek[/u]"-ben van. [br]A célunk éppen az alkalmazott technikai fogásoknak a bemutatása. [br]
A fenti GeoGebra applet változói és az ezekkel végzett műveletek az algebra ablakban , valamint az [b]n[/b] és a [b]tiktakk[/b] nevű változók scriptjeiben vannak. [br][br]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.[br][br]Az algebra ablaknak csak azokat a változóit soroltuk fel, amelyeket a scriptek is használnak. [br][br]Az algebra ablakban megadott [b]A, B , C[/b] és[b] D [/b]számok kezdő értékeit az [b]n[/b] szám scriptjében adtuk meg. Az iterációt, és az iteráció végét jelző logikai értéket a [b]tiktakk [/b]scriptje tartalmazza.[br][br]Az algoritmus lényege - ugyanúgy mint az első appletben - az, hogy a "kézbe vett" [b]A[/b] számjegy [b]n[/b]-szerese az az egy- vagy kétjegyű [b]D [/b]szám, amelynek a számjegyeit szétválasztjuk:[b] C[/b] az egyesek [b]B[/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ő [b]D[/b] szorzatot.[br]Figyeljük meg a [b]tiktakk[/b] scriptjében a műveletek sorrendjét: előbb felhasználjuk [b]D[/b]-t [b]B[/b] és [i][b]C[/b][/i] meghatározásához, [b]C[/b] érékét átadjuk [b]A[/b]-nak, majd [b]A [/b] és [b]B [/b]értékéből kap új értéket [b]D.[/b] [br][br]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. [br]Itt már nyilvánvalóan nem magukat a számokat, hanem e számokból képzett [i]betűket[/i] és [i]szöveget [/i]jelenítettük meg. Például a [b]C [/b]egyjegyű számot számjegy- azaz betű - formátummá a [b]c=UnicodeBetűvé(C+48) [/b]utasítás alakítja át. Ezt "írtuk az elejére" az [b]s[/b] és [b]e[/b] nevű szövegeknek. Mindeközben a csupán szóközökből álló [b]h [/b]változó hosszát úgy alakítottuk, hogy a keresett [b]s[/b] szorzandó és [b]e [/b]szorzat, valamint a tízes átvitelét jelző [b]m [/b]számjegy minden lépésnél a helyére kerüljön. [br][br]Hogyan működik a GeoGebra négy[b] Unicode... [/b] függvénye? Miért kellett éppen 48-at adnunk a [b]C[/b] számhoz, hogy megkapjuk a [b]c [/b]számjegyet? Miként kezeli a GeoGebra az egymáshoz csatolt betűket és szavakat? Ezekre a kérdésekre [url=https://www.geogebra.org/m/pqezfyyx]egy erről szóló önálló anyag[/url]ban próbálunk válaszolni.
Rövidebben....
... és kicsit gyorsabban is. [br][br]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 [url=https://hirmagazin.sulinet.hu/hu/pedagogia/a-fonix-szamokrol]fönix számok[/url]nak, 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.[br][br]Itt most nyolc [url=https://wiki.mayor.hu/doku.php?id=oktatas:matematika:feladatok:szamelmelet:fonixszam]főnix számot[/url] állítottunk elő amellett, hogy a GeoGebra eszköztárának finomságaira próbáltunk felhívni olvasóink figyelmét. [br]
[url=https://hu.wikipedia.org/wiki/F%C5%91nix]A főnix madár[/url][center][/center]

Information: Utolsó ... előre fuss!