Zoznam úloh

2. Príbeh o Dášenke a minci

Zadanie

*Ak máte akékoľvek otázky ohľadom tejto úlohy, napíšte Baške na *

“Dášenka, pamätáš si ako som ťa učil počítať?”, pýta sa ocko Bob.

“Áno. Nula, jeden, dva, tri, štyri až po veeeeľmi veľa.”, odpovedá malá Dáša s úsmevom.

“Tak dnes ti ukážem hru, ktorú sa s tými číslami môžeš hrať.”

“Jéj, ďalšia hra. Aké sú pravidlá?”

“Každé ráno odo mňa dostaneš dve rovnaké nenulové čísla. Potom si vezmeš túto mincu, a budeš si ňou hádzať. Vždy keď hodíš hlavu, pripočítaš prvé číslo k druhému a na papier si zaznačíš H. Keď hodíš znak, tak pripočítaš druhé číslo k prvému a na papier si zaznačíš Z.”

“Môžeš mi to ukázať na príklade?”

“Samozrejme. Začnem napríklad s dvoma štvorkami. Povedzme že som hodil postupne znak, hlava, znak a znak. Aké budú výsledné čísla?”

Dášenka sa zamyslela, zobrala si papier a začala sčítavať. Nakoniec vyhlásila: “Tridsať dva a dvanásť!”.

Bob si pozrel jej papier a našiel tam nasledovnú tabuľku:

Hody Z H Z Z
Prvé 4 8 8 20 32
Druhé 4 4 12 12 12

“Správne. Na konci dňa mi potom donesieš ukázať aj postupnosť znakov, aj výslednú dvojicu čísel, dobre?”

To ho už ale Dášenka poriadne nepočúvala. Začala si mincu hádzať a pokračovala sčítavaním 32 a 12.

“Ešte jedna vec, kým dávaš pozor. Aby si sa neupísala do zbláznenia, tak ak hodíš viacero rovnakých znakov za sebou, tak stačí ak napíšeš číslo, koľkokrát to bolo, a písmenko Z alebo H. Teda náš príklad by sa dal zapísať ako 1Z,1H,2Z. Dobre?”

“Áno oci.” a už jej nebolo.

Ďalší deň

Na druhé ráno dostala Dášenka od Boba dve rovnaké čísla a celý deň si hádzala mincou.

Avšak večer prišla za svojím ockom celá nešťastná, lebo stratila všetky svoje výpočty, a s nimi aj začiatočné dve čísla a postupnosť hodov. Jediné čo jej ostalo boli výsledné dve čísla.

Nanešťastie si ani Bob už nepamätá čísla, ktoré jej ráno zadal. Obrátil sa preto na vás:

“Ahojte PRASKáči. Vedeli by ste z posledných dvoch čísel zistiť, ktoré čísla som zadal ráno Dášenke a ako vyzerala celá postupnosť hodov? Alebo to už nejde?”

Úloha

Tak si to zhrňme. Na začiatku máme čísla $p$ a $d$, ktoré sú rovnaké a kladné. Postupne s nimi robíme operácie dvoch typov:

  • Z: pripočítame $d$ ku $p$, takže vznikne dvojica čísel $p+d$ a $d$

  • H: pripočítame $p$ ku $d$, takže vznikne dvojica čísel $p$ a $d+p$

Potom, ako sme spravili niekoľko takýchto operácií, sme získali nejaké dve čísla $P$ a $D$. V prvých troch podúlohách je vašou úlohou zistiť (ak je to možné) začiatočnú hodnotu čísel $p$ a $d$. Okrem toho zistite aj postupnosť hodov mince v skrátenom formáte.

Skrátený formát je postupnosť dvojíc: číslo a písmenko (Z alebo H). Číslo je vždy kladné väčšie ako nula, a hovorí koľkokrát po sebe Dášenka hodila konkrétnu stranu mince. V rámci tejto skrátenej postupnsoti sa vždy strieda hlava a znak, takže nemôže nastať napríklad takýto prípad: $$3Z,5H,7Z,6Z,8H,1Z,5H$$ pretože by sme to vedeli skrátiť a prepísať $7Z,6Z$ na $13Z$.

