Recherche des solutions

Macro WordBasic utilisée pour la recherche

  Fonctionnement
 Choix de la "profondeur" d'analyse
 Listing de la macro
 Performances
Fonctionnement vers haut de page La macro procède comme suit :
  • une série de boucles imbriquées balaye les valeurs successives de a1, b1, c1,..., en partant de la valeur négative extrême jusqu'à la valeur positive extrême ;
  • au début de la boucle "a" (avant d'entrer dans la boucle "b"), on élimine les valeurs a priori inacceptables, puisque l'équation montre que Na1 - 1 doit être divisible par P ;
  • les boucles suivantes jouent sur le fait que b1, c1, etc., doivent être divisibles par P : l'incrément est donc égal à P, et les valeurs extrêmes en sont des multiples ;
  • au début de la dernière boucle de la série, on vérifie que 2a1 × 3b1 × 5c1 × ... est bien compris entre 1 et 2 avant de continuer ;
  • on peut alors calculer les valeurs de a2, b2, c2, etc., à partir des formules :
    a2 = (1 - N × a1)/P
    b2 = b1 × N/P
    c2 = c1 × N/P
    etc.
  • si 2a2 × 3b2 × 5c2 × ... est compris entre 1 et 2, la solution convient et on l'imprime.
Choix de la "profondeur" d'analyse vers haut de page Si une fraction irréductible p/q s'écrit 2a × 3b × 5c × ..., alors
ppcm [p, q] = 2|a| × 3|b| × 5|c| × ..., où |x| représente la valeur absolue de x.

Comme nous cherchons des intervalles "simples", c'est-à-dire dont le ppcm soit minimal, on voit que :

  • il suffit de limiter la recherche aux premiers facteurs premiers : 2, 3, 5. Par souci d'exhaustivité, le programme prend aussi 7 et 11, mais comme on peut s'y attendre, les solutions qui en résultent sont inexploitables ;
  • pour chaque facteur premier, il faut limiter les valeurs extrêmes des exposants : par souci d'exhaustivité, on a pris :
    • pour 2 la fourchette [-10, 10],
    • pour 3 et 5 la fourchette [-3P, 3P],
    • pour 7 la fourchette [-2P, 2P],
    • et pour 11 la fourchette [-P, P].
Listing de la macro vers haut de page
Sub MAIN
Open "Donnees.txt" For Output As #1
N = 2
P = 5
Nbdegres = N + P
Print #1, "Gamme à "; Nbdegres; " degrés, répartis en
 "; N; " et "; P
For a1 = - 10 To 10
If (a1 * N - 1) / P <> Int((a1 * N - 1) / P) Then Goto Suitea1
For b1 = - 3 * P To 3 * P Step P
For c1 = - 3 * P To 3 * P Step P
For d1 = - 2 * P To 2 * P Step P
For e1 = - P To P Step P
pq1$ = "(2^" + Str$(a1) + ")*(3^" + Str$(b1) + ")*(5^" + Str$(c1)
 + ")*(7^" + Str$(d1) + ")*(11^" + Str$(e1) + ")"
pq1 = OutilsCalculer(pq1$)
If pq1 <= 1 Or pq1 >= 2 Then
Goto Suitee1
Else
a2 = (1 - a1 * N) / P
b2 = - b1 * N / P
c2 = - c1 * N / P
d2 = - d1 * N / P
e2 = - e1 * N / P
pq2$ = "(2^" + Str$(a2) + ")*(3^" + Str$(b2) + ")*(5^" + Str$(c2)
 + ")*(7^" + Str$(d2) + ")*(11^" + Str$(e2) + ")"
pq2 = OutilsCalculer(pq2$)
If pq2 <= 1 Or pq2 >= 2 Then
Goto Suitee1
Else
Num1 = 1
Den1 = 1
If a1 > 0 Then Num1 = Num1 * OutilsCalculer("2^" + Str$(a1))
If a1 < 0 Then Den1 = Den1 * OutilsCalculer("2^" + Str$(- a1))
If b1 > 0 Then Num1 = Num1 * OutilsCalculer("3^" + Str$(b1))
If b1 < 0 Then Den1 = Den1 * OutilsCalculer("3^" + Str$(- b1))
If c1 > 0 Then Num1 = Num1 * OutilsCalculer("5^" + Str$(c1))
If c1 < 0 Then Den1 = Den1 * OutilsCalculer("5^" + Str$(- c1))
If d1 > 0 Then Num1 = Num1 * OutilsCalculer("7^" + Str$(d1))
If d1 < 0 Then Den1 = Den1 * OutilsCalculer("7^" + Str$(- d1))
If e1 > 0 Then Num1 = Num1 * OutilsCalculer("11^" + Str$(e1))
If e1 < 0 Then Den1 = Den1 * OutilsCalculer("11^" + Str$(- e1))
Num2 = 1
Den2 = 1
If a2 > 0 Then Num2 = Num2 * OutilsCalculer("2^" + Str$(a2))
If a2 < 0 Then Den2 = Den2 * OutilsCalculer("2^" + Str$(- a2))
If b2 > 0 Then Num2 = Num2 * OutilsCalculer("3^" + Str$(b2))
If b2 < 0 Then Den2 = Den2 * OutilsCalculer("3^" + Str$(- b2))
If c2 > 0 Then Num2 = Num2 * OutilsCalculer("5^" + Str$(c2))
If c2 < 0 Then Den2 = Den2 * OutilsCalculer("5^" + Str$(- c2))
If d2 > 0 Then Num2 = Num2 * OutilsCalculer("7^" + Str$(d2))
If d2 < 0 Then Den2 = Den2 * OutilsCalculer("7^" + Str$(- d2))
If e2 > 0 Then Num2 = Num2 * OutilsCalculer("11^" + Str$(e2))
If e2 < 0 Then Den2 = Den2 * OutilsCalculer("11^" + Str$(- e2))
Message$ = "Solution : " + Str$(Num1) + "/" + Str$(Den1) + "= 2^" +
Str$(a1) + " * 3^" + Str$(b1) + " * 5 ^" + Str$(c1)
 + " * 7^" + Str$(d1) + " * 11^" + Str$(e1) +
 " --- " + Str$(Num2) + "/" + Str$(Den2) +
 "= 2 ^ " + Str$(a2) + " * 3 ^ " + Str$(b2)
  + " * 5 ^ " + Str$(c2) + " * 7 ^ " + Str$(d2)
   + " * 11 ^ " + Str$(e2)
Print #1, Message$
EndIf
EndIf
Suitee1:
Next
Suited1:
Next
Suitec1:
Next
Suiteb1:
Next
Suitea1:
Next
Close #1
End Sub
Performances vers haut de page Pour N et P donnés, la macro explore l'ensemble des solutions en 15 à 20 secondes (sur un PC équipé d'un Pentium 150 MHz).
vers haut de page