Expansão decimal de números racionais

Comecemos por um resultado conhecido de cálculo.
Se $|q| <1$, então a série
\[
\sum_{n=0}^\infty q^n
\]
é convergente e a sua soma é igual a
\[
\frac{1}{1-q}.
\]
Exercício

No bloco anterior, estudamos expansões de números naturais na base $b$. Escrevemos naturais na base $b$ como $[a_na_{n-1}\cdots a_1a_0]_b$. Quando $b=10$, escrevemos o mesmo número como $[a_na_{n-1}\cdots a_1a_0]$ (sem explicitamente indicar a base).

Uma fração decimal (ou expansão decimal) não negativa é uma sequência (possivelmente infinita) de algarismos na forma $[a_na_{n-1}\cdots a_1a_0,a_{-1}a_{-2}\cdots]$ onde $a_{i}\in\{0,\ldots,9\}$. O número representado pela fração é
\begin{align*}
a&=\sum_{k=n}^{-\infty}a_k10^k=\sum_{k=0}^n a_k10^k+\sum_{k=1}^{\infty}a_{-k}10^{-k}\\&=
[a_na_{n-1}\cdots a_1a_0]+\sum_{k=1}^{\infty}a_{-k}10^{-k}.
\end{align*}
A expressão acima mostra que cada fração decimal não negativa pode ser escrita como a soma de um número natural e uma fração decimal na forma $[0,a_{-1}a_{-2}\cdots]$. Como os números naturais foram tratados na unidade anterior, aqui vamos focar apenas frações na forma $[0,a_{-1}a_{-2}\cdots]$. Uma fração natural desta forma pode ser finita ou infinita. Quando a sequência de algarismos depois da vírgula é infinita, então a fração é infinita; caso contrário a fração é finita. Uma fração finita pode ser escrita na forma $[0,a_{-1}a_{-2}\cdots a_{-n}]$. Note que uma fração finita pode ser considerada infinita adicionando uma sequência infinita de zeros e assim nós frequentemente assumimos que as frações analizadas são infinitas.

Para qualquer sequência (possivelmente infinita) de algarismos, a expansão $[0,a_{1}a_{2}\cdots]$ representa um número real entre zero e um.
Precisa provar que a série
\[
\sum_{k=1}^\infty a_{k}10^{-k}
\]
é convergente e converge a um número entre zero e um. Como $0\leq a_i\leq 9$ para todo $i$, obtemos que
\[
\sum_{k=1}^\infty a_{k}10^{-k}\leq\sum_{k=1}^\infty 9\cdot 10^{-k}=\frac 9{10}\sum_{k=0}^\infty 10^{-k}=\frac 9{10}\frac 1{1-1/10}=1.
\]
Como os termos da série na última linha são não negativas, a conta acima mostra que a série que corresponde à expansão $[0,a_{1}a_{2}\cdots]$ é convergente e converge a um número não negativo menor ou igual a $1$.

Note que o mesmo número real pode ser escrito de maneiras distintas como fração decimal. Por exemplo, $1,00\cdots=0,99\cdots$.

Considere a fração decimal $[0,a_{1}a_{2}\cdots]$. Esta fração chama-se periódica se existem $m\geq 0$ e $r\geq 1$ tais que $a_{r+k}=a_k$ para todo $k> m$. A sequência $[a_1\cdots a_m]$ chama-se pré-período, enquanto a sequência $[a_{m+1}\cdots a_{m+r}]$ chama-se período da fração.

Uma fração periódica com pré-período $[a_1\cdots a_m]$ e período $[a_{m+1}\cdots a_{m+r}]$ tem a forma
\[
[0,a_1\cdots a_ma_{m+1}\cdots a_{m+r}a_{m+1}\cdots a_{m+r}\cdots];
\]
ou seja, a fração começa com a sequência $[a_1\cdots a_m]$ e depois a sequência $[a_{m+1}\cdots a_{m+r}]$ está se repetindo. Neste caso escrevemos a fração como
\[
[0,a_1\cdots a_m\overline{a_{m+1}\cdots a_{m+r}}].
\]
Por exemplo
\[
1/44=0,02272727\cdots=0,02\overline{27}.
\]