Táto úloha sa skladá z niekoľkých podúloh:

  1. (2 body) Dášenka doniesla Bobovi čísla $P=15$ a $D=35$. Viete zistiť postupnosť hodov a hodnotu čísel $p$ a $d$, ktoré ráno od Boba dostala? Poprípade vysvetlite Bobovi, že sa to už zistiť nedá.

  2. (2 body) Ak by Dášenka doniesla Bovovi čísla $P=111$ a $D=9$, vedeli by ste zistiť postupnosť hodov a hodnotu počiatočných čísel $p$ a $d$?

  3. (5 body) Vedeli by ste riešiť takýto problém pre ľubovoľnú dvojicu čísel $P$ a $D$? Popíšte postup, ktorý z dvoch čísel $P$ a $D$ zistí počiatočné čísla $p$ a $d$ a tiež skonštruuje skrátenú postupnosť hodov.

Snažte sa, aby bol váš postup dostatočne rýchly. Vzorové riešenie by vedelo len s pomocou papiera a pera vypočítať výsledok aj pre čísla $1\,000\,000$ a $14$, poprípade pre ľubovoľnú dvojicu čísel veľkých až milión.

  1. (3 body) Vedeli by ste dokázať, že počiatočné číslo $p$ delí obe konečné čísla $P$ a $D$?

  2. (3 body) Vedeli by ste dokázať, že ak nejaké číslo $x$ delí obe výsledné čísla $P$ a $D$, tak delí aj pôvodné číslo $p$?

Čo vyplýva z vlastností d) a e) o čísle $p$?

Pripomeňme si, že ráno dostala Dášenka dve rovnaké čísla $p$ a $d$, ktoré sú väčšie ako nula. Následne niekoľkokrát hodila mincou a podľa toho, čo jej padlo spravila jednu z nasledovných operácií.

  • Z (znak): pripočítame $d$ ku $p$, takže vznikne dvojica čísel $p+d$ a $d$

  • H (hlava): pripočítame $p$ ku $d$, takže vznikne dvojica čísel $p$ a $d+p$

Na konci dňa mala Dáša dvojicu čísel $P$ a $D$. Našou úlohou bolo z týchto čísel zistiť, s akou hodnotou $p$ začínala a tiež prísť na to, čo jej padalo na minci.

Na začiatok urobme niekoľko užitočných pozorovaní:

  • Dáša nikdy nemohla mať záporné číslo alebo nulu.

Obe čísla $p, d$ sú ráno väčšie ako nula a operácie $Z$ a $H$ k nim hodnoty pričítavajú. No a súčet dvoch kladných čísel môže byť iba kladný.

  • Okrem rána (pred prvým hodom) sa Dášine čísla nemôžu rovnať.

Predstavme si, že v nejakom momente má Dášenka čísla $P’$ a $D’$. Po ďalšom hode bude mať čísla $P’+D’$ a $D’$ (resp. $P’$ a $D’+P’$). Ak by sa ale tieto dve čísla rovnali, tak platí $P’+D’ = D’$ (resp. $P’ = D’+P’$), čo znamená, že $P’ = 0$ (resp. $D’ = 0$). Podľa predchádzajúceho pozorovania sa však niečo také nemôže stať.

Podúloha a)

Dášenka doniesla Bobovi čísla $P=15$ a $D=35$.

Ako zistíme začiatočné čísla a postupnosť hodov? Najlepšie by bolo odsimulovať Dášenkino hádzanie, nevieme však, kde začať. Mohli by sme teda vyskúsať všetky možné začiatočné hodnoty $p$. Tých je iba 15. Uvedomme si totiž, že platí $p \leq P = 15$ a $p \leq D = 35$. Nepoznáme však ani postupnosť hodov, museli by sme vyskúšať všetky možnosti toho, čo mohla Dáša hodiť.

