bas de page

 

Avec les développements égyptiens :
Exercices sur les fractions (collège)
Découvrir les algorithmes (lycée et plus)

En s'aidant d'un logiciel

Alain Barnier
 

Rappelons que les Égyptiens qui ne connaissaient que quelques fractions de numérateurs différents de 1, exprimaient ces dernières comme des sommes de fractions unitaires. D'où l'appellation de développements égyptiens.

En, bref

   Vous allez pouvoir faire calculer les élèves avec des fractions en leur faisant vérifier ou chercher des développements égyptiens d'ordre n d'une fraction P/Q ou de l'unité. En se limitant à des valeurs simples bien choisies, c'est possible dès le collège.

   Au lycée, vous pourrez aussi faire découvrir et appliquer l'algorithme qui permet de trouver toutes les solutions dans divers cas.

Que fait le logiciel

   Rappelons qu'un développement égyptien de l'unité ou d'une fraction est son écriture sous la forme d'une somme de fractions ayant toutes 1 pour numérateurs (fractions unitaires).

   Le logiciel permet de trouver et de compter tous les développements égyptiens de n d'éléments (d'ordre n) de l'unité ou de n'importe quelles fractions.

   Il permet aussi d'imposer des contraintes : parité, maximum, minimum...

   Il distingue deux cas, celui où toutes les fractions du développement sont différentes (Type 2) et celui où certaines peuvent être égales (Type 1).

   Une extension permet de déterminer les développements les plus courts possible pour une fraction donnée.

   On peut choisir d'afficher toutes les solutions d'un seul coup ou de proche en proche, ou seulement certaines d'entre elles à intervalles réguliers.

   Ce logiciel d'utilisation libre est téléchargeable à partir de sa page Web de présentation : Fractions égyptiennes.
http://alainb-sites.fr/programmes/

Ses limites

   Il permet de calculer avec des entiers de tailles quelconques, mais les limitations sont dues au temps de calcul pour les grandes valeurs.

Quelles élèves concernent-ils ?

   Dès le collège, la vérification de développements simples et même leur recherche est possible.

   Au lycée et au-dessus, la découverte et la pratique de l'algorithme permettant de trouver toutes les solutions dans différents cas, ainsi que sa programmation.

Quelques applications

Au collège

1.      Vérifier que les sommes : 1/3 + 1/3 et 1/2 + 1/6, valent exactement 2/3 toutes les deux.
Que les sommes : 1/10 + 1/10 et 1/6 + 1/30, valent exactement 1/5 chacune.
Que les sommes : 1/5 + 1/5 et 1/3 + 1/15, valent exactement 2/5 chacune.
Que les sommes : 1/7 + 1/7 et 1/4 + 1/28, valent exactement 2/7 chacune.

2.      Vérifier que les sommes : 1/4 + 1/4 + 1/6, 1/3 + 1/6 + 1/6, 1/3 + 1/4 +1/12 et 1/2 + 1/10 + 1/15 valent exactement 2/3 toutes les quatre.
Que les sommes : 1/4 + 1/4 + 1/8, 1/3 + 1/6 + 1/8 et 1/2 + 1/10 + 1/40 valent exactement 5/8 toutes les trois.

3.      Vérifier que les sommes : 1/20 + 1/20 + 1/20 + 1/20, 1/18 + 1/18 + 1/18 + 1/30 et 1/15 + 1/15 + 1/20 + 1/60 valent exactement 1/5 chacune. De même pour la somme 1/10 + 1/11 + 1/111 + 1/12210 (*).
Vérifier que 1/20 = 1/40 + 1/40 et trouver 2 sommes simples de 5 fractions unitaires, qui valent exactement à 1/5 chacune.

4.      En vous servant du logiciel vous pourrez vous exercer sur d'autres exemples de ce type.

(*) Pour les sommes comportant des fractions avec de grands nombres entiers on pourra, pour calculer exactement les numérateurs et les dénominateurs, se servir de la calculatrice.

