Problème d'algorithme sur VBA
Bonjour à tous,
Afin de pouvoir l'utiliser dans un de mes fichiers Excel, j'ai voulu faire l'algorithme du théorème de Bézout:
"Deux entiers relatifs a et b sont premiers si et seulement si il existe deux entiers u et v tels que au+bv=1."
Cet algorithme a pour but de donner u et v, si on renseigne a et b. Il s'écrit ainsi:
Initialisation: - Prompt(a)
- Prompt(b)
Traitement: - r=0
- u=1
- While r≠1
~ a*u=m
~ MOD(m,b)=r
~ u+1=u
- WhileEnd
- u-1=u
- (1-m)/b=v
Résultats: - Afficher u et v
Mais voilà, j'ai quelques problèmes quand j'essai de rédiger cet algorithme sur VBA. Notamment avec les symboles ≠, + et -, * et /... Un message d'erreur apparaît dés que je tape l'un de ces symboles...
Voilà le problème, alors ce serait bien si vous pouviez m'aider svp.
Merci d'avance et bonne journée.
Bonjour et bienvenue,
Une remarque : "différent de" se note "<>" au lieu de ≠. Merci aussi de nous fournir un exemple de fichier avec ta macro.
D'accord, merci déjà pour ce premier point
Désolé, j'arrive pas à enregistrer mon programme à part, du coup j'en ai fait un copier coller:
Sub Bézout()
Prompt("a=") = a
Prompt("b=") = b
r = 0
u = 1
Do While (r <> 1)
a u = m
Mod(m,b) = r
u 1 = u
WhileEnd
u -1 = u
(-m+1)/b=m
End Sub
Et sur VBA, "Mod(m,b)" s'affiche en rouge, "(-m+1)/b=m" s'affiche également en rouge, le logiciel à remplacer lui même "u+1" en "u 1" (j'ai pas réussi à lui faire conserver le +), et je suis pas tout à fait sûr qu'il me donne les résultats u et v à la fin de l'algorithme...
Voilà, en espérant que cela va te permettre de m'aider plus facilement,
Et merci de bien vouloir m'aider...
Bonjour
J'ai essayé bien que je ne connais pas ce Bézout (Bézu oui)
Il faut inverser ta syntaxe
Quand tu marques a u = m
il faut m = a * u
A tester : attention en fonction des nombres : part dans une boucle infinie
une erreur sans doute mais je ne connais pas assez ce théorème
Sub test()
Dim NombreA As Long, NombreB As Long
Dim NombreU As Long, NombreV As Long
Dim NombreR As Long, NombreM As Long
'NombreA = 17
'NombreB = 23
NombreA = Val(InputBox("Entrer le nombre A"))
If NombreA = 0 Then Exit Sub
NombreB = Val(InputBox("Entrer le nombre B"))
If NombreB = 0 Then Exit Sub
NombreR = 0
NombreU = 1
Do While NombreR <> 1
NombreM = NombreA * NombreU
NombreR = NombreM Mod NombreB
NombreU = NombreU + 1
Loop
NombreU = NombreU - 1
NombreV = (1 - NombreM) / NombreB
MsgBox "U = " & NombreU & vbCr & "V = " & NombreV
End SubMerci beaucoup, ton programme fonctionne super bien!!
Mais, j'ai rien compris au langage dans lequel tu l'as écrit... n_n'
Tant pis, et merci encore!
Maintenant, est-ce qu'il serait possible de rentrer une cellule à la place de a et de fixer b=-26?
Et ensuite, on peut enregistrer le tout dans une cellule?
Désolé d'encore te déranger n_n''
Bonjour
Summm a écrit :Mais, j'ai rien compris au langage dans lequel tu l'as écrit... n_n'
heeuuuu c'est bien toi qui a marqué cela
Summm a écrit :Mais voilà, j'ai quelques problèmes quand j'essai de rédiger cet algorithme surVBA.
Une petite variante car ces problèmes de plantage m’intriguaient
j'ai été voir ici
http://www.apprendre-en-ligne.net/random/bezout.html
Sub test()
Dim NombreA As Long, NombreB As Long
Dim NombreU As Long, NombreV As Long
Dim NombreR As Long, NombreM As Long
Dim NombreVoulu As Long, LePGCD As Long
NombreVoulu = 1
NombreA = Val(InputBox("Enter le nombre A"))
If NombreA = 0 Then Exit Sub
NombreB = Val(InputBox("Enter le nombre B"))
If NombreB = 0 Then Exit Sub
LePGCD = Application.Gcd(NombreA, NombreB)
If NombreVoulu / LePGCD <> NombreVoulu \ LePGCD Then
MsgBox NombreVoulu & " n'est pas un multiple du PGCD de " & NombreA & " et de " & NombreB & vbCr & "PGCD(" & NombreA & ";" & NombreB & ") = " & LePGCD
Exit Sub
End If
NombreR = 0
NombreU = 1
Do While NombreR <> NombreVoulu '1
NombreM = NombreA * NombreU
NombreR = NombreM Mod NombreB
NombreU = NombreU + 1
Loop
NombreU = NombreU - 1
NombreV = (1 - NombreM) / NombreB
MsgBox "U = " & NombreU & vbCr & "V = " & NombreV
End SubBonjour
Pas vu ta question suivante
essayes
Sub test()
Dim NombreA As Long, NombreB As Long
Dim NombreU As Long, NombreV As Long
Dim NombreR As Long, NombreM As Long
NombreA = Val(Range("A1"))
If NombreA = 0 Then Exit Sub
NombreB = -26
NombreR = 0
NombreU = 1
Do While NombreR <> 1
NombreM = NombreA * NombreU
NombreR = NombreM Mod NombreB
NombreU = NombreU + 1
Loop
NombreU = NombreU - 1
NombreV = (1 - NombreM) / NombreB
Range("B1") = NombreU
Range("C1") = NombreV
End SubD'accord, d'accord
Donc, j'ai bien utilisé tout ça, et du coup j'ai réussi à utiliser cet algorithme et les autres choses qu j'avais fait à coté pour faire un système de décryptage de texte codé deux à deux. (Pour les cours de Spé Maths n_n) Encore merci!
Bye.