Skúšať všetky možnosti hodov je naozaj náročné a počet možností stúpa veľmi rýchlo s rastúcim počtom hodov. V prvom kroku mohla hodiť buď $H$ alebo $Z$. To sú dve možnosti. V druhom kroku síce platí to isté, ale už musíme rátať s tým, čo padlo v prvom kroku, takže máme štyri možnosti: $ZZ, ZH, HZ, HH$. Pri troch hodoch je tých možností opäť dvakrát viac, lebo pre každú z postupností pre dva hody máme dve možnosti čo mohlo padnúť ďalšie: $ZZ\pmb{Z}, ZZ\pmb{H}, ZH\pmb{Z}, ZH\pmb{H}, HZ\pmb{Z}, HZ\pmb{H}, HH\pmb{Z}, HH\pmb{H}$. Každým hodom sa počet možností, ktoré musíme vyskúšať, zdvojnásobí. Už pre 10 hodov musíme vyskúšať viac ako $1\,000$ možností, preto to nevyzerá ako správny postup.

Skúsme sa teda na to pozrieť zozadu. Pri tomto postupe aspoň poznáme výsledné hodnoty $P$ a $D$. Čísla, ktoré mala Dášenka pred posledným hodom si označme $P’$ a $D’$, ich hodnotu zatiaľ nepoznáme. Následne padla minca, čísla sa zmenili a dostali sme čísla $P$ a $D$. Posledný hod mohol byť $Z$ aj $H$, skúsme preto vyskúšať obe možnosti.

Posledný hod: znak

Ak čísla pred posledným hodom boli $P’$ a $D’$ a hodili sme $Z$, tak nové čísla musia byť $P’+D’$ a $D’$. Zároveň vieme, že nové čísla sú $P = 15$ a $D = 35$ (keďže to bol posledný hod), takže musí platiť:

$$P’+D’ = P = 15$$ $$D’ = D = 35$$

Z týchto rovníc vyplýva, že $D’ = 35$ a $P’ + 35 = 15$, teda $P’ = -20$.

To sa ale vylučuje s naším pozorovaním – nemôžeme mať záporné číslo. Posledný hod teda nemohol byť znak.

Posledný hod: hlava

Budeme postupovať úplne rovnako ako predtým.

Čísla pred posledným hodom boli $P’$ a $D’$ a hodili sme $H$, takže nové čísla musia byť $P’$ a $D’+P’$. Zároveň vieme, že nové čísla sú $P = 15$ a $D = 35$ (keďže to bol posledný hod), takže musí platiť:

$$P’ = P = 15$$ $$D’+P’ = D = 35$$

Z toho jasne vyplýva, že $P’ = 15$ a $D’ + 15 = 35$, teda $D’ = 20$.

Obe čísla su kladné, takže posledný hod mohol byť $H$. Keďže sme však hod znak vylúčili, posledný hod musela byť hlava.

Zvyšné hody

Teraz však máme úplne rovnakú úlohu, ale s číslami $15$ a $20$. Rovnakou úvahou ako predtým by sme zistili, že posledný hod nemohol byť znak (čísla pred hodom by museli byť $-5$ a $20$), ale musel byť hlava. Takže dostaneme čísla $15$ a $5$. A takto postupujeme, až kým nemáme dve rovnaké čísla:

Hody Z Z H H
Prvé 5 10 15 15 15
Druhé 5 5 5 20 35


Začiatočné čísla $p$ a $d$ boli rovné číslu 5, a skrátená postupnosť hodov je 2Z, 2H.

Tento príklad bol pekný. Keď sme išli odzadu, tak v každom kroku nám vyšla iba jedna možnosť hodu, druhá nebola možná, lebo viedla k záporným číslam. Musí to tak však byť vždy? Vieme si z tohto príkladu odvodiť aj nejaké všeobecnejšie pozorovania?

  • Ak máme výsledné čísla $P$ a $D$, tak predchádzajúce čísla $P’$ a $D’$ vieme zistiť pomocou jedného odčítania (ak vám nasledujúce rovnice nie sú jasné, skúste sa vrátiť vyššie, kde sme odvádzali hodnoty $P’$ a $D’$):

  • Hod $Z$:

$$P’ = P - D$$ $$D’ = D$$

  • Hod $H$:

$$P’ = P$$ $$D’ = D - P$$

  • Ak sú čísla $P$ a $D$ rôzne, tak práve jedno z $P-D$ alebo $D-P$ je kladné.

  • Aby sme nedostali záporné čísla, tak vždy odčítavame menšie číslo od väčšieho. To zároveň určuje, posledný hod mince. Ak je menšie prvé číslo, posledný hod bol $H$, ak je menšie druhé číslo, posledný hod bol $Z$.

  • Keďže čísla sú vždy rôzne, tak nikdy nemáme na výber medzi hlavou a znakom. Rovnaké čísla môžeme mať iba na začiatku nášho zisťovania, keď sme prišli k hľadaným číslam z rána.

  • Postupnosť hodov zisťujeme odzadu.

Podúloha b)

Dášenka doniesla Bobovi čísla $P=111$ a $D=9$.

Rovnako ako v podúlohe a) to vieme spraviť postupným odčítavaním odzadu, čím dostaneme takýto výsledok:

Akcia H H Z Z Z Z Z Z Z Z Z Z Z Z
Prvé 3 3 3 12 21 30 39 48 57 66 75 84 93 102 111
Druhé 3 6 9 9 9 9 9 9 9 9 9 9 9 9 9


Určite vás ale nebavilo odčítavať 9 stále a stále dookola – až dvanásťkrát. Nedalo by sa to spraviť rýchlejšie?

Vieme že 9 potrebujeme odčítať od čísla 111 toľkokrát, aby toto prvé číslo bolo menšie ako 9. Takže ak je rozdiel medzi 111 a 9 rovný 102, tak potrebujeme odčítať toľko 9, aby ich súčet bol aspoň 102. Zároveň to ale nemôžeme prehnať a dostať sa k záporným číslam. Hľadáme teda najmenší počet 9, ktorých súčet je aspoň 102.

Naša otázka teda je: “Koľkokrát musíme vynásobiť číslo 9, aby sme dostali číslo 102?”, na čo si vieme odpovedať pomocou delenia $102 / 9 \doteq 11,3$. Vidíme, že 11 deviatiek nebude stačiť a potrebujeme ich 12 (lebo $12 \cdot 9 = 108$ a to je naozaj väčšie ako 102). Mohli by sme teda povedať, že potrebný počet deviatiek je číslo $\frac{102}{9}$ zaokrúhlené nahor, teda 12.

Iný pohľad na to je, že potrebujeme od 111 odčítavať 9 kým nebudeme dostávať záporné čísla. Čo je vlastne inak povedané, “Koľkokrát sa deviatka zmestí do čísla 111?”. To sa dá vyjadriť podielom $111 / 9 \doteq 12,3$, ktorý zaokrúhlime nadol, dostaneme teda číslo $12$.

Vidíme, že oba postupy nám dávajú rovnaký výsledok – 12 odčítaní, ktorý sedí s naším predošlým riešením. Namiesto dvanástich odčítaní teda spravíme jedno delenie, do skrátenej postupnosti hodov si zapíšeme $12Z$ a nové hodnoty $P$ a $D$ budú $111 - 12\cdot 9$, teda 3 a 9.

Tento postup vieme samozrejme zovšeobecniť. Majme čísla $P$ a $D$, o ktorých predpokladajme, že $P > D$ (ak to bude naopak, tak postup bude takmer rovnaký). Chceme preto zistiť, koľko znakov v rade padlo na minci. Pýtame sa teda, koľkokrát sa hodnota $D$ zmestí do $P$, čo vieme zistiť pomocou celočíselného delenia $P / D$ (celočíselné delenie zaokrúhľuje nadol), túto hodnotu si označme $k$. Následne si do postupnosti hodov zapíšeme $kZ$, hodnota $D$ ostane nezmenená a novú hodnotu $P$ vypočítame ako $P - k\cdot D$.

