Les statistiques au secours des cryptanalystes

<< Graphics`Graphics`

Prétraitement du texte

La première étape consiste à déterminer les fréquences d'apparition des lettres dans la langue désirée (ici le français). Il faut pour cela choisir un extrait assez long (plusieurs milliers de lettres) et bien représentatif de la langue.

extrait = "Entrez ici un texte assez long et représentatif de la langue. Il est seulement interdit de mettre des guillements.";

L'instruction suivante supprime tous les accents et écrit le texte en majuscules.

minuscules = 
        StringJoin[
          Characters[
              ToLowerCase[
                extrait]] /. {"\:0153" -> "oe"}];

Dans un ordinateur, les lettres majuscules sont codées en code ASCII, du numéro 65 (A) au numéro 90 (Z).

ascii = ToCharacterCode[minuscules];

On enlève les signes de ponctuation et les espaces pour ne garder que les codes ascii des lettres de A à Z.

ascii = 
        Select[ascii,  (( # > 96  &&  # < 123)   ||  ( # > 
                      223  &&  # < 253)) &];

On compte le nombre total de lettres.

long = Length[ascii]

Fréquences des lettres

On calcule les fréquences de chaque lettre...

fréquences1 = 
        Table[N[Count[ascii, j]/long], {j, 97, 
            122}];
lettres1 = 
        Table[FromCharacterCode[j], {j, 97, 
            122}];
fréquences2 = 
        Table[N[Count[ascii, j]/long], {j, 224, 
            252}];
lettres2 = 
        Table[FromCharacterCode[j], {j, 224, 
            252}];
fréquences = 
        Join[fréquences1, 
          fréquences2];
fréquences = 
        Drop[fréquences, {28}];
fréquences = 
        Drop[fréquences, {29}];
fréquences = 
        Drop[fréquences, {29}];
fréquences = 
        Drop[fréquences, {29}];
fréquences = 
        Drop[fréquences, {29}];
fréquences = 
        Drop[fréquences, {34}];
fréquences = 
        Drop[fréquences, {34}];
fréquences = 
        Drop[fréquences, {36}];
fréquences = 
        Drop[fréquences, {37}];
fréquences = 
        Drop[fréquences, {37}];
fréquences = 
        Drop[fréquences, {38}];
fréquences = 
        Drop[fréquences, {39}];
fréquences = 
        Drop[fréquences, {39}];
fréquences = 
        Drop[fréquences, {40}];
fréquences = 
        Drop[fréquences, {36}];
lettres = Join[lettres1, lettres2];
lettres = Drop[lettres, {28}];
lettres = Drop[lettres, {29}];
lettres = Drop[lettres, {29}];
lettres = Drop[lettres, {29}];
lettres = Drop[lettres, {29}];
lettres = Drop[lettres, {34}];
lettres = Drop[lettres, {34}];
lettres = Drop[lettres, {36}];
lettres = Drop[lettres, {37}];
lettres = Drop[lettres, {37}];
lettres = Drop[lettres, {38}];
lettres = Drop[lettres, {39}];
lettres = Drop[lettres, {39}];
lettres = Drop[lettres, {40}];
lettres = Drop[lettres, {36}];

et on affiche le tableau de résultats :

TableForm[{lettres, fréquences}, 
      TableDirections -> {Row, Column}]

Pour afficher les diagrammes en bâtons, on utilise les deux instructions suivantes:

barres = 
        Thread[{fréquences, lettres}];
BarChart[barres, PlotRange -> {0, 0.2}, 
        BarStyle -> {RGBColor[0, 0.5, 1]}];

On peut aussi trier les barres par longueur:

barresTriées = 
        Reverse[Sort[barres]];
BarChart[barresTriées, PlotRange -> {0, 0.2}, 
        BarStyle -> {RGBColor[0, 0.5, 1]}];