Au lycée et plus

1.      Approche du problème par le même genre d'exercice qu'au collège. Puis recherche de toutes les solutions dans des cas simples par les méthodes de résolution d'équations diophantiennes au programme ( ?!).

2.      Démontrer que pour toute fraction P/Q, il existe une infinité de développements égyptiens possibles.

3.      Recherche de toutes les solutions dans des cas simples ou un peu plus complexes par une méthode algorithmique, la somme P/Q et la valeur de n, étant fixées (voir ci-dessous des explications sur cette méthode).

4.      Montrer que pour n donné, il ne peut exister qu'un nombre fini de développements égyptiens d'ordre n, tous égaux à la même fraction P/Q.

5.      Écriture d'un programme mettant en oeuvre l'algorithme.

Quelques explications à donner ou suggérer aux élèves

   Soit n l'ordre des développements égyptiens que nous cherchons pour la fraction P/Q. Celle-ci pouvant être plus petite, égale ou plus grande que l'unité.

   Appelons, x1 , x2 , x3 , ... , xn, les dénominateurs des n fractions unitaires composant ces développements.

   Le problème revient donc à résoudre l'équation :

1/x1 + 1/x2 + 1/x3 + ... + 1/xn = P/Q

   x1 , x2 , x3 , ... , xn étant des nombres entiers positifs à déterminer et P/Q une fraction positive (pouvant être égal 1). C'est une équation diophantienne à n inconnues.

   Nous pouvons considérer comme une même solution tous les n–uplets (x1 , x2 , x+ , ... , xn), qui ne diffèrent que par l'ordre de leurs termes.

   Quand on cherche des développements égyptiens, on peut tolérer que certaines valeurs des inconnues soient égales entre elles (type 1) ou imposer que toutes les inconnues soient différentes (type 2).

   On déterminera toutes les solutions en se limitant aux valeurs des inconnues telles que, pour le type 1 :
1/x1 <= 1/x2 <= 1/x3 <= ... <= 1/xn,

et pour le type2 :
1/x1 < 1/x2 < 1/x3 < ... < 1/xn.

   Dans le cas d'une recherche de type 1, si l'on autorise la valeur 1, la somme P/Q doit être inférieure ou égale à n, et si cette valeur 1 n'est pas autorisée, P/Q doit être inférieure ou égale à n/2.

   Pour une recherche de type 2, si l'on autorise la valeur 1, la somme P/Q doit être inférieure ou égale à :
1 + 1/2 + 1/3 + ... + 1/n, qui est la somme harmonique d'ordre n.

   Et si cette valeur 1 n'est pas autorisée, P/Q doit être inférieur ou égal à :
1/2 + 1/3 + ... + 1/n + 1/(n +1), qui est la somme harmonique d'ordre (n + 1) moins 1.

   Cela ne voudra pas dire pour autant que, même si la somme P/Q respecte ces conditions, un développement égyptien pour cette valeur de n, existe.

   Nous pouvons classer les solutions grâce à l'ordre dit lexicographique. Nous choisirons l'ordre décroissant. Une solution (y1 , y2 , y3 , ... , yn) sera inférieure à une solution (x1 , x2 , x3 , ... , xn), si :

·         toutes les valeurs des yi sont égales aux valeurs correspondantes des xi jusqu'à une certaine valeur de i strictement inférieur à n.

·         pour la valeur immédiatement suivante, y(i + 1) < x(i + 1).

 

Un algorithme pour ce problème

On va chercher toutes les solutions en testant toutes les valeurs possibles dans l'ordre lexicographique.

N, P/Q, le Type (1 ou 2) et un minimum m pour x1, sont fixés.

Max1 et Min1 étant respectivement un majorant et un minorant des valeurs possibles pour x1 :
On prendra, Max1 = Partie entière de [(Q×n)/P].
On prendra, Min1 = Partie entière de (Q/P) + 1.         (*) Démonstration.

Posons,  i = 1.