Môžete si všimnúť ešte jednu zaujímavú vlastnosť. Od čísla $P$ odpočítavame hodnotu $D$ najviac krát ako vieme. To čo nám ostane je preto zvyšok po delení čísla $P$ číslom $D$. Tomu naozaj zodpovedá aj hodnota $P - k\cdot D$. A keďže väčšina programovacích jazykov vie zvyšok po delení počítať priamo, najrýchlejší spôsob ako zistiť novú hodnotu $P$ je použiť príkaz P = P%D (% označuje zvyšok po delení).

Čo ak je nová hodnota nula? Túto možnosť, že $P - k\cdot D = 0$ sme doteraz ignorovali. Všimnime si však, že v takomto prípade je číslo $P$ násobkom čísla $D$. Ak teda od $P$ odčítam $D$ iba $k-1$ krát, dostanem dve rovnaké čísla, obe rovné $D$. Takáto situácia preto nastane iba raz, a to na konci nášho výpočtu. Do skrátenej postupnosti vtedy zapíšeme $(k-1)Z$ a za hodnoty čísel $p$ a $d$ dosadíme aktuálne $D$.

Podúloha c)

Vedeli by ste riešiť takýto problém pre ľubovoľnú dvojicu čísel $P$ a $D$?

V predošlých častiach sme si ukázali všetky potrebné postupy, ostáva spojiť ich dokopy.

  • Ak je $P > D$ tak zisťujeme dĺžku sekvencie znakov

$k = \frac{P}{D}$ zaokrúhlené nadol

hodnota $D$ sa nemení

  • Ak $P$ nie je deliteľné $D$

zmeníme hodnotu $P$ na $P - k\cdot D$

zapíšeme $kZ$ do skrátenej postupnosti

  • Ak je $P$ deliteľné $D$

zmeníme hodnotu $P$ na $P - (k-1)\cdot D$ (čo je vlastne $D$)

zapíšeme $(k-1)Z$ do skrátenej postupnosti

  • Ak je $D > P$ tak zisťujeme dĺžku sekvencie hláv

$k = \frac{D}{P}$ zaokrúhlené nadol

hodnota $P$ sa nemení

  • Ak $D$ nie je deliteľné $P$

zmeníme hodnotu $D$ na $D - k\cdot P$

zapíšeme $kH$ do skrátenej postupnosti

  • Ak $P$ delí $D$

zmeníme hodnotu $D$ na $D - (k-1)\cdot P$ (čo je vlastne $P$)

zapíšeme $(k-1)H$ do skrátenej postupnosti

Tento postup spraví jeden krok nášho postupu. Budeme ho preto opakovať až kým sa čísla $P$ a $D$ nebudú rovnať. Všimnite si naviac, že v každom kroku sa zmení to, ktoré číslo je väčšie, takže naša skrátená postupnosť bude striedať hlavy a znaky.

Tento postup vieme samozrejme zapísať aj v ľubovoľnom programovacom jazyku. Skúste si pozrieť nižšie uvedenú implementáciu v Pythone. Zistíte, že sa veľmi podobá tomu, ako sme si to zapísali pred chvíľou.

print("Napis prve cislo:")
P = int(input())                                    # napr. číslo 111
print("Napis druhe cislo:")
D = int(input())                                    # napr. číslo 9

