Určenie periodického rozvoja daného zlomku.

Literatúra:
http://www.math.ucla.edu/~radko/circles/lib/data/Handout-273-315.pdf (zo zlomku periodický rozvoj)
https://hr.userweb.mwn.de/numb/period.html (určenie dĺžky periody)

Majme zlomok $p/q$ kde $p,q$ sú nesúdeliteľné prirodzené čísla (tj. ich najväčší spoločný deliteľ je 1). Stačí uvažovať $p < q$, lebo oddeliť zo zlomku celú časť nám nerobí problém.

Dĺžka periody.

Najskôr určme dĺžku periody. Tá nezávisí na čitateli. Ak sa vyskytujú v rozklade na prvočísla menovateľa $q$ prvočísla 2, 5, bude niekoľko miest za desatinnou čiarkou "nepravidelných" (predperioda), opakovať sa budú potom.

Napr. $1/6 = 0.16666\dots$ Tento prípad ošetríme tak, že zlomok vynásobime najmenšou možnou mocninou 10 tak, aby činitele 2, 5 z menovateľa zmizli. Potom po určení periody zasa vydelíme tou mocninou 10 (posunieme desatinnú čiarku doľava). Činitele 2, 5 v menovateli teda dĺžku periody neovplyvnia.

Stačí uvažovať menovatele , ktoré nie sú deliteľné ani 5, ani 10 (teda ich posledné cifry môžu byť len 1, 3, 7, 9).

Pre menovateľ $q$ je dĺžka periody rovná najmenšiemu exponentu $k$ takému, že je $10^k -1$ je deliteľné $q$. Napr. pre $q = 41$ je dĺžka periody 5, pretože $10^5 - 1 = 99999 $ je deliteľné 41.

Prečo je to tak? Periodické desatinné rozvoje s periodou $p$ dĺžky $m$ sa dajú písať ako geometrický rad s quotientom $10^m$, napr. pre zlomok $1/7$ je $p = 142857\ (m = 6)$ a platí

$$ \frac{1}{7} = \frac{p}{10^6} + \frac{p}{{(10^6)}^2} + \cdots + \frac{p}{{(10^6)}^k} + \cdots = \frac{p}{10^6 (10^6 -1)}$$

Úloha. Naprogramovať funkciu dlzka_per(q) ktorá pre daný menovateľ q vráti dĺžku periody.

Určenie samotnej periody (aké cifry ju tvoria).

Najskôr vyeliminujeme (ak treba) z čísla $q$ činitele $2,5$ vynásobením zlomku $p/q$ čo možno najmenšou mocninou $10$ a zapamätame si ju.

Potom určíme dĺžku periody, nech je to $m$. Určenie cifier periody ukážeme na konkrétnom príklade pre zlomok $p/q = 3/7$. Tu je $m = 6$, ako sme videli hore.

Budeme postupne zvyšky pre delení čitateľa menovateľom násobiť 10-timi (posúvame sa s ciframi periody doprava) a to robíme $m$ razy. Vzniknuté podiely tvoria cifry periody.

$$ \begin{array}{ccc} 30 &=& {\bf 4}*7 + 2\\ 20 &=& {\bf 2}*7 + 6\\ 60 &=& {\bf 8}*7 + 4\\ 40 &=& {\bf 5}*7 + 5\\ 50 &=& {\bf 7}*7 + 1\\ 10 &=& {\bf 1}*7 + 3\\ \end{array} $$

Preto $1/7=0.\overline{428571}$.

Poznámka. Keby sme nechceli zisťovať dĺžku periody, tak sa zastavíme v horeuvedenom postupe na tom riadku, ktorý vyzerá ako prvý riadok (v našom konkrétnom príklade by to bol ďalší riadok, keby sme pokračovali).

Úloha. Naprogramovať funkciu perioda(p,q) ktorá pre daný zlomok s s čitateľom p a menovateľom q vráti cifry v jeho periode, príp aj predperiodu.