Si Min1 < m , posons Min1 = m.
Si Max1 < Min1 : FIN DE L'ALGORITHME
Sinon : BOUCLE 1 - Tant que i est non nul.

Nous avons attribué des valeurs à x1, x2, ... ,xi.

Ces i premiers termes de la somme sont donc supposés connus, les (n - i) termes suivants devront avoir pour somme :

P/Q - (1/x1 + 1/x2 + ... +1/xi) = p/q

Max(i + 1) et Min(i + 1) étant respectivement un majorant et un minorant des valeurs possibles pour x(i + 1) :

On prendra,  Max(i + 1) = Partie entière de [(q×(n - i))/p].

On prendra,  Min(i + 1) = Partie entière de [q/p] +1.      (*) Démonstration 

·         Si Min(i + 1) < xi, pour le type 1, posons Min(i + 1) = xi.

·         Si Min(i + 1) <= xi, pour le type 2, posons Min(i + 1) = xi + 1.

·         Si Max(i + 1) >= Min(i + 1) et i < (n – 1) :

Posons x(i + 1) = Max(i + 1) et augmentons i d'une unité. 

·         Sinon :

o   Si (i = n – 1) et q/p est un entier :

Posons x(n) = q/p
On a une solution, affichons là et comptons là.

o   BOUCLE 2 - Tant que i diminue et est différent de 0.

Si :  x(i) > Min(i), posons x(i) = x(i) – 1
Sinon : i = i – 1

(*) Démonstration (pour Max1 et Min1 prendre i = 0) :

Si Max(i + 1) et Min(i + 1) sont respectivement un majorant et un minorant des valeurs possibles pour x(i + 1), pour le type 1 et pour le type 2, on a la relation :

1/Min(i + 1) < p/q <=( n - i)/Max(i + 1)

La première inégalité étant stricte tant que (i + 1) est différent de n.
Avec : p/q = P/Q – (1/x(i + 1) + 1/x(i + 2) + ...+ 1/xn).
Soit :Max(i + 1) <= (q×(n - i))/p,

On prendra, Max(i + 1) = Partie entière [ (q×(n - i))/p].
Et : q/p < Min(i + 1),
On prendra Min(i + 1) = Partie entière de [q/p] + 1, tant que i < (n-1).

En effet :

- Max(i + 1) doit toujours être supérieur ou égale à x(i +1). Toutes les inconnues suivantes sont supérieures ou égales à x(i + 1), leurs inverses seront inférieurs ou égaux à 1/x(i +1). Comme il y en a (n – i), leur somme qui vaut p/q doit être inférieure à n/x(i + 1), soit : p/q <= (n – i)/x(i + 1).

Comme on doit toujours avoir x(i +1) <= Max(i + 1) on doit avoir aussi  :

(n – i)/Max(i+1) <= (n – i)/x(i + 1).
En prenant Max(i + 1) tel que p/q = (n – i)/Max( i + 1) on aura une valeur possible de Max(i + 1).
Soit : Max(i + 1) = (q*(n – i))/p.
et choisira, Max(n – i) = Partie entière [ (q*(n – i))/p] .

- Min(i + 1) doit toujours être inférieur ou égal à x( i + 1).

1/Min(i + 1), est donc toujours supérieur ou égale à 1/x(i + 1).
p/q est supérieur à 1/x(i + 1) qui est un des termes positifs d'une somme valant p/q.
En choisissant Min(i + 1) tel que 1/Min(i + 1) = p/q, on aura une valeur possible pour Min(i + 1).

Soit : Min(i + 1) = q/p.
On prendra, Min(i + 1) = q/p arrondi à la valeur supérieure.
Remarquons si i est inférieur à n-1 on pourra prendre Min(i + 1) = Partie entière de [q/p] + 1.

Il y a des contraintes pour Max(i + 1) et Min(i + 1) :
Pour les équations du type 1 :
Max(i + 1) >= Min(i + 1) >= xi >= m ( Minimum choisi pour x1),
Pour les équations du type 2 :