zoznam = []                                         # tu zapisujeme skrátenú postupnosť
while P != D:                                       # kým sa čísla P a D nerovnajú opakuj
    print(P,D)
    if P > D:
        k = P // D # celočíselné delenie
        if P % D != 0:  # číslo P nedáva po delení D zvyšok 0, nie je ním teda deliteľné
            P = P - k*D
            zoznam.append((k, 'Z'))
        elif P % D != 0:  # zvyšok je 0, P je deliteľné D
            P = P - (k-1)*D
            zoznam.append((k-1, 'Z'))
    elif D > P:
        k = D // P # celočíselné delenie
        if D % P != 0: # číslo D nie je deliteľné P 
            D = D - k*P
            zoznam.append((k, 'H'))
        elif D % P == 0:  # číslo D je deliteľné P
            D = D - (k-1)*P
            zoznam.append((k-1, 'H'))

# keďže zisťujeme ťahy odzadu, tak musíme zoznam obrátiť
zoznam.reverse()
print("Skrateny zoznam hodov:", zoznam)             # [(2, 'H'), (12, 'Z')]

# vypiseme aj zaciatocne cislo
print("Rano dostala Dasa cisla rovne hodnote:", P)  # 3

Je to dostatočne rýchle?

Pokúsme sa zamyslieť nad tým, koľkokrát musíme zopakovať vyššie uvedený postup. V jednom kroku sa rozhodneme, ktoré z čísel $P$ a $D$ je väčšie a toto väčie číslo upravíme, pričom bude menšie ako druhé číslo. Takže to, ktoré číslo je väčšie, sa bude v každom kroku striedať. Ak je najskôr $P > D$, tak hneď potom bude $P < D$, následne opäť $P > D$, a tak ďalej až kým $P = D$.

Pri každom tomto kroku vložíme do skrátenej postupnosti jeden záznam, teda jedno číslo a hod $Z$ alebo $H$. Trvanie nášho programu bude teda priamo úmerné dĺžke skrátenej postupnosti. Stále však nevieme, aká dlhá bude táto postupnosť a či to náš algoritmus zvládne aj pre čísla veľkosti milión.

Pozrime sa bližšie na to, ako sa mení číslo $P$. V každom druhom kroku sa veľkosť tohto čísla zmenší, keďže hodnoty $P$ a $D$ sa zmenšujú nastriedačku. Ako rýchlo sa toto číslo zmenšuje? Ak by sa v každých dvoch krokoch zmenšilo iba o 1, tak je to zlé. Pretože naša skrátená postupnosť by potom mala dĺžku $2\cdot P$, čo je veľa. Môže sa však číslo $P$ zmenšiť o tak málo? Skúste nájsť takú dvojicu $P$ a $D$, že po úprave čísla $P$ sa toto číslo zmenší iba o 1.

V skutočnosti totiž platí, že hodnota čísla $P$ sa musí pri jednej úprave zmenšiť aspoň na polovicu. Ukážme si, prečo je to tak. Všimnite si, že číslo $P$ sa mení v závislosti od čísla $D$. Dokonca sme si ukázali, že výsledná hodnota $P$ musí byť po úprave menšia ako hodnota $D$. Ak je teda číslo $D$ malé, bude malá aj nová hodnota $P$. Nová hodnota $P$ preto bude aspoň polovičná ak platí, že $D \leq \frac{P}{2}$ – číslo $D$ je menšie ako polovica $P$ a preto aj $P$ bude po úprave menšie ako jeho polovica.

Čo však v prípade, keď $D > \frac{P}{2}$? Pozrime sa na to, čo spraví náš algoritmus. Najskôr zistí, koľkokrát sa do čísla $P$ zmestí číslo $D$. Odpoveďou je raz, pretože $D$ je väčšie ako polovica $P$, takže dvakrát sa tam nezmestí. V ďalšom kroku sa od $P$ jedenkrát odpočíta číslo $D$. No a výsledok musí byť menší ako polovica $P$. Ak totiž máte číslo $P$ a zoberiete z neho viac ako jeho polovicu (číslo $D$), ostane vám menej ako polovica (nová hodnota $P$).

Tým pádom sa po každých dvoch krokoch hodnota čísla $P$ zmenšila aspoň na polovicu. Čo sa stane, ak bude číslo $P$ milión? V najhoršom prípade sa toto číslo zakaždým zmenší presne na polovicu až kým z neho neostane číslo 1, čo je najmenšie číslo, s ktorým Dášenka mohla začínať.

