Codage

Bonjour

j'ai crée le ptit bout de programme suivant servant à un codage d'une chaine de caractère , un soucis se pose sur le calcul

d'une puissance , voici le code

Sub décodage()
Dim p As String
Dim tablo(), lettre() As Variant
lettre = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "alpha", "gamme", "beta", "epsilon")

p = InputBox("entrer le mot à décoder:")
ReDim tablo(1 To Len(p))
x = ""
For i = 1 To UBound(tablo)
 tablo(i) = Mid(p, i, 1)
  For j = 0 To UBound(lettre)
    If lettre(j) = tablo(i) Then
       x = x & lettre(j ^ 13 Mod 31)    'ici j'ai un message de dépassement de capacité , mais ça marche si la puissance est < à 8
    End If
  Next
Next
MsgBox x
End Sub

Est il possible de contourner ce probleme puissance ? Merci pour vos suggestions

Cordialement

Salut Rocket4,

Je n'y connais rien en puissances, qu'est-ce qu'est censé donner le calcul j ^ 13 Mod 31 ?

Car ce que je remarque en revanche, c'est que sur ta ligne lettre(j ^ 13 Mod 31) tu demandes à la macro de récupérer dans le tableau "lettre" la lettre n° j ^ 13 Mod 31.

Or ton tableau de lettres va de 0 à 29, d'où ma question, qu'est censé donner comme résultat j ^ 13 Mod 31 ?

Bonjour,

Normalement, là j va prendre la valeur 0,1,2,3,...,29.

Pour a il retourne 0^13 Mod 31

Pour b il retourne 1^13 Mod 31

C'est ça le principe ?

Car si c'est le principe, le fait qu'Excel ne puisse pas faire 29^13 semble "normal".

tablo(i) renvoi un caractère de la chaine p entrée dans l'inputbox , ensuite le tableau "lettre" est parcouru par la variable j pour determiner quel j renvoi au caractère tablo(i) , une fois le j determiné on determine le caractère correspondant dans le tableau lettre via l'instruction lettre(j ^ 13 Mod 31) ou j ^ 13 Mod 31 est en fait "une clé de décodage" , je ne pose pas les calculs mathematiques

de congruence qui m'on servità obtenir ce resultat ...ca fait appel au petit theoreme de fermat qui alourdirai ma demande , le probleme

est en fait juste une capacité du compilateur à traiter un calcul de puissance et je me demandais si il y aurait une limite à moins de typer

j^13 en long ... c'est vague dit ainsi ..

Bonjour,

30^13=1.59432E+19

Le type Double n'a que 15 chiffres significatifs.

Mod() est très limité et même bogué en vba, il faut calculer le modulo.

Et comme ça ne suffit pas, tu ne peux pas utiliser la fonction ^ qui évalue la valeur et ne la calcule pas réellement, et travaille sur des Double d'où perte encore de chiffres significatifs.

Le type Decimal avec 28 chiffres significatifs devrait suffire. Il n'existe pas dans As mais CDec() permet de convertir en Decimal.

Compte tenu de tout ça essaie avec :

Dim k as variant
'.... début du code
'....                 
     k = CDec(j)
    k = k * k * k * k * k * k * k * k * k * k * k * k * k
    k = k - (Int(k / 31) * 31)
    x = x & lettre(k)
     '....

Contrôlé avec mathlab sur 25^13 mod 31 = 25. C'est bon pour au moins celui-ci

Assure-toi de réversibilité, sinon il faudra tester avec des fonctions personnalisées qui travaillent avec des grands nombres (lent vu que les nombres sont stockés en chaines).

Et type toutes tes variables !

eric

Salut eriiic !

Sans intervenir dans le sujet, à propos des opérateurs VBA \ et Mod : ils ne fonctionnent correctement qu'avec des entiers.

J'en ai eu fait l'expérience et j'avais tourné en rond un bon moment avec des résultats "bizarres"...

Et j'avais fini par trouver ce que je viens de dire dans un document Microsoft (j'ai perdu de vue la source depuis le temps mais je me le suis gravé en mémoire...)

Bonne journée.

Merci pour vos interventions eriiic et Mferrand je m' y penche !

Sans intervenir dans le sujet, à propos des opérateurs VBA \ et Mod : ils ne fonctionnent correctement qu'avec des entiers.

Je n'avais pas fait attention pour \ mais pour Mod() vba oui, il converti en Long d'où des arrondis plus que gênants dans ce cas. Sans parlé qu'il est en plus bogué sur 2003...

Je le note donc dans ma tête pour \ qu'il m'arrive d'utiliser de temps en temps

Sauf petits nombres entiers j'utilise maintenant plutôt Application.Mod() (mais qui ne conviendrait pas ici)

J'ai trouvé un contournement tres efficace en réecrivant mon code de la facon suivante ( en créant une fonction ) :

Function reste(ByVal Nombre As Double, ByVal Diviseur As Double) As Double
        Nombre = Int(Abs(Nombre))
        Diviseur = Int(Abs(Diviseur))
        reste = Nombre - (Int(Nombre / Diviseur) * Diviseur)
End Function
Sub décodage()
Dim p As String
Dim tablo(), lettre() As Variant
lettre = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "alpha", "gamme", "beta", "epsilon")

p = InputBox("entrer le mot à décoder:")
ReDim tablo(1 To Len(p))
x = ""
For i = 1 To UBound(tablo)
 tablo(i) = Mid(p, i, 1)
  For j = 0 To UBound(lettre)
    If lettre(j) = tablo(i) Then
        x = x & lettre(reste(j ^ 13, 31))  ' ici ca plante plus ! 

    End If
  Next
Next
MsgBox x
End Sub

et ca fonctionne ,

C'est bien.

Sauf que ton calcul est complètement faux.

25^13 mod 31 = 25, pas 3 !

25^13 =1490116119384765625 et non 1.49011611938477E+18

Perdre les 5 derniers chiffres pour un calcul de modulo c'est juste un peu gênant...

Contournement tres efficace tu disais ?

Ca sert à quoi de demander si c'est pour ne pas prendre en compte les réponses ?

effectivement eriic , j'ai conclu un peu vite , me suis basé sur l'idée de créer une fonction qui pour le test " répond" , ceci dit je n'ai pas

pri garde au fait que les calculs effectués etait faux ! Merci quand meme

Il te suffisait de comparer avec la modif que je t'ai indiquée.

Rechercher des sujets similaires à "codage"