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Ă© :

\[\operatorname{PGCD}(a,b)=\operatorname{PGCD}(b,r),\]

oĂč \(r\) est le reste de la division euclidienne de \(a\) par \(b\). On recommence jusqu’à obtenir un reste nul.

Exemple
Algorithme d’Euclide
PrĂȘt
Sortie

  

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 :

Exemple
Décaler une lettre
PrĂȘt
Sortie

  

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 Ă  Z sont dĂ©calĂ©es dans l’alphabet majuscule ;

  • les lettres de a Ă  z sont 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.

À toi
Chiffrer et déchiffrer un message
À faire
Sortie

  

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.

À toi
Retrouver automatiquement un décalage
À faire
Sortie

  

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.

Exemple
Nombres premiers jusqu’à 50
PrĂȘt
Sortie

  

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 :

\[\binom{n}{0}=\binom{n}{n}=1, \qquad \binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}.\]
Exemple
Construire les premiĂšres lignes
PrĂȘt
Sortie

  

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\).

À toi
Une ligne du triangle
À faire
Sortie

  

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.

À toi
Mélanger sans modifier
À faire
Sortie

  

Choisir une autre partie