$$1000000 / 2 = 500000 / 2 = 250000 / 2 = 125000 / 2 = 62500 / 2 = 31250 / 2 = 15625 / 2 \doteq 7812 / 2 = 3906$$ $$3906 / 2 = 1953 / 2 \doteq 976 / 2 = 488 / 2 = 244 / 2 = 122 /2 = 61 / 2 \doteq 30 / 2 = 15 / 2 \doteq 7 / 2 \doteq 3 / 2 \doteq 1$$

Predošlý zápis znázorňuje, ako by sa hodnota $P$ zmenšovala1. Vidíme, že na to, aby sme z nej dostali 1 potrebujem iba 19 krokov. Samozrejme, nezabudnime, že hodnota $P$ sa zmení iba v každom druhom kroku, niekedy sa totiž musí zmenšovať aj $D$. Stále z toho však vychádza, že nám stačí 38 krokov. A aj to iba v najhoršom možnom prípade.

Pre zaujímavosť, číslo 19 – koľkrát môžme vydeliť číslo $1\,000\,000$ číslom 2 – je aj približná hodnota dvojkového logaritmu z čísla $1\,000\,000$. Logaritmovanie je v podstate opak umocňovania.

Keď chceme skrátene zapísať súčin veľa dvojok, tak to môžme skrátene napísať pomocou umocnenia: $$2\cdot 2\cdot 2\cdot 2\cdot 2\cdot 2\cdot 2\cdot 2 = 2^8$$

Poprípade súčin $k$ dvojek je $2^k$.

Logaritmom sa označuje odpoveď na otázku: Na koľkú musíme umocniť číslo 2, aby sme dostali výsledok $y$? Ak by sme teda chceli zistiť, na koľkú treba umocniť 2, aby sme dosali číslo 256 (teda hľadáme $x$ rovnice $2^x = 256$), tak odpoveďou by bol práve $\log_{2}(256)$, čo je 8.

O našom postupe by sme preto mohli povedať, že potrebuje najviac $2\cdot \log_{2}P$ krokov.

Podúloha d)

Vedeli by ste dokázať, že počiatočné číslo $p$ delí obe výsledné čísla $P$ a $D$?

Začať môžeme tým, že sa vrátime ku konkrétnym príkladom z úloh a) a b). Všimnime si, že v oboch prípadoch platí, že číslo $p$ nedelí len výsledné čísla $P$ a $D$, ale všetky čísla, ktoré si Dášenka zapísala. V podúlohe a) vidíme iba násobky čísla 5, v podúlohe b) iba násobky čísla 3. To je podozrivé.

Pozrime sa teda, čo sa deje keď Dášenka začne hádzať mincou. Začína s dvoma číslami $p$ a $d$, ktoré sú rovnaké, a teda zjavne sú obe deliteľné číslom $p$. Po prvom hode mincou môže mať Dášenka zapísané čísla $2p$ a $p$, ktoré sú opäť deliteľné číslom $p$. Po druhom hode mincou má buď dvojicu $3p$ a $p$, alebo dvojicu $2p$ a $3p$, čo sú všetko násobky $p$.

No a táto vlastnosť sa nezmení. Čo totiž robí Dášenka? Jedno číslo nahradí súčtom a druhé nechá nezmenené. Ale ak sčítame dve čísla deliteľné číslom $p$, tak opäť dostaneme číslo deliteľné $p$. Skúsme si to ukázať o niečo formálnejšie. Číslo deliteľné $p$ si vieme zapísať ako $a\cdot p$ pre nejaké kladné $a$. Zoberme si teda ľubovoľné dve čísla deliteľné $p$, ktoré vieme zapísať ako $a \cdot p$ a $b \cdot p$. Ich súčet je $a\cdot p + b\cdot p = (a + b)\cdot p$. Tento súčet je ale zjavne opäť deliteľný číslom $p$, lebo sa dá zapísať ako $c\cdot p$, pre $c = a + b$.

