Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 02-12-2019 18:32:43

gielev
Membre
Inscription : 08-03-2007
Messages : 407

question Python boucle

bonjour,
Je suis débutant +  en  Python
Je suis en train de travailler sur un programme Python pour machine Enigma et je voudrais faire une boucle qui me permette de changer  une valeur, ici t, dans ring_settings
Un truc du genre :

for t in range(1,26):
    machine = EnigmaMachine.from_key_sheet(
          rotors='II III I',
          reflector='B',
          ring_settings='t 5 20',
          plugboard_settings='BD CF EL GN HZ JO KW MT PR SX')

Je voudrais savoir s'il y a moyen d'afficher les valeurs de ring_settings ?
J'ai l'impression à l'exécution que quelle que soit la valeur de t, ring_settings prends toujours la valeur 1 5 20 autrement dit que je ne modifier la valeur dans l'appel à EnigmaMachine.
De plus quand je veux faire un print(ring_settings) j'ai un message d'erreur disant ring_settings not defined... donc inconnu...*
Merci pour vos explications

Hors ligne

#2 02-12-2019 20:36:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : question Python boucle

Salut,

Questions
    * pourquoi des virgules en fin de ligne ? Pour moi, au mieux, elles ne servent à rien (jamais vu)
    *  machine = EnigmaMachine.from_key_sheet(
        Tu es sûr de l'absence de parenthèse fermante ?
    * rotors='II III I'
       reflectors='B'
       ring_settings='t 5 20',
       Ces valeurs doivent-elles changer selon la valeur de t ?
       Parce que là, rien que la 3e ligne est figée : c'est une chaîne de caractères dite écodée en dur"
       La preuve :

       for t in range(1,6):
          # machine = EnigmaMachine.from_key_sheet(
           rotors='II III I',
           reflector='B',
           ring_settings='t 5 20',
           #plugboard_settings='BD CF EL GN HZ JO KW MT PR SX')
           print (ring_settings)
 

          à l'exécution me renvoie :
         


          t 5 20
          t 5 20
          t 5 20
          t 5 20
          t 5 20
         

       

Je te suggère
* d'ajouter une parenthèse fermante
* de supprimer les virgules
* d'écrire  ring_settings=str(t)+' 5 20'
moyennant quoi j'obtiens :

1 5 20
2 5 20
3 5 20
4 5 20
5 5 20

J'ai mis des # pour court-circuiter ce qui ne pourrait pas fonctionner chez moi.
A chaque itération str(t) transforme la valeur de t en une chaîne. Je lui concatène ensuite la chaîne ' 5 20' avec une espace devant le 5.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 02-12-2019 20:56:34

gielev
Membre
Inscription : 08-03-2007
Messages : 407

Re : question Python boucle

Merci Yoshi pour ces infos.
La parenthèse fermante se trouve après le réglage du plugboard.
Les virgules sont dues au passage de paramètres à la fonction EnigmaMachine où elles servent à séparer les paramètres.
Mais je note la remarque concernant t avec l'écriture str(t).
Et oui je voudrais que t change. Il s'agit de trouver le réglage des anneaux qui permette d'obtenir un message compréhensible, la validation se faisant par le calcul de l'indice de coïncidence.
Ce bout de programme sert à configurer la machine.
Cela étant je suppose qu'il n'est pas possible d'accéder comme cela aux variables transmises à une fonction avec le nom qu'elles ont à l'intérieur de la fonction (j'ai fait ça il y a longtemps avec un autre langage mais j'ai un peu oublié ! Bonne occasion de réviser).
Il faut que je regarde quelles sont les méthodes utilisables pour l'objet EnigmaMachine. Peut-être trouverais-je de ce côté là.

Hors ligne

#4 02-12-2019 22:39:45

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : question Python boucle

Re,

Parenthèse fermante pas vue, donc le reste en découle, mes excuses...
Si c'est une fonction, alors oui, les variables à l'intérieur sont locales.
Pour accéder de l'extérieur à une variable truc
On écrit, juste sous la déclaration de fonction, global truc.
C'est EnigmaMachine.from_key_sheet qui est une fonction ?
Si oui, la vois-tu ?
Si tu la vois, elle est en principe présentée sous la forme :
def EnigmaMachine.from_key_sheet(a,b,c,d):
    instructions
    bidule=...
   return bidule

resultat=EnigmaMachine.from_key_sheet(a=...,b=...,c=...,d=...)

J'ai testé ça qui fonctionne :

             

def test(a,b,c,d):
  bule= a+10*str(b)+str(c)+3*(str(d)+"§")
  return bule
 
for i in range(1,4):
    machin = test(
    a=str(10**i)+"025A",
    b=10**-i,
    c=10,
    d=1) 
    print (machin)

Donc si tu veux que t varie dans ring..., str(t)+" 5 20" devrait faire le job...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 03-12-2019 10:14:56

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : question Python boucle

Salut ma


Arx Tarpeia Capitoli proxima...

Hors ligne

#6 03-12-2019 10:31:34

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : question Python boucle

Salut maître gielev,

Apparemment après recherche dans ton programme, il semble qu'il y ait un import :

from enigma.machine import EnigmaMachine

machine = EnigmaMachine.from_key_sheet(
    rotors='II IV V',
    reflector='B',
    ring_settings=[1, 20, 11],
    plugboard_settings='AV BS CG DL FU HZ IN KM OW RX')

Mais toi, tu aurais

from enigma.machine import EnigmaMachine

for t in range(1,26):
    machine = EnigmaMachine.from_key_sheet(
        rotors='II IV V',
        reflector='B',
        ring_settings=[t, 20, 11],
        plugboard_settings='AV BS CG DL FU HZ IN KM OW RX')

Ce que je vois dans ce code c'est que ring_settings chez toi est une chaîne de caractères et que dans le code correspondant au module EnigmaMachine,  ring_settings est une liste de nombres entiers...

Mais j'ai aussi trouvé ceci :

machine = EnigmaMachine.from_key_sheet(
    rotors='II IV V',
    reflector='B',
    ring_settings='B U L',
    plugboard_settings='AV BS CG DL FU HZ IN KM OW RX')

où ring_settings est bien une chaîne, mais composée de lettres et non pas de nombres transformés en chaînes...

Explication trouvée ici :

Warning : ring_settingscan also take a list of integers, but these integers are 0-based. Remember t_hat w_hen using a string of numbers they are 1-based to correspond to actual historical key sheet data.
In other words,  these values produce identical ring settings:[0, 5, 15], 'A F P', and '1 6 16'.

(les _ ne devraient pas être là : c'est pour contourner la protection anti-spams en anglais qui avait été mise en place quand on a été attaqués)

Y aurait-il 2 modules différents de même nom sous python traitant de la machine Enigma ? le module EnigmaMachine que tu utilises est-il de ta création personnelle ?

Si j'avais su ça hier soir, je n'aurais pas écrit d'âneries...

@+

url du pdf mode d'emploi du prog py-Enigma

Arx Tarpeia Capitoli proxima...

Hors ligne

#7 03-12-2019 12:48:00

gielev
Membre
Inscription : 08-03-2007
Messages : 407

Re : question Python boucle

Salut Yoshi,
Le module que j'utilise est bien celui que tu as trouvé dans tes recherches.
J'ai déjà discuté du problème des chaines entre crochets ou parenthèses, avec virgule ou non, du 0-based etc... avec l'auteur du module.
Il m'a dit qu'il allait reprendre tout cela, dont la doc, dès qu'il en aurait le temps.
Là je suis entrain de plancher sur l'EnigmaChallenge sur http://users.telenet.be/d.rijmenants/en/challenge.htm. Si tu jettes un coup d’œil sur la page de ce challenge tu verras que j'ai atteint l'étape 9.
Si ce n'était pas un problème de programmation cette discussion devrait se trouver sur le forum cryptographie.
Cette étape 9 est la seule que j'ai résolue avec un programme python. Réponse en 12 secondes pour 17576 combinaisons à tester.
Un intervenant sur le forum de crypto l'a résolu à l'aide de la méthode du mot probable mais c'est long.
J'ai à peine adapté le module car je n'ai pas eu à toucher à cette fonction pour écrire mes boucles de test.
Avant de m'attaquer à l'étape 10 je suis en train de reprendre les étapes précédentes en y adaptant ce module, modifié pour chaque cas, là où les solutions à tester sont trop nombreuses.
J'en suis ainsi à l'étape 5, dont j'ai la réponse bien sûr, mais pour laquelle je voudrais adapter le truc.
La méthode from_key_sheet() est un truc facile à manipuler pour configurer la machine, mais j'ai vu dans le User's Guide qu'on peut aussi construire la machine "à la main".
Je vais donc voir prochainement si je peux alors modifier le ring_settings au moyen d'une boucle.
J'aurai par la suite un problème analogue avec les combinaisons de rotors ou encore le plugboard (ce dernier étant le cadet de mes soucis car on peut commencer le décryptage sans).
A plus
gielev
P.S. ma question était au départ très basique d'où le peu de renseignements donnés. Bien sûr j'aurais du me souvenir des variables globales et locales. Désolé, mon but nétait pas de te faire écrire des âneries .

Hors ligne

#8 05-12-2019 20:04:54

gielev
Membre
Inscription : 08-03-2007
Messages : 407

Re : question Python boucle

@Yoshi,
J'ai résolu mon problème comme je l'ai indiqué dans le post précédent.
J'ai "fabriqué" mes rotors moi-même, en suivant les indications données. Du coup je peux contrôler tous les paramètres.
Avec 3 boucles imbriquées pour trouver le rotor, le réglage de l'anneau et la position de départ, le crypto 5 est résolu en une fraction de seconde.

Dernière modification par gielev (05-12-2019 20:05:39)

Hors ligne

#9 05-12-2019 20:38:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : question Python boucle

Re,

Clap, clap !
J'avais l'intention de m'attaquer à cette réalisation après avoir bouclé ma revue, d'ici 10 jours...

C'est quand même plus rapide et avec moins de souffrance avec un ordi, s'pas... Et puis le pied qu'on prend, quand tu réussis un prog qui fait ce que, TOI, tu veux qu'il fasse...
Motivant !

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 05-12-2019 21:56:52

gielev
Membre
Inscription : 08-03-2007
Messages : 407

Re : question Python boucle

Comme tu dis Yoshi.
Et puis dans mon job de prof on nous demande de faire du Python désormais.
J'avais déjà fait de la prog orientée objet mais là il fallait vraiment que je me trouve une motivation pour me lancer dans ce "nouveau" (pour moi) langage, même si les ambitions au Lycée restent modestes. Et ben là je l'ai trouvée ma motivation ! :)
En plus j'ai déjà les solutions de ces cryptos donc je peux parfaitement vérifier ce qui ne va pas, quand quelque chose ne va pas.
Je vas continuer en reprenant les cryptos 6,7 et 8 puisque pour le 9 j'avais déjà écrit mon programme.
Et là je pense que je serai prêt pour le 10.
Je réfléchis déjà à répartir le travail sur plusieurs ordis. J'en ai quelques-uns qui tournent encore et qui pourraient faire l'affaire.

Dernière modification par gielev (05-12-2019 21:57:37)

Hors ligne

Pied de page des forums