Max(i + 1) >= Min(i + 1) > xi >= m.

Ci-dessous, cet algorithme traduit en langage Python. Le programme fonctionne, grâce à ce langage, pour des entiers de tailles quelconques. Il n'est pas aussi rapide, quand les nombres sont très grands, que les programmes principaux de cet article. Ceux-ci, écrits en C++ avec l'extension NT, sont plus complets.
http://alainb-sites.fr/programmes/

En téléchargements ici :

Le code python de ce programme : egyptiens.py et son exécutable : egyptiens.exe
http://alainb-sites.fr/programmes/egyptiens.py
http://alainb-sites.fr/programmes/egyptiens.exe

Le code : egyptiens2.py et son exécutable : egyptiens2.exe de ce programme amélioré.
http://alainb-sites.fr/programmes/egyptiens2.py
http://alainb-sites.fr/programmes/egyptiens2.exe

Le premier affiche systématiquement toutes les solutions. On peut contrôler cet affichage dans le second. Vous trouverez sur le site des versions de ces 2 programmes python utilisant le module Fraction et qui sont plus rapides quand les nombres sont grands.

calcul =1

while (calcul > 0) :

# Affichage d'explications :

    print (" ")
   
print ("   DEVELOPPEMENTS  EGYPTIENS  d'Ordre n d'une fraction  P/Q")
   
print (" ")
   
print ("   P/Q = 1/x1 + 1/x2 + 1/x3 + ... + 1/xn ")
   
print (" ")
   
print ("   Avec pour le Type 1 : x1 <= x2 <= x3 <= ... <= xn")
   
print (" ")
   
print ("   Avec pour le Type 2 : x1 < x2 < x3 < ... < xn")
   
print (" ")

# Entree des donnees :

    calcul = 0
   
n =int( input("   Ordre  n  (n>1) ? : "))
   
print (" ")
   
P = int(input("   P  ? : "))
   
print (" ")
   
Q = int(input("   Q  ? : "))

    print (" ")
   
T = int(input("   Type  (1 ou 2)  ? : "))-1
   
print (" ")
   
m = int(input("   Minimum pour x1  ? : "))
   
if(m<1):
       
m=1
   
print (" ")

# Initialisation des variables :

    sol = 0
   
Max = [0]
   
Min = [0]
   
x = [0]
   
for j in range (1 , n+2):
       
Max.append(0)
       
Min.append(0)
       
x.append(0)
   
i=1