Keďže Dášenka začína s dvoma číslami deliteľnými číslom $p$ (dvojica $p$, $d$) a robí iba operáciu sčítanie, všetky čísla, ktoré zapisuje sú naďalej deliteľné číslom $p$. Tým pádom to platí aj pre výsledné čísla $P$ a $D$.

Podúloha e)

Vedeli by ste dokázať, že ak nejaké číslo $x$ delí obe výsledné čísla $P$ a $D$, tak delí aj pôvodné číslo $p$?

Skúsme postupovať podobne ako v podúlohe d). Zoberme si číslo $x$, ktoré delí aj $P$ aj $D$. Tieto dve čísla sa teda dajú zapísať ako $P = a\cdot x$ a $D = b \cdot x$, pre vhodné $a$ a $b$. Čo sa s týmito číslami dialo krok pred tým? V podúlohe a) sme si ukázali, že hodnoty predchádzajúcich čísel získame tak, že menšie číslom nezmeníme a od väčšieho to menšie odčítame. Tvárme sa teda, že $P > D$, pre opačný prípad by sme robili to isté, akurát naopak.

Hodnota $D$ ostane rovná $b \cdot x$, ale hodnota $P$ sa zmení na rozdiel týchto dvoch čísel. Bude preto platiť, že $P = a\cdot x - b\cdot x$. To však vieme zapísať ako $P = (a-b)\cdot x$. Nová hodnota čísla $P$ bude teda opäť deliteľná číslom $x$.

Naviac, táto vlastnosť platí všeobecne a vyššie máme uvedený aj jej dôkaz. Ak si zoberieme dve čísla deliteľné $x$, tak ich rozdiel bude opäť deliteľný číslom $x$. Pri našom postupe teda budeme celý čas pracovať s číslami, ktoré sú deliteľné číslom $x$. To bude platiť aj keď sa na konci našeho postupu dostaneme k číslam $p$ a $d$. Ak teda číslo $x$ delí výsledné čísla, delí aj začiatočné $p$.

Čo vyplýva z vlastností d) a e) o čísle $p$?

V podúlohe d) sme ukázali, že číslo $p$ delí obe čísla $P$ a $D$. Takúto hodnotu označujeme ako spoločný deliteľ. Podúloha e) zase hovorí, že každý spoločný deliteľ $x$ čísel $P$ a $D$ delí aj číslo $p$. Z toho ale vyplýva, že $x \leq p$. Uvedomme si, že ak nejaké číslo $a$ delí číslo $b$, tak $b$ musí byť väčšie alebo rovné $a$.

Ak je teda každý spoločný deliteľ menší alebo rovný ako $p$ tak to značí, že $p$ je najväčší spoločný deliteľ čísel $P$ a $D$.

Na záver

V tejto úlohe sme teda celý čas počítali najväčšie spoločné delitele dvoch čísel. A postup, ktorý ste počas toho vymysleli sa volá Euklidov algoritmus a je to najrýchlejší spôsob ako túto hodnotu vypočítať.

Viac o Euklidovom algoritme si môžete prečítať na Wikipédii (https://sk.wikipedia.org/wiki/Euklidov_algoritmus). Jediný rozdiel s naším riešením je ten, že klasický Euklidov algoritmus skončí, keď je jedno z čísel rovné nule a nie keď sú rovnaké. Vďaka tomu netreba špeciálne ošetrovať podmienku deliteľnosti čísla $P$ číslom $D$.


1. Takýto zápis samozrejme nie je matematicky správny. Určite totiž neplatí, že $488 / 2 = 244 / 2$. Pekne však znázorňuje, čo sme chceli ukázať, a to je trochu úspornejšie ako písať $488 / 2 = 244; 244 / 2 = 122 \ldots$.[↩](#fnref1)
Pre odovzdávanie sa musíš prihlásiť.