As seguintes afirmações são verdadeiras.
  1. Toda expansão decimal periódica representa um número racional.
  2. Se $a/b$ é um número racional tal que $0<a<b$, então sua expansão decimal é periódica
1. Considere a expansão decimal
\[
[0,a_1a_2\cdots]=[0,a_1a_2\cdots a_m\overline{a_{m+1}\cdots a_{m+r}}]
\]
e seja $a$ o número representado por esta expansão. Pelo lema anterior, $0\leq a\leq 1$. Sejam $u$ e $v$ os números naturais
\[
u=[a_1a_2\cdots a_m]\quad\mbox{e}\quad v=[a_{m+1}\cdots a_{m+r}].
\]
Tem-se que
\begin{align*}
a&=\sum_{k=1}^\infty a_k10^{-k}=\frac u{10^{m}}+\sum_{k=1}^\infty \frac{v}{10^{m+kr}}\\&=\frac u{10^{m}}+\frac{v}{10^{m+r}}\sum_{k=0}^\infty \frac{1}{10^{kr}}=\frac{u}{10^{m}}+\frac{v}{10^{m+r}}\frac{1}{1-10^{-r}}.
\end{align*}
Ora note apenas que o número no lado direito da última equação é um número racional.

2. Assuma que $0< a<b$ e considere o racional $q=a/b$. Vamos determinar a sequência de algarismos para $q$. Seja $a_0=a$, $q_0=0$ e escreva, usando o Teorema de Divisão de Euclides,
\[
10a_0=q_1b+a_1\quad\mbox{onde}\quad 0\leq a_1<b.
\]
Assuma que as sequências $a_0,\ldots,a_k$ e $q_0,\ldots,q_k$ são determinadas, e defina $q_{k+1}$ e $a_{k+1}$ pela equação
\[
10a_k=q_{k+1}b+a_{k+1}\quad\mbox{onde}\quad 0\leq a_{k+1}<b
\]
usando o Teorema de Divisão de Euclides.

Afirmamos que a expansão decimal de $a/b$ é $[0,q_1q_2\cdots]$. Para isso nós precisamos verificar que
\[
\sum_{k=1}^\infty q_k10^{-k}\to \frac ab.
\]
De fato, nós provaremos que
\[
10^k a=\sum_{i=1}^k10^{k-i}q_ib+a_k
\]
Para $k=1$, esta afirmação segue da expressão acima para $10a_0=10a$. Assuma que esta igualdade é verdadeira para algum $k$. Então
\begin{align*}
10^{k+1}a&=10\cdot 10^ka=10\cdot\left(\sum_{i=1}^k10^{k-i}q_ib+a_k\right)
\\&=\sum_{i=1}^{k}10^{k+1-i}q_ib+10a_k\\&=
\sum_{i=1}^{k}10^{k+1-i}q_ib+q_{k+1}b+a_{k+1}\\&=\sum_{i=1}^{k+1}10^{k+1-i}q_ib+a_{k+1}.
\end{align*}
Então a afirmação é verdadeira para todo $k$. Segue, para todo $k\geq 1$, da mesma afirmação que
\[
\frac ab=\sum_{i=1}^k10^{-i}q_i+a_k/(10^kb)=[0,q_1\cdots q_k]+\frac{a_k}{10^kb};
\]
e assim
\[
\frac ab-[0,q_1\cdots q_k]=\frac{a_k}{10^kb}<\frac{b}{10^kb}=10^{-k}.
\]
Isso implica que a sequência $[0,q_1\cdots q_k]$ converge para $a/b$ quando $k\to\infty$ e então a expansão do número racional $a/b$ é $[0,q_1q_2\cdots]$.

