Obtenir le développement décimal périodique d’un nombre rationnel en Python peut paraître au prime abord simple… Et pourtant, quand on y réfléchir un peu, on s’aperçoit que ce n’est pas si trivial que ça.
Développement décimal périodique en Python: un exemple
Considérons le nombre rationnel \(\displaystyle\frac{12233}{99000}\). Son écriture décimale est:$$\frac{12233}{99000}=0,123\underline{56}$$c’est-à-dire:$$\frac{12233}{99000}=0,12356565656\ldots$$
Il est de coutume de souligner la séquence des nombres qui se répètent indéfiniment. Cette séquence est appelée la période de l’écriture décimale.
Quand on pose la division, on a ceci:
On voit que dès que l’on obtient un reste déjà trouvé, cela signifie que la période à été trouvée. C’est ce constat qui va nous permettre d’implémenter cela en Python.
Développement décimal périodique en Python: implémentation
Comme nous allons nous servir des restes et des quotients de divisions euclidiennes, il nous faudra créer deux listes (par exemple rList et qList représentant respectivement la liste des restes et des quotients).
On crée une boucle tant que le reste n’est pas dans rList. Mais qu’allons-nous faire dans cette boucle? Comme dans la division posée ci-dessus, nous allons regarder le quotient et le reste de la division euclidienne de 10r par b.
Dès lors que nous savons quoi faire, l’implémentation est quasi-immédiate.
Une première implémentation
from fractions import Fraction def devdec(frac): a,b = Fraction(frac).numerator, Fraction(frac).denominator q, r = a//b, a%b qList = [str(q) , '.'] rList = [] while r not in rList: rList.append( r ) q, r = (r*10)//b, (r*10)%b qList.append( str(q) ) i = rList.index( r ) + 2 result = '' for n in range( len( qList ) ): if n != i: result += qList[n] else: result += '\033[1;33m'+qList[n] return result
Pour plus de pratique dans l’écriture de l’appel à la fonction, j’ai opté pour l’utilisation du module fractions (plutôt que de taper “devdec(a,b)”, j’ai préféré “devdec(‘a/b’)”, plus explicite à mes yeux).
Une implémentation avec le module rich.console
from fractions import Fraction from rich.console import Console def devdec(frac): result_console = Console() a,b = Fraction(frac).numerator, Fraction(frac).denominator q, r = a//b, a%b qList = [str(q) , '.'] rList = [] while r not in rList: rList.append( r ) q, r = (r*10)//b, (r*10)%b qList.append( str(q) ) i = rList.index( r ) + 2 result = '[white]' for n in range( len( qList ) ): if n != i: result += qList[n] else: result += '[u]'+qList[n] result + '[/u][/white]' result_console.print( result , style='white' )
>>> devdec('12233/99000')
Vous pouvez formater le texte comme vous le souhaitez (voir cet article pour mettre des couleurs ou autre).