Algorithmes#
DĂšs la premiĂšre
Algorithme dâEuclide#
Lâalgorithme dâEuclide calcule le plus grand diviseur commun de deux entiers. Il repose sur lâĂ©galitĂ© :
oĂč \(r\) est le reste de la division euclidienne de \(a\) par \(b\). On recommence jusquâĂ obtenir un reste nul.
Le rĂ©sultat peut dâabord ĂȘtre retrouvĂ© par une dĂ©composition en facteurs premiers, avant de changer les deux nombres. La boucle ne connaĂźt pas Ă lâavance le nombre de divisions nĂ©cessaires.
Le chiffrement de César#
Le chiffrement de CĂ©sar dĂ©cale chaque lettre dâun mĂȘme nombre de places dans lâalphabet. Avec
un décalage de 3, A devient D, B devient E et X devient A. La clé du
chiffrement est le nombre de places choisi.
On numĂ©rote les lettres de 0 Ă 25. Si une lettre occupe la position \(i\), sa position aprĂšs un dĂ©calage \(k\) est \((i+k)\mathbin{\%}26\). Le reste de la division permet de revenir au dĂ©but de lâalphabet aprĂšs la lettre Z.
Voici le mécanisme pour une seule lettre :
La méthode alphabet.index(lettre) donne la position de lettre dans la chaßne. Pour
dĂ©chiffrer, il suffit dâeffectuer le dĂ©calage opposĂ© : une clĂ© de 3 devient un dĂ©calage de â3.
Pour traiter un véritable message, on adopte une convention claire :
les lettres de
AĂZsont dĂ©calĂ©es dans lâalphabet majuscule ;les lettres de
aĂzsont dĂ©calĂ©es de la mĂȘme façon, mais restent minuscules ;les espaces, les chiffres, la ponctuation et les lettres accentuĂ©es sont recopiĂ©s sans modification.
On peut donc utiliser deux chaĂźnes, alphabet_majuscule et alphabet_minuscule. Chaque
caractĂšre est recherchĂ© dans lâune dâelles ; sâil nâappartient Ă aucune des deux, il est simplement
ajouté au résultat.
ActivitĂ©. Ăcrire une fonction cesar(message, decalage) qui respecte cette convention.
La mĂȘme fonction doit permettre de dĂ©chiffrer lorsquâelle reçoit un dĂ©calage nĂ©gatif.
Une piste si le retour aprĂšs Z pose problĂšme
Pour chaque caractĂšre, vĂ©rifier sâil appartient Ă lâalphabet majuscule ou Ă lâalphabet
minuscule. Dans ce cas, calculer sa nouvelle position avec % 26. Sinon, le recopier.
Ce procĂ©dĂ© est intĂ©ressant pour comprendre un algorithme de chiffrement, mais il nâest pas sĂ»r : il nâexiste que 26 dĂ©calages possibles, que lâon peut tous essayer trĂšs rapidement.
Décoder par analyse de fréquence#
Dans un texte français suffisamment long, la lettre E est généralement la plus fréquente. Si la
lettre la plus frĂ©quente dâun message chiffrĂ© est, par exemple, L, on peut supposer que le
E du texte initial a été transformé en L.
Si \(j\) est la position de la lettre la plus fréquente et si E occupe la position 4, le
décalage probable est \((j-4)\mathbin{\%}26\). Il reste alors à appliquer le décalage opposé
avec la fonction cesar.
Les espaces et les autres caractÚres ne doivent pas entrer dans le comptage. Pour réunir
majuscules et minuscules, on peut convertir temporairement chaque caractĂšre avec upper() et
ne compter que ceux qui appartiennent à "ABCDEFGHIJKLMNOPQRSTUVWXYZ". Les accents, laissés
inchangés lors du chiffrement, sont également ignorés par cette analyse simplifiée.
ActivitĂ©. Ăcrire une fonction decoder_frequence(message) qui renvoie un couple formĂ© du
décalage estimé et du texte décodé. La cellule réutilise automatiquement la fonction cesar
Ă©crite dans lâactivitĂ© prĂ©cĂ©dente : il nâest pas nĂ©cessaire de la recopier.
Pour tester la méthode, choisir sans précaution particuliÚre un paragraphe français assez long,
lui appliquer un dĂ©calage arbitraire avec cesar, puis donner uniquement le texte chiffrĂ© Ă
decoder_frequence. Le texte initial doit ĂȘtre retrouvĂ© sans fournir la clĂ© au dĂ©codeur.
Un paragraphe chiffrĂ© prĂȘt Ă tester
Ce texte a été produit avec la fonction précédente et un décalage inconnu. Il est assez long
pour que lâhypothĂšse sur la lettre E soit pertinente. Il suffit de le placer entre triples
guillemets pour le transmettre Ă decoder_frequence.
Jlaal zlthpul, slz lslclz vizlyclua slz kpmmlylualz lahwlz kl jlaal lewlyplujl.
Psz wyluulua sl altwz kl ylslcly slz tlzbylz, kl jvtwhyly slz ylzbsahaz la kl
ylkpnly luzltisl bul jvujsbzpvu wyljpzl. Sl wyvmlzzlby slby klthukl luzbpal kl
clypmply slbyz jhsjbsz la kl wylzlualy jshpyltlua slby klthyjol klchua sh jshzzl.
Pourquoi faut-il un texte assez long ?
Sur quelques mots, la lettre la plus frĂ©quente peut trĂšs bien ne pas ĂȘtre E. Lâanalyse donne alors une mauvaise clĂ©. Plus le texte est long, plus la frĂ©quence observĂ©e a de chances de ressembler Ă la frĂ©quence habituelle du français. Une mĂ©thode plus robuste comparerait les frĂ©quences de toutes les lettres et pas seulement celle de E.
Crible dâĂratosthĂšne#
Pour chercher tous les nombres premiers jusquâĂ une limite, le crible dâĂratosthĂšne commence par considĂ©rer tous les entiers comme premiers, puis Ă©limine successivement les multiples de 2, de 3, de 5, etc.
La liste est_premier associe une valeur True ou False Ă chaque entier. La fonction int() transforme ici la racine carrĂ©e de la limite en entier. Le programme introduit aussi une boucle Ă lâintĂ©rieur dâune autre boucle. Change la limite et observe quels passages du programme nâont pas besoin dâĂȘtre modifiĂ©s.
Triangle de Pascal#
Chaque ligne du triangle de Pascal commence et finit par 1. Entre les deux, un coefficient est la somme des deux coefficients situés au-dessus de lui. La ligne de rang \(n\) contient les coefficients binomiaux \(\binom n0,\ldots,\binom nn\).
La relation utilisĂ©e pour construire lâintĂ©rieur de la ligne est :
Par exemple, 6 = 3 + 3.
La construction rĂ©utilise une ligne dĂ©jĂ connue. Pour vĂ©rifier une ligne, sa somme doit ĂȘtre Ă©gale Ă \(2^n\).
Deux directions indépendantes. Le premier exercice prolonge directement le triangle. Le mélange aléatoire constitue un défi séparé. Les permutations et les sous-ensembles sont placés plus loin, aprÚs la récursivité qui permet de comprendre leur construction.
Construire une ligne donnée
Ăcrire une fonction ligne_pascal(n) qui renvoie la ligne de rang n. VĂ©rifier Ă©galement
que la somme de ses coefficients vaut \(2^n\).
Mélanger une liste
Ăcrire une fonction permutation_aleatoire(L) qui renvoie une nouvelle liste dans un ordre
aléatoire, sans modifier la liste reçue et sans utiliser random.shuffle. Une possibilité est
de tirer successivement un indice parmi les éléments qui restent.
Choisir une autre partie