Finalmente precisamos provar que a expansão $[0,q_1q_2\cdots]$ de $a/b$ é periódica. Para isso, note que a sequência $a_1,a_2,\ldots$ é uma sequência de números naturais com $a_i\in\{0,\ldots,b-1\}$ para todo $i$. Então vai existir $m$ e $r$ tal que $a_{m+r}=a_m$. Logo
\[
q_{m+r+1}b+a_{m+r+1}=10a_{m+r}=10a_m=q_{m+1}b+a_{m+1}.
\]
Obtemos pela unicidade na Teorema de Divisão de Euclides que $q_{m+r+1}=q_{m+1}$ e $a_{m+r+1}=a_{m+1}$. Similarmente, $q_{m+r+2}=q_{m+2}$ e $a_{m+r+2}=a_{m+2}$ e mais geralmente
\[
q_{k+r}=q_{k}\quad e \quad a_{k+r}=a_{k}.
\]
para todo $k\geq m+1$. Ou seja, a expansão do número $a/b$ é periódoca.

A demonstração do resultado anterior dá um algoritmo para calcular a expansão de um número natural $a/b$ onde $0<a<b$. Considere por exemplo o racional $1/54$. Seguindo a demonstração do teorema para $a=1$ e $b=54$, fazemos a seguinte conta.\begin{align*}
10a=10=0\cdot 54+10\quad &\Rightarrow\quad q_1=0\mbox{ e }a_1=10\\
10a_1=100=1\cdot 54+46\quad &\Rightarrow\quad q_2=1\mbox{ e }a_2=46\\
10a_2=460=8\cdot 54+28\quad &\Rightarrow\quad q_3=8\mbox{ e }a_3=28\\
10a_3=280=5\cdot 54+10\quad &\Rightarrow\quad q_4=5\mbox{ e }a_4=10\\
10a_4=100=1\cdot 54+46\quad &\Rightarrow\quad q_5=1\mbox{ e }a_5=46
\end{align*}
Observamos que $a_4=a_1$ como foi previsto na demonstração do teorema e a computação vai se repetir a partir deste ponto. Obtemos então que
\[
\frac 1{54}=0,0\overline{185}.
\]

Obtemos também como consequência do teorema anterior que existem números irracionais no intervalo $[0,1]$. Por exemplo, considere o número
\[
a=0,1010010001000010000010000001\cdots.
\]
Pelo lema anterior, $a$ é um número real, mas a sua expansão decimal não é periódoca, portanto este número não é racional.

Exatamente como a expansão dos números naturais pode ser calculada em qualquer base $d\geq 2$, a expansão dos números racionais também pode ser calculada em bases $d$ tal que $d\geq 2$. Os resultados em uma base arbitrária são muito similares aos resultados na base $d=10$ (caso decimal) e estes detalhes são omitidos. No entanto recomendamos que o leitor traduza os resultados acima para uma base $d\neq 10$.

Computação com Python

Vamos implementar o algoritmo obtido na demonstração do Teorema na linguagem Python. De fato, nós implementamos o algoritmo em qualquer base (não apenas na base decimal), pois a diferença é muito pequena. Pretendemos escrever uma função que toma números naturais $a$, $b$, $d$ tais que $0<a<b$ e $d\geq 2$ e devolve o pré-período e o período da expansão de $a/b$ na base $d$.


def ExpansaoDecimal( a, b, d ):
    
    # a é menor que b
    assert a<b
    
    #inicializamos as listas dos dígitos e restos
    digitos, restos = [], [a]
    
    while True:
        # calculamos o seguinte dígito a colocamos na lista
        digitos.append( d*a//b )
        # calculamos o próximo valor de a
        a = d*a % b
        # verificamos se a já apareceu entre os restos
        if a in restos:
            # se sim, ind será o índice de a na lista restos
            ind = restos.index( a )
            # devolvemos a pré-período e o período
            return digitos[0:ind], digitos[ind:len(digitos)]
            
        restos.append(a)

Podemos usar esta função para verificar a conta no Exemplo.


>>> ExpansaoDecimal( 1, 54, 10 )
>>> ([0], [1, 8, 5])

Obtemos o mesmo resultado, nomeadamente que o pré-período de $1/54$ é $[0]$ e o período é $[185]$.