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.
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.
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.