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:

développement décimal périodique python

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

Notre fonction devdec(‘a/b’) devra retourner une chaîne de caractères indiquant l’écriture décimale de la fraction \(\frac{a}{b}\) en mettant en relief la période.

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


0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x