# Valeurs de Max[1], Min[1] et valeur de depart pour x[1].

    Max[1]=((Q*n)//P)
   
Min[1]= (Q//P)+1
   
if (Min[1]<m) :
       
Min[1]=m
   
if (Max[1]<Min[1]) :
       
i=0
   
else :
       
x[1]= Max[1]

# Boucle pour i >= 1

    while (i!=0):

# Calcul de p et q et simplification de p/q      

        p=0
       
q=1
       
for j in range(1, i+1):
           
p = p*x[j]+q
           
q = q*x[j]
       
p = P*q - p*Q
       
q = Q*q
       
p1=p
       
q1=q
       
while (p1 != q1) :
           
if (p1 > q1) :
               
p1 = p1 - q1
           
else:
               
q1 = q1 - p1    
       
p =(p//p1)
       
q =(q//p1)

# valeurs de Max[i + 1] et Min[i +1]  :

        Max[i+1]= (q*(n-i))//p  
       
Min[i+1]= (q//p)+1
       
if (Min [i+1] <= x[i]):
           
Min[i+1]=x[i]+T

# Recherche des valeurs x[i] à tester et affichage des solutions.

        if ((Max[i+1]>=Min[i+1])and(i<(n-1))):
           
x[i+1]=Max[i+1]
           
i=i+1
       
else :
           
if ((i==(n-1)) and ((q % p)==0)):
                   
x[n]= (q // p)
                   
if (x[n]>= x[n-1]+T):
                       
sol= sol + 1
                       
print(sol, end="  :  ")
                       
for j in range (1, n+1):
                           
print(x[j], end="  |  ")
                       
print (" ")
           
s=1
           
while ((i!=0)and(s==1)):
               
s=0
               
if (x[i]> Min[i]):
                   
x[i]= x[i] - 1
               
else :
                   
i=i-1
                   
s=1

# Effacement des variables liste en fin de calcul.

    Max.clear()
   
Min.clear()
   
x.clear()

# Reprise d'un autre calcul ou fin.

    print (" ")
   
calcul =int(input("   Nouveau calcul (1: oui, 0: Fin) ? : "))
       

if (calcul <=0):

    exit()

Algorithme appliqué pour :

n = 3 et P/Q = 1/2

Type 2

1 :     4      6     12
2 :     4     5     20
3 :     3     10     15
4 :     3     9     18
5 :     3     8     24
6 :     3     7     42

Type 1 :

1 :     6     6     6
2 :     5     5     10
3 :     4     8     8
4      4     6     12
5 :     4     5     20
6 :     3     12     12
7 :     3     10     15
8 :     3     9     18
9 :     3     8     24
10 :     3     7     42

n = 4 et P/Q = 1

Type 2 :

1 :     2     4     6     12
2 :     2     4     5     20
3 :     2     3     10     15
4 :     2     3     9     18
5 :     2     3     8     24
6 :     2     3     7     42

Type 1 :

1 :     4     4     4     4
2 :     3     4     4     6
3 :     3     3     6     6
4 :     3     3     4     12
5 :     2     6     6     6
6 :     2     5     5     10
7 :     2     4     8     8
8 :     2     4     6     12
9 :     2     4     5     20
10 :     2     3     12     12
11 :     2     3     10     15
12 :     2     3     9     18
13 :     2     3     8     24
14 :     2     3     7     42

Renseignements pratiques

   Ce logiciel peut être utilisé sur tout ordinateur 64 bits sous Windows. Il est gratuit et vous pouvez vous en servir librement.

   Vous pouvez l'utiliser en projetant son écran de sortie avec un vidéoprojecteur. Ou alors le faire utiliser par les élèves, seuls ou par deux, derrière leur ordinateur en salle d'informatique. Ils peuvent aussi l'avoir aussi, chez eux, sur leur propre PC.

   Il est téléchargeable à partir de la page Web suivante :

https://alainb-sites.fr/programmes/

   On y trouve aussi des liens vers des sites concernant le sujet et des exemples d'utilisation du logiciel.

   Et également des liens vers les pages Web d'autres logiciels à usages pédagogiques que je propose.

(Pour le téléchargement, comme c'est un fichier «.exe », passez outre les recommandations de prudence de Windows).

   La première fois que vous le lancerez (passez toujours outre les recommandations de prudence de Windows), il s'ouvrira dans une petite fenêtre avec, une dimension, des couleurs et une police qui ne vous conviendront peut-être pas. En cliquant droit dans la barre du haut de cette fenêtre, vous aurez accès à ses propriétés et pourrez les modifier à votre aise. Ces modifications resteront enregistrées pour les utilisations suivantes.

   Les entrées sont sécurisées, et une faute de frappe ou une entrée incompatible ne plante pas le logiciel.

   Il a été testé de nombreuses fois et ne semble pas avoir de bugs.

   L'interface du logiciel est simple et toutes les commandes (en nombre limité) sont expliquées ou rappelées en cours d'utilisation.

   Il est écrit en C++ accompagné de son extension NTL qui permet de calculer avec des entiers de tailles quelconques.

Alain Barnier
Professeur de mathématiques retraité,
membre actif de l'APMEP
abarnier@wanadoo.fr

Cet article est sous licence Creative Commons Attribution 4.0 International. https://creativecommons.org/licenses/by/4.0/deed.fr

 

haut de page

Association EPI
Avril 2024

 

Accueil

Articles