diff --git a/cryptographie/Analyse_bigramme.ipynb b/cryptographie/Analyse_bigramme.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..64ca38ff2d328a65bef8ed1ae51e55ed6b0345d2
--- /dev/null
+++ b/cryptographie/Analyse_bigramme.ipynb
@@ -0,0 +1,2062 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "b175e3e7",
+   "metadata": {},
+   "source": [
+    "# Calculer les fréquences des bigrammes d'une lettre dans une chaîne de caractères"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "42942619",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "POS_A = ord('A')#la position du A\n",
+    "POS_a = ord('a')#la position du a\n",
+    "POS_E = ord('E')#la position du E\n",
+    "POS_O = ord('O')#la position du O\n",
+    "POS_U = ord('U')#la position du U\n",
+    "POS_I = ord('I')#la position du I\n",
+    "\n",
+    "NB_CARS = 27 # le nombre de caractères pour les bigrammes\n",
+    "\n",
+    "\n",
+    "def pos_char(c):\n",
+    "    '''\n",
+    "    Donne la position du caractère dans l'alphabet\n",
+    "    return -1 si le charactère n'est pas une lettre\n",
+    "    '''\n",
+    "    if 'a' <= c <= 'z':\n",
+    "        p = ord(c) - POS_a\n",
+    "    elif 'A' <= c <= 'Z':\n",
+    "        p = ord(c) - POS_A\n",
+    "    elif c in 'éèêÉÊÊ':\n",
+    "        p = POS_E - POS_A\n",
+    "    elif c in 'ôÔ':\n",
+    "        p = POS_O - POS_A\n",
+    "    elif c in 'ûÛùÙ':\n",
+    "        p = POS_U - POS_A\n",
+    "    elif c in 'îÎ':\n",
+    "        p = POS_I - POS_A\n",
+    "    elif c in ' .,:!?;':#ponction\n",
+    "        p = -1\n",
+    "    else:\n",
+    "        p = -2\n",
+    "        \n",
+    "    p = p + 1\n",
+    "\n",
+    "    return p\n",
+    "\n",
+    "def char_at_pos(p):\n",
+    "    '''\n",
+    "    Donne le caractère à la postion p\n",
+    "    Exemples\n",
+    "    char_at_pos(0)\n",
+    "    >>> \" \"\n",
+    "    char_at_pos(2)\n",
+    "    >>> \"B\"\n",
+    "    '''\n",
+    "    if p==0:\n",
+    "        return \" \"\n",
+    "    else:\n",
+    "        return chr(p+POS_A-1)\n",
+    "\n",
+    "def calc_bigrammes(texte):\n",
+    "    \n",
+    "    bigrammes= [[0]*NB_CARS for i in range(NB_CARS)] # nombre d'apparitions de chaque lettre\n",
+    "    N = 0 # compte le nombre total de lettres\n",
+    "    p2 = pos_char(texte[0])\n",
+    "    for car in texte[1:]:\n",
+    "        p1, p2 = p2, pos_char(car) # positions des caractères qui se suivent\n",
+    "        \n",
+    "        # fait des statistiques seulement sur des caractères alphabétiques\n",
+    "        # et la ponctuation\n",
+    "        if p1 != -1 and p2 != -1:\n",
+    "            N = N + 1 # compte le nombre de caractères total du texte\n",
+    "            bigrammes[p1][p2] += 1 # compte le nombre de bigramme (p1,p2)\n",
+    "        \n",
+    "    # Normalisation : calcule les fréquences\n",
+    "    for i in range(NB_CARS):\n",
+    "        for j in range(NB_CARS):\n",
+    "            bigrammes[i][j] = bigrammes[i][j]/N\n",
+    "    \n",
+    "    return bigrammes"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6f1f3b19",
+   "metadata": {},
+   "source": [
+    "### Test de la fonction"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "e06169b5",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# permet de lire le contenu du fichier texte\n",
+    "livre_fichier = open(\"Notre-Dame_de_Paris.txt\", \"r\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "28fdcb41",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# permet de mettre le contenu entier du fichier texte dans une unique chaîne de caractères\n",
+    "texte_livre = livre_fichier.read()\n",
+    "texte_livre = texte_livre.replace('\\n', ' ')#remplace les sauts à la ligne \"\\n\" par des espaces \" \"."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "433a8089",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "livre_fichier.close()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "45c9c0d3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bigrammes_livre = calc_bigrammes(texte_livre)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "681c84a2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# transformer la liste en dictionnaire\n",
+    "dic_bigrammes = {}#{chr(k+POS_A) : freq_livre[k] for k in range(NB_CARS)}\n",
+    "for i in range(NB_CARS):\n",
+    "    for j in range(NB_CARS):\n",
+    "        dic_bigrammes[(char_at_pos(i),char_at_pos(j))]= bigrammes_livre[i][j]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "a9aecb5f",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{(' ', ' '): 0.03262248163770237,\n",
+       " (' ', 'A'): 0.008402684104007518,\n",
+       " (' ', 'B'): 0.0039953297154410525,\n",
+       " (' ', 'C'): 0.013061887314777783,\n",
+       " (' ', 'D'): 0.02170030191636806,\n",
+       " (' ', 'E'): 0.013803330247345764,\n",
+       " (' ', 'F'): 0.005501385672219765,\n",
+       " (' ', 'G'): 0.00295871996325022,\n",
+       " (' ', 'H'): 0.0015262038625550164,\n",
+       " (' ', 'I'): 0.00361251950569128,\n",
+       " (' ', 'J'): 0.003020171075867947,\n",
+       " (' ', 'K'): 7.051767021706346e-06,\n",
+       " (' ', 'L'): 0.019695585291625826,\n",
+       " (' ', 'M'): 0.007655196799706647,\n",
+       " (' ', 'N'): 0.004184720029738309,\n",
+       " (' ', 'O'): 0.002137692802865838,\n",
+       " (' ', 'P'): 0.01343966054808348,\n",
+       " (' ', 'Q'): 0.007045722649973455,\n",
+       " (' ', 'R'): 0.005337180240142889,\n",
+       " (' ', 'S'): 0.013711657276063582,\n",
+       " (' ', 'T'): 0.006519862309211925,\n",
+       " (' ', 'U'): 0.003761614008435928,\n",
+       " (' ', 'V'): 0.00510648671900421,\n",
+       " (' ', 'W'): 2.0147905776303846e-06,\n",
+       " (' ', 'X'): 8.159901839403058e-05,\n",
+       " (' ', 'Y'): 0.0006709252623509181,\n",
+       " (' ', 'Z'): 2.6192277509195002e-05,\n",
+       " ('A', ' '): 0.009896651317320449,\n",
+       " ('A', 'A'): 1.0073952888151923e-06,\n",
+       " ('A', 'B'): 0.0011182087705848636,\n",
+       " ('A', 'C'): 0.0018203632868890526,\n",
+       " ('A', 'D'): 0.0006195481026213433,\n",
+       " ('A', 'E'): 1.1081348176967115e-05,\n",
+       " ('A', 'F'): 0.0001319687828347902,\n",
+       " ('A', 'G'): 0.0011061200271190812,\n",
+       " ('A', 'H'): 0.00019341989545251692,\n",
+       " ('A', 'I'): 0.01378116755099183,\n",
+       " ('A', 'J'): 0.00013096138754597502,\n",
+       " ('A', 'K'): 4.029581155260769e-06,\n",
+       " ('A', 'L'): 0.0026061316121649023,\n",
+       " ('A', 'M'): 0.0015725440458405151,\n",
+       " ('A', 'N'): 0.008944662769390092,\n",
+       " ('A', 'O'): 3.324404453090135e-05,\n",
+       " ('A', 'P'): 0.0014254643336734972,\n",
+       " ('A', 'Q'): 0.0002518488222037981,\n",
+       " ('A', 'R'): 0.006013142478937883,\n",
+       " ('A', 'S'): 0.003386862960996677,\n",
+       " ('A', 'T'): 0.0020863156431362635,\n",
+       " ('A', 'U'): 0.005504407858086211,\n",
+       " ('A', 'V'): 0.00322064273834217,\n",
+       " ('A', 'W'): 0.0,\n",
+       " ('A', 'X'): 2.4177486931564615e-05,\n",
+       " ('A', 'Y'): 0.0002871076573123298,\n",
+       " ('A', 'Z'): 1.4103534043412693e-05,\n",
+       " ('B', ' '): 3.828102097497731e-05,\n",
+       " ('B', 'A'): 0.0012189482994663828,\n",
+       " ('B', 'B'): 6.245850790654193e-05,\n",
+       " ('B', 'C'): 0.0,\n",
+       " ('B', 'D'): 5.036976444075962e-06,\n",
+       " ('B', 'E'): 0.001283421597950555,\n",
+       " ('B', 'F'): 0.0,\n",
+       " ('B', 'G'): 0.0,\n",
+       " ('B', 'H'): 0.0,\n",
+       " ('B', 'I'): 0.0007706573959436221,\n",
+       " ('B', 'J'): 2.4177486931564615e-05,\n",
+       " ('B', 'K'): 0.0,\n",
+       " ('B', 'L'): 0.0015423221871760594,\n",
+       " ('B', 'M'): 4.029581155260769e-06,\n",
+       " ('B', 'N'): 1.0073952888151923e-06,\n",
+       " ('B', 'O'): 0.001587654975172743,\n",
+       " ('B', 'P'): 0.0,\n",
+       " ('B', 'Q'): 0.0,\n",
+       " ('B', 'R'): 0.0012582367157301752,\n",
+       " ('B', 'S'): 0.00014707971216701809,\n",
+       " ('B', 'T'): 1.1081348176967115e-05,\n",
+       " ('B', 'U'): 0.0003858323956162187,\n",
+       " ('B', 'V'): 1.0073952888151923e-06,\n",
+       " ('B', 'W'): 0.0,\n",
+       " ('B', 'X'): 0.0,\n",
+       " ('B', 'Y'): 1.3096138754597501e-05,\n",
+       " ('B', 'Z'): 0.0,\n",
+       " ('C', ' '): 0.0013277469906584234,\n",
+       " ('C', 'A'): 0.0015121003285116037,\n",
+       " ('C', 'B'): 0.0,\n",
+       " ('C', 'C'): 0.00033647002646427425,\n",
+       " ('C', 'D'): 0.0,\n",
+       " ('C', 'E'): 0.006391923107532395,\n",
+       " ('C', 'F'): 5.036976444075962e-06,\n",
+       " ('C', 'G'): 0.0,\n",
+       " ('C', 'H'): 0.004773038878406381,\n",
+       " ('C', 'I'): 0.0013116286660373804,\n",
+       " ('C', 'J'): 0.0,\n",
+       " ('C', 'K'): 2.0147905776303846e-06,\n",
+       " ('C', 'L'): 0.0011333196999170913,\n",
+       " ('C', 'M'): 0.0,\n",
+       " ('C', 'N'): 1.0073952888151923e-06,\n",
+       " ('C', 'O'): 0.004954370030393116,\n",
+       " ('C', 'P'): 0.0,\n",
+       " ('C', 'Q'): 0.00012793920167952942,\n",
+       " ('C', 'R'): 0.0014939672133129302,\n",
+       " ('C', 'S'): 8.159901839403058e-05,\n",
+       " ('C', 'T'): 0.0007001397257265586,\n",
+       " ('C', 'U'): 0.0007233098173693081,\n",
+       " ('C', 'V'): 0.0,\n",
+       " ('C', 'W'): 0.0,\n",
+       " ('C', 'X'): 0.0,\n",
+       " ('C', 'Y'): 2.7199672798010194e-05,\n",
+       " ('C', 'Z'): 0.0,\n",
+       " ('D', ' '): 0.001283421597950555,\n",
+       " ('D', 'A'): 0.0029859196360482302,\n",
+       " ('D', 'B'): 0.0,\n",
+       " ('D', 'C'): 0.0,\n",
+       " ('D', 'D'): 0.0,\n",
+       " ('D', 'E'): 0.015477621217356614,\n",
+       " ('D', 'F'): 0.0,\n",
+       " ('D', 'G'): 0.0,\n",
+       " ('D', 'H'): 4.029581155260769e-06,\n",
+       " ('D', 'I'): 0.0034865950945893805,\n",
+       " ('D', 'J'): 4.130320684142288e-05,\n",
+       " ('D', 'K'): 0.0,\n",
+       " ('D', 'L'): 1.0073952888151923e-06,\n",
+       " ('D', 'M'): 4.9362369151944425e-05,\n",
+       " ('D', 'N'): 0.0,\n",
+       " ('D', 'O'): 0.0018505851455535083,\n",
+       " ('D', 'P'): 0.0,\n",
+       " ('D', 'Q'): 0.0,\n",
+       " ('D', 'R'): 0.0009257962704211617,\n",
+       " ('D', 'S'): 0.00045030569410039095,\n",
+       " ('D', 'T'): 3.022185866445577e-06,\n",
+       " ('D', 'U'): 0.002153811127486881,\n",
+       " ('D', 'V'): 7.051767021706346e-06,\n",
+       " ('D', 'W'): 0.0,\n",
+       " ('D', 'X'): 0.0,\n",
+       " ('D', 'Y'): 5.036976444075962e-06,\n",
+       " ('D', 'Z'): 0.0,\n",
+       " ('E', ' '): 0.057268407378566054,\n",
+       " ('E', 'A'): 0.0012612589015966208,\n",
+       " ('E', 'B'): 0.0005550748041371709,\n",
+       " ('E', 'C'): 0.003330448824823026,\n",
+       " ('E', 'D'): 0.0008099458122074147,\n",
+       " ('E', 'E'): 0.0018354742162212804,\n",
+       " ('E', 'F'): 0.0007847609299870348,\n",
+       " ('E', 'G'): 0.0011383566763611673,\n",
+       " ('E', 'H'): 0.00026998193740247154,\n",
+       " ('E', 'I'): 0.0013418505247018361,\n",
+       " ('E', 'J'): 0.00014103534043412693,\n",
+       " ('E', 'K'): 2.0147905776303846e-06,\n",
+       " ('E', 'L'): 0.005157863878733785,\n",
+       " ('E', 'M'): 0.003989285343708161,\n",
+       " ('E', 'N'): 0.014341279331573078,\n",
+       " ('E', 'O'): 0.00017226459438739788,\n",
+       " ('E', 'P'): 0.0016380247396135027,\n",
+       " ('E', 'Q'): 0.0002226343588281575,\n",
+       " ('E', 'R'): 0.009805985741327083,\n",
+       " ('E', 'S'): 0.017492411794987,\n",
+       " ('E', 'T'): 0.011831857667134434,\n",
+       " ('E', 'U'): 0.006431211523796188,\n",
+       " ('E', 'V'): 0.0018213706821778677,\n",
+       " ('E', 'W'): 0.0,\n",
+       " ('E', 'X'): 0.0004462761129451302,\n",
+       " ('E', 'Y'): 5.036976444075962e-06,\n",
+       " ('E', 'Z'): 0.00107287598258818,\n",
+       " ('F', ' '): 0.00019341989545251692,\n",
+       " ('F', 'A'): 0.0020309089022514278,\n",
+       " ('F', 'B'): 0.0,\n",
+       " ('F', 'C'): 0.0,\n",
+       " ('F', 'D'): 0.0,\n",
+       " ('F', 'E'): 0.0011101496082743419,\n",
+       " ('F', 'F'): 0.0008693821342475109,\n",
+       " ('F', 'G'): 0.0,\n",
+       " ('F', 'H'): 0.0,\n",
+       " ('F', 'I'): 0.0015413147918872442,\n",
+       " ('F', 'J'): 0.0,\n",
+       " ('F', 'K'): 0.0,\n",
+       " ('F', 'L'): 0.0005671635476029533,\n",
+       " ('F', 'M'): 0.0,\n",
+       " ('F', 'N'): 0.0,\n",
+       " ('F', 'O'): 0.001540307396598429,\n",
+       " ('F', 'P'): 0.0,\n",
+       " ('F', 'Q'): 0.0,\n",
+       " ('F', 'R'): 0.0007525242807449486,\n",
+       " ('F', 'S'): 3.7273625686162116e-05,\n",
+       " ('F', 'T'): 0.0,\n",
+       " ('F', 'U'): 0.00042209862601356557,\n",
+       " ('F', 'V'): 0.0,\n",
+       " ('F', 'W'): 0.0,\n",
+       " ('F', 'X'): 0.0,\n",
+       " ('F', 'Y'): 0.0,\n",
+       " ('F', 'Z'): 0.0,\n",
+       " ('G', ' '): 0.00013096138754597502,\n",
+       " ('G', 'A'): 0.0010094100793928227,\n",
+       " ('G', 'B'): 0.0,\n",
+       " ('G', 'C'): 0.0,\n",
+       " ('G', 'D'): 0.0,\n",
+       " ('G', 'E'): 0.002404652554401864,\n",
+       " ('G', 'F'): 0.0,\n",
+       " ('G', 'G'): 2.0147905776303846e-06,\n",
+       " ('G', 'H'): 2.0147905776303846e-06,\n",
+       " ('G', 'I'): 0.0005510452229819102,\n",
+       " ('G', 'J'): 0.0,\n",
+       " ('G', 'K'): 0.0,\n",
+       " ('G', 'L'): 0.00046440922814380365,\n",
+       " ('G', 'M'): 2.4177486931564615e-05,\n",
+       " ('G', 'N'): 0.0008734117154027718,\n",
+       " ('G', 'O'): 0.0007253246079469385,\n",
+       " ('G', 'P'): 0.0,\n",
+       " ('G', 'Q'): 0.0,\n",
+       " ('G', 'R'): 0.0017518604072496195,\n",
+       " ('G', 'S'): 4.130320684142288e-05,\n",
+       " ('G', 'T'): 0.00015110929332227884,\n",
+       " ('G', 'U'): 0.0008492342284712072,\n",
+       " ('G', 'V'): 0.0,\n",
+       " ('G', 'W'): 0.0,\n",
+       " ('G', 'X'): 0.0,\n",
+       " ('G', 'Y'): 0.00021860477767289674,\n",
+       " ('G', 'Z'): 4.029581155260769e-06,\n",
+       " ('H', ' '): 0.0003203517018432312,\n",
+       " ('H', 'A'): 0.002435881808355135,\n",
+       " ('H', 'B'): 0.0,\n",
+       " ('H', 'C'): 0.0,\n",
+       " ('H', 'D'): 0.0,\n",
+       " ('H', 'E'): 0.003007074937113349,\n",
+       " ('H', 'F'): 0.0,\n",
+       " ('H', 'G'): 0.0,\n",
+       " ('H', 'H'): 0.0,\n",
+       " ('H', 'I'): 0.0010275431945914962,\n",
+       " ('H', 'J'): 0.0,\n",
+       " ('H', 'K'): 0.0,\n",
+       " ('H', 'L'): 3.022185866445577e-06,\n",
+       " ('H', 'M'): 3.022185866445577e-06,\n",
+       " ('H', 'N'): 0.0,\n",
+       " ('H', 'O'): 0.0013952424750090413,\n",
+       " ('H', 'P'): 0.0,\n",
+       " ('H', 'Q'): 0.0,\n",
+       " ('H', 'R'): 5.137715972957481e-05,\n",
+       " ('H', 'S'): 0.0,\n",
+       " ('H', 'T'): 3.022185866445577e-06,\n",
+       " ('H', 'U'): 0.00042209862601356557,\n",
+       " ('H', 'V'): 0.0,\n",
+       " ('H', 'W'): 0.0,\n",
+       " ('H', 'X'): 0.0,\n",
+       " ('H', 'Y'): 5.2384555018390004e-05,\n",
+       " ('H', 'Z'): 0.0,\n",
+       " ('I', ' '): 0.006347597714824527,\n",
+       " ('I', 'A'): 0.0010617946344112128,\n",
+       " ('I', 'B'): 0.0004311651836129023,\n",
+       " ('I', 'C'): 0.0011333196999170913,\n",
+       " ('I', 'D'): 0.0009278110609987921,\n",
+       " ('I', 'E'): 0.008215308580287893,\n",
+       " ('I', 'F'): 0.0004593722516997277,\n",
+       " ('I', 'G'): 0.0011222383517401242,\n",
+       " ('I', 'H'): 0.0,\n",
+       " ('I', 'I'): 0.00011182087705848635,\n",
+       " ('I', 'J'): 2.0147905776303846e-06,\n",
+       " ('I', 'K'): 1.0073952888151923e-06,\n",
+       " ('I', 'L'): 0.006979234560911652,\n",
+       " ('I', 'M'): 0.0012713328544847727,\n",
+       " ('I', 'N'): 0.0063203980420265165,\n",
+       " ('I', 'O'): 0.001241110995820317,\n",
+       " ('I', 'P'): 0.00018133115198673463,\n",
+       " ('I', 'Q'): 0.0005994001968450394,\n",
+       " ('I', 'R'): 0.0036256156444458773,\n",
+       " ('I', 'S'): 0.0071746692469418,\n",
+       " ('I', 'T'): 0.011940656358326475,\n",
+       " ('I', 'U'): 2.216269635393423e-05,\n",
+       " ('I', 'V'): 0.0010557502626783216,\n",
+       " ('I', 'W'): 0.0,\n",
+       " ('I', 'X'): 0.00047649797160958596,\n",
+       " ('I', 'Y'): 0.0,\n",
+       " ('I', 'Z'): 9.16729712821825e-05,\n",
+       " ('J', ' '): 1.0073952888151923e-06,\n",
+       " ('J', 'A'): 0.00038482500032740346,\n",
+       " ('J', 'B'): 0.0,\n",
+       " ('J', 'C'): 0.0,\n",
+       " ('J', 'D'): 0.0,\n",
+       " ('J', 'E'): 0.0017518604072496195,\n",
+       " ('J', 'F'): 0.0,\n",
+       " ('J', 'G'): 0.0,\n",
+       " ('J', 'H'): 0.0,\n",
+       " ('J', 'I'): 0.0,\n",
+       " ('J', 'J'): 0.0,\n",
+       " ('J', 'K'): 0.0,\n",
+       " ('J', 'L'): 0.0,\n",
+       " ('J', 'M'): 0.0,\n",
+       " ('J', 'N'): 0.0,\n",
+       " ('J', 'O'): 0.000895574411756706,\n",
+       " ('J', 'P'): 0.0,\n",
+       " ('J', 'Q'): 0.0,\n",
+       " ('J', 'R'): 0.0,\n",
+       " ('J', 'S'): 0.0,\n",
+       " ('J', 'T'): 0.0,\n",
+       " ('J', 'U'): 0.0005228381548950848,\n",
+       " ('J', 'V'): 0.0,\n",
+       " ('J', 'W'): 0.0,\n",
+       " ('J', 'X'): 0.0,\n",
+       " ('J', 'Y'): 0.0,\n",
+       " ('J', 'Z'): 0.0,\n",
+       " ('K', ' '): 1.0073952888151923e-06,\n",
+       " ('K', 'A'): 4.029581155260769e-06,\n",
+       " ('K', 'B'): 0.0,\n",
+       " ('K', 'C'): 0.0,\n",
+       " ('K', 'D'): 0.0,\n",
+       " ('K', 'E'): 9.066557599336732e-06,\n",
+       " ('K', 'F'): 0.0,\n",
+       " ('K', 'G'): 0.0,\n",
+       " ('K', 'H'): 1.0073952888151923e-06,\n",
+       " ('K', 'I'): 0.0,\n",
+       " ('K', 'J'): 0.0,\n",
+       " ('K', 'K'): 0.0,\n",
+       " ('K', 'L'): 2.0147905776303846e-06,\n",
+       " ('K', 'M'): 0.0,\n",
+       " ('K', 'N'): 0.0,\n",
+       " ('K', 'O'): 4.029581155260769e-06,\n",
+       " ('K', 'P'): 0.0,\n",
+       " ('K', 'Q'): 0.0,\n",
+       " ('K', 'R'): 1.0073952888151923e-06,\n",
+       " ('K', 'S'): 0.0,\n",
+       " ('K', 'T'): 0.0,\n",
+       " ('K', 'U'): 1.0073952888151923e-06,\n",
+       " ('K', 'V'): 0.0,\n",
+       " ('K', 'W'): 0.0,\n",
+       " ('K', 'X'): 0.0,\n",
+       " ('K', 'Y'): 2.0147905776303846e-06,\n",
+       " ('K', 'Z'): 0.0,\n",
+       " ('L', ' '): 0.00450507173158154,\n",
+       " ('L', 'A'): 0.009333517350872757,\n",
+       " ('L', 'B'): 2.0147905776303847e-05,\n",
+       " ('L', 'C'): 6.245850790654193e-05,\n",
+       " ('L', 'D'): 0.0001319687828347902,\n",
+       " ('L', 'E'): 0.017183141441320736,\n",
+       " ('L', 'F'): 4.029581155260769e-06,\n",
+       " ('L', 'G'): 3.828102097497731e-05,\n",
+       " ('L', 'H'): 0.00012390962052426867,\n",
+       " ('L', 'I'): 0.002576917148789262,\n",
+       " ('L', 'J'): 0.0,\n",
+       " ('L', 'K'): 0.0,\n",
+       " ('L', 'L'): 0.005408705305648767,\n",
+       " ('L', 'M'): 3.7273625686162116e-05,\n",
+       " ('L', 'N'): 1.0073952888151923e-06,\n",
+       " ('L', 'O'): 0.002151796336909251,\n",
+       " ('L', 'P'): 0.00010275431945914962,\n",
+       " ('L', 'Q'): 0.00045332787996683654,\n",
+       " ('L', 'R'): 0.0,\n",
+       " ('L', 'S'): 0.00043922434592342385,\n",
+       " ('L', 'T'): 0.0001692424085209523,\n",
+       " ('L', 'U'): 0.0027048563504687914,\n",
+       " ('L', 'V'): 1.3096138754597501e-05,\n",
+       " ('L', 'W'): 0.0,\n",
+       " ('L', 'X'): 6.044371732891154e-06,\n",
+       " ('L', 'Y'): 0.00011282827234730154,\n",
+       " ('L', 'Z'): 8.059162310521538e-06,\n",
+       " ('M', ' '): 0.00037374365215043636,\n",
+       " ('M', 'A'): 0.0040769287338350835,\n",
+       " ('M', 'B'): 0.001104105236541451,\n",
+       " ('M', 'C'): 0.0,\n",
+       " ('M', 'D'): 2.0147905776303846e-06,\n",
+       " ('M', 'E'): 0.007513154063983705,\n",
+       " ('M', 'F'): 0.0,\n",
+       " ('M', 'G'): 0.0,\n",
+       " ('M', 'H'): 0.0,\n",
+       " ('M', 'I'): 0.0019211028157705718,\n",
+       " ('M', 'J'): 0.0,\n",
+       " ('M', 'K'): 0.0,\n",
+       " ('M', 'L'): 2.0147905776303846e-06,\n",
+       " ('M', 'M'): 0.0018797996089291488,\n",
+       " ('M', 'N'): 8.965818070455211e-05,\n",
+       " ('M', 'O'): 0.0030947183272402707,\n",
+       " ('M', 'P'): 0.0013801315456768136,\n",
+       " ('M', 'Q'): 0.0,\n",
+       " ('M', 'R'): 0.0,\n",
+       " ('M', 'S'): 4.331799741905327e-05,\n",
+       " ('M', 'T'): 2.216269635393423e-05,\n",
+       " ('M', 'U'): 0.0005137715972957481,\n",
+       " ('M', 'V'): 0.0,\n",
+       " ('M', 'W'): 0.0,\n",
+       " ('M', 'X'): 0.0,\n",
+       " ('M', 'Y'): 7.8576832527585e-05,\n",
+       " ('M', 'Z'): 0.0,\n",
+       " ('N', ' '): 0.011271745886553186,\n",
+       " ('N', 'A'): 0.0016883945040542623,\n",
+       " ('N', 'B'): 5.036976444075962e-06,\n",
+       " ('N', 'C'): 0.0021588481039309573,\n",
+       " ('N', 'D'): 0.0033516041258881447,\n",
+       " ('N', 'E'): 0.007763995490898687,\n",
+       " ('N', 'F'): 0.0006396960083976471,\n",
+       " ('N', 'G'): 0.0014113607996300845,\n",
+       " ('N', 'H'): 2.9214463375640577e-05,\n",
+       " ('N', 'I'): 0.001224992671199274,\n",
+       " ('N', 'J'): 4.231060213023808e-05,\n",
+       " ('N', 'K'): 6.044371732891154e-06,\n",
+       " ('N', 'L'): 4.835497386312923e-05,\n",
+       " ('N', 'M'): 9.066557599336732e-06,\n",
+       " ('N', 'N'): 0.0016873871087654472,\n",
+       " ('N', 'O'): 0.002162877685086218,\n",
+       " ('N', 'P'): 1.0073952888151923e-06,\n",
+       " ('N', 'Q'): 0.0001843533378531802,\n",
+       " ('N', 'R'): 7.051767021706346e-05,\n",
+       " ('N', 'S'): 0.004723676509254437,\n",
+       " ('N', 'T'): 0.011739177300563437,\n",
+       " ('N', 'U'): 0.0007414429325679815,\n",
+       " ('N', 'V'): 0.00023069352113867905,\n",
+       " ('N', 'W'): 0.0,\n",
+       " ('N', 'X'): 1.0073952888151924e-05,\n",
+       " ('N', 'Y'): 1.5110929332227885e-05,\n",
+       " ('N', 'Z'): 8.865078541573692e-05,\n",
+       " ('O', ' '): 0.0004210912307247504,\n",
+       " ('O', 'A'): 1.9140510487488655e-05,\n",
+       " ('O', 'B'): 0.0003636696992622844,\n",
+       " ('O', 'C'): 0.000649769961285799,\n",
+       " ('O', 'D'): 0.00045332787996683654,\n",
+       " ('O', 'E'): 0.0006991323304377435,\n",
+       " ('O', 'F'): 0.00023976007873801578,\n",
+       " ('O', 'G'): 0.0003062481677998185,\n",
+       " ('O', 'H'): 0.00029919640077811214,\n",
+       " ('O', 'I'): 0.005168945226910752,\n",
+       " ('O', 'J'): 8.059162310521538e-06,\n",
+       " ('O', 'K'): 0.0,\n",
+       " ('O', 'L'): 0.0015624700929523633,\n",
+       " ('O', 'M'): 0.003261945945183593,\n",
+       " ('O', 'N'): 0.009751586395731062,\n",
+       " ('O', 'O'): 1.0073952888151923e-06,\n",
+       " ('O', 'P'): 0.0006094741497331914,\n",
+       " ('O', 'Q'): 9.469515714862808e-05,\n",
+       " ('O', 'R'): 0.003753554846125407,\n",
+       " ('O', 'S'): 0.0012280148570657195,\n",
+       " ('O', 'T'): 0.0013861759174097045,\n",
+       " ('O', 'U'): 0.012327496149231508,\n",
+       " ('O', 'V'): 5.339195030720519e-05,\n",
+       " ('O', 'W'): 1.0073952888151923e-06,\n",
+       " ('O', 'X'): 1.0073952888151923e-06,\n",
+       " ('O', 'Y'): 0.0005107494114293025,\n",
+       " ('O', 'Z'): 1.0073952888151923e-06,\n",
+       " ('P', ' '): 0.0003606475133958388,\n",
+       " ('P', 'A'): 0.004955377425681931,\n",
+       " ('P', 'B'): 0.0,\n",
+       " ('P', 'C'): 2.0147905776303846e-06,\n",
+       " ('P', 'D'): 0.0,\n",
+       " ('P', 'E'): 0.003739451312081994,\n",
+       " ('P', 'F'): 0.0,\n",
+       " ('P', 'G'): 0.0,\n",
+       " ('P', 'H'): 0.000607459359155561,\n",
+       " ('P', 'I'): 0.0015715366505517,\n",
+       " ('P', 'J'): 0.0,\n",
+       " ('P', 'K'): 0.0,\n",
+       " ('P', 'L'): 0.002167914661530294,\n",
+       " ('P', 'M'): 1.0073952888151923e-06,\n",
+       " ('P', 'N'): 0.0,\n",
+       " ('P', 'O'): 0.003111844047150129,\n",
+       " ('P', 'P'): 0.0007827461394094044,\n",
+       " ('P', 'Q'): 0.0,\n",
+       " ('P', 'R'): 0.0028992836412101235,\n",
+       " ('P', 'S'): 0.0004120246731254137,\n",
+       " ('P', 'T'): 0.0004916089009418138,\n",
+       " ('P', 'U'): 0.0008603155766481743,\n",
+       " ('P', 'V'): 1.0073952888151923e-06,\n",
+       " ('P', 'W'): 0.0,\n",
+       " ('P', 'X'): 0.0,\n",
+       " ('P', 'Y'): 1.8133115198673464e-05,\n",
+       " ('P', 'Z'): 0.0,\n",
+       " ('Q', ' '): 3.626623039734693e-05,\n",
+       " ('Q', 'A'): 0.0,\n",
+       " ('Q', 'B'): 0.0,\n",
+       " ('Q', 'C'): 0.0,\n",
+       " ('Q', 'D'): 0.0,\n",
+       " ('Q', 'E'): 0.0,\n",
+       " ('Q', 'F'): 0.0,\n",
+       " ('Q', 'G'): 0.0,\n",
+       " ('Q', 'H'): 0.0,\n",
+       " ('Q', 'I'): 0.0,\n",
+       " ('Q', 'J'): 0.0,\n",
+       " ('Q', 'K'): 0.0,\n",
+       " ('Q', 'L'): 0.0,\n",
+       " ('Q', 'M'): 0.0,\n",
+       " ('Q', 'N'): 0.0,\n",
+       " ('Q', 'O'): 0.0,\n",
+       " ('Q', 'P'): 0.0,\n",
+       " ('Q', 'Q'): 0.0,\n",
+       " ('Q', 'R'): 0.0,\n",
+       " ('Q', 'S'): 0.0,\n",
+       " ('Q', 'T'): 0.0,\n",
+       " ('Q', 'U'): 0.009879525597410592,\n",
+       " ('Q', 'V'): 0.0,\n",
+       " ('Q', 'W'): 0.0,\n",
+       " ('Q', 'X'): 0.0,\n",
+       " ('Q', 'Y'): 0.0,\n",
+       " ('Q', 'Z'): 0.0,\n",
+       " ('R', ' '): 0.009421160740999678,\n",
+       " ('R', 'A'): 0.00497653272674705,\n",
+       " ('R', 'B'): 0.0002498340316261677,\n",
+       " ('R', 'C'): 0.0012169335088887524,\n",
+       " ('R', 'D'): 0.001712571990985827,\n",
+       " ('R', 'E'): 0.01647393515799484,\n",
+       " ('R', 'F'): 5.2384555018390004e-05,\n",
+       " ('R', 'G'): 0.0006296220555094953,\n",
+       " ('R', 'H'): 1.3096138754597501e-05,\n",
+       " ('R', 'I'): 0.004897955894219465,\n",
+       " ('R', 'J'): 2.0147905776303846e-06,\n",
+       " ('R', 'K'): 0.0,\n",
+       " ('R', 'L'): 0.00028106328557943864,\n",
+       " ('R', 'M'): 0.001010417474681638,\n",
+       " ('R', 'N'): 0.0006820066105278852,\n",
+       " ('R', 'O'): 0.003953019113310815,\n",
+       " ('R', 'P'): 0.00024076747402683097,\n",
+       " ('R', 'Q'): 0.00012693180639071423,\n",
+       " ('R', 'R'): 0.0014546787970491377,\n",
+       " ('R', 'S'): 0.0023603271616939956,\n",
+       " ('R', 'T'): 0.0022515284705019547,\n",
+       " ('R', 'U'): 0.0011302975140506457,\n",
+       " ('R', 'V'): 0.0003636696992622844,\n",
+       " ('R', 'W'): 0.0,\n",
+       " ('R', 'X'): 0.0,\n",
+       " ('R', 'Y'): 8.059162310521539e-05,\n",
+       " ('R', 'Z'): 1.3096138754597501e-05,\n",
+       " ('S', ' '): 0.02958518484192457,\n",
+       " ('S', 'A'): 0.004386199087501348,\n",
+       " ('S', 'B'): 7.051767021706346e-06,\n",
+       " ('S', 'C'): 0.0004966458773858898,\n",
+       " ('S', 'D'): 1.3096138754597501e-05,\n",
+       " ('S', 'E'): 0.007897979064311108,\n",
+       " ('S', 'F'): 2.8207068086825385e-05,\n",
+       " ('S', 'G'): 4.029581155260769e-06,\n",
+       " ('S', 'H'): 1.6118324621043076e-05,\n",
+       " ('S', 'I'): 0.0033989517044624587,\n",
+       " ('S', 'J'): 0.0,\n",
+       " ('S', 'K'): 0.0,\n",
+       " ('S', 'L'): 1.9140510487488655e-05,\n",
+       " ('S', 'M'): 0.00012793920167952942,\n",
+       " ('S', 'N'): 1.2088743465782307e-05,\n",
+       " ('S', 'O'): 0.003906678930025316,\n",
+       " ('S', 'P'): 0.0005953706156897787,\n",
+       " ('S', 'Q'): 0.000560111780581247,\n",
+       " ('S', 'R'): 4.029581155260769e-06,\n",
+       " ('S', 'S'): 0.003540994440185401,\n",
+       " ('S', 'T'): 0.0035006986286327934,\n",
+       " ('S', 'U'): 0.0023804750674702993,\n",
+       " ('S', 'V'): 6.044371732891154e-06,\n",
+       " ('S', 'W'): 0.0,\n",
+       " ('S', 'X'): 0.0,\n",
+       " ('S', 'Y'): 6.044371732891154e-05,\n",
+       " ('S', 'Z'): 0.0,\n",
+       " ('T', ' '): 0.02605627914520495,\n",
+       " ('T', 'A'): 0.004757927949074153,\n",
+       " ('T', 'B'): 0.0,\n",
+       " ('T', 'C'): 2.216269635393423e-05,\n",
+       " ('T', 'D'): 0.0,\n",
+       " ('T', 'E'): 0.010749915126946917,\n",
+       " ('T', 'F'): 1.3096138754597501e-05,\n",
+       " ('T', 'G'): 0.0,\n",
+       " ('T', 'H'): 0.0003233738877096767,\n",
+       " ('T', 'I'): 0.0034855876993005654,\n",
+       " ('T', 'J'): 0.0,\n",
+       " ('T', 'K'): 0.0,\n",
+       " ('T', 'L'): 3.022185866445577e-06,\n",
+       " ('T', 'M'): 1.0073952888151924e-05,\n",
+       " ('T', 'N'): 1.0073952888151923e-06,\n",
+       " ('T', 'O'): 0.003620578668001801,\n",
+       " ('T', 'P'): 0.0,\n",
+       " ('T', 'Q'): 1.0073952888151923e-06,\n",
+       " ('T', 'R'): 0.005041006025231222,\n",
+       " ('T', 'S'): 0.0010990682600973748,\n",
+       " ('T', 'T'): 0.001917073234615311,\n",
+       " ('T', 'U'): 0.0013650206163445856,\n",
+       " ('T', 'V'): 0.0,\n",
+       " ('T', 'W'): 0.0,\n",
+       " ('T', 'X'): 0.0,\n",
+       " ('T', 'Y'): 1.9140510487488655e-05,\n",
+       " ('T', 'Z'): 0.0,\n",
+       " ('U', ' '): 0.005950683971031341,\n",
+       " ('U', 'A'): 0.0012310370429321651,\n",
+       " ('U', 'B'): 0.00032236649242086156,\n",
+       " ('U', 'C'): 0.000816997579229121,\n",
+       " ('U', 'D'): 0.0007223024220804929,\n",
+       " ('U', 'E'): 0.006516840123345479,\n",
+       " ('U', 'F'): 0.00026192277509195003,\n",
+       " ('U', 'G'): 0.0003284108641537527,\n",
+       " ('U', 'H'): 1.1081348176967115e-05,\n",
+       " ('U', 'I'): 0.005311995357922509,\n",
+       " ('U', 'J'): 0.0002719967279801019,\n",
+       " ('U', 'K'): 0.0,\n",
+       " ('U', 'L'): 0.0016047806950826014,\n",
+       " ('U', 'M'): 0.0006668956811956573,\n",
+       " ('U', 'N'): 0.005457060279511897,\n",
+       " ('U', 'O'): 0.00014103534043412693,\n",
+       " ('U', 'P'): 0.000974151244284291,\n",
+       " ('U', 'Q'): 3.828102097497731e-05,\n",
+       " ('U', 'R'): 0.008690799156608664,\n",
+       " ('U', 'S'): 0.005419786653825735,\n",
+       " ('U', 'T'): 0.004235089794179069,\n",
+       " ('U', 'U'): 1.0073952888151923e-06,\n",
+       " ('U', 'V'): 0.0013136434566150107,\n",
+       " ('U', 'W'): 0.0,\n",
+       " ('U', 'X'): 0.0022344027505920966,\n",
+       " ('U', 'Y'): 9.268036657099769e-05,\n",
+       " ('U', 'Z'): 3.022185866445577e-05,\n",
+       " ('V', ' '): 7.051767021706346e-05,\n",
+       " ('V', 'A'): 0.002824736389837799,\n",
+       " ('V', 'B'): 0.0,\n",
+       " ('V', 'C'): 0.0,\n",
+       " ('V', 'D'): 0.0,\n",
+       " ('V', 'E'): 0.004388213878078978,\n",
+       " ('V', 'F'): 0.0,\n",
+       " ('V', 'G'): 0.0,\n",
+       " ('V', 'H'): 0.0,\n",
+       " ('V', 'I'): 0.0021900773578842282,\n",
+       " ('V', 'J'): 0.0,\n",
+       " ('V', 'K'): 0.0,\n",
+       " ('V', 'L'): 0.0,\n",
+       " ('V', 'M'): 0.0,\n",
+       " ('V', 'N'): 0.0,\n",
+       " ('V', 'O'): 0.0030665112591534453,\n",
+       " ('V', 'P'): 0.0,\n",
+       " ('V', 'Q'): 0.0,\n",
+       " ('V', 'R'): 0.0009137075269553794,\n",
+       " ('V', 'S'): 1.0073952888151923e-06,\n",
+       " ('V', 'T'): 0.0,\n",
+       " ('V', 'U'): 0.00018536073314199538,\n",
+       " ('V', 'V'): 0.0,\n",
+       " ('V', 'W'): 0.0,\n",
+       " ('V', 'X'): 0.0,\n",
+       " ('V', 'Y'): 2.0147905776303846e-06,\n",
+       " ('V', 'Z'): 0.0,\n",
+       " ('W', ' '): 0.0,\n",
+       " ('W', 'A'): 0.0,\n",
+       " ('W', 'B'): 0.0,\n",
+       " ('W', 'C'): 0.0,\n",
+       " ('W', 'D'): 0.0,\n",
+       " ('W', 'E'): 0.0,\n",
+       " ('W', 'F'): 0.0,\n",
+       " ('W', 'G'): 0.0,\n",
+       " ('W', 'H'): 0.0,\n",
+       " ('W', 'I'): 1.0073952888151923e-06,\n",
+       " ('W', 'J'): 0.0,\n",
+       " ('W', 'K'): 0.0,\n",
+       " ('W', 'L'): 0.0,\n",
+       " ('W', 'M'): 0.0,\n",
+       " ('W', 'N'): 0.0,\n",
+       " ('W', 'O'): 1.0073952888151923e-06,\n",
+       " ('W', 'P'): 1.0073952888151923e-06,\n",
+       " ('W', 'Q'): 0.0,\n",
+       " ('W', 'R'): 0.0,\n",
+       " ('W', 'S'): 0.0,\n",
+       " ('W', 'T'): 0.0,\n",
+       " ('W', 'U'): 0.0,\n",
+       " ('W', 'V'): 0.0,\n",
+       " ('W', 'W'): 0.0,\n",
+       " ('W', 'X'): 0.0,\n",
+       " ('W', 'Y'): 0.0,\n",
+       " ('W', 'Z'): 0.0,\n",
+       " ('X', ' '): 0.0024701332481748516,\n",
+       " ('X', 'A'): 8.562859954929134e-05,\n",
+       " ('X', 'B'): 0.0,\n",
+       " ('X', 'C'): 5.137715972957481e-05,\n",
+       " ('X', 'D'): 1.0073952888151923e-06,\n",
+       " ('X', 'E'): 0.00012290222523545345,\n",
+       " ('X', 'F'): 0.0,\n",
+       " ('X', 'G'): 0.0,\n",
+       " ('X', 'H'): 4.029581155260769e-06,\n",
+       " ('X', 'I'): 0.00013801315456768136,\n",
+       " ('X', 'J'): 0.0,\n",
+       " ('X', 'K'): 0.0,\n",
+       " ('X', 'L'): 0.0,\n",
+       " ('X', 'M'): 0.0,\n",
+       " ('X', 'N'): 0.0,\n",
+       " ('X', 'O'): 1.5110929332227885e-05,\n",
+       " ('X', 'P'): 0.00012390962052426867,\n",
+       " ('X', 'Q'): 9.066557599336732e-06,\n",
+       " ('X', 'R'): 0.0,\n",
+       " ('X', 'S'): 1.0073952888151923e-06,\n",
+       " ('X', 'T'): 0.00011182087705848635,\n",
+       " ('X', 'U'): 1.2088743465782307e-05,\n",
+       " ('X', 'V'): 9.066557599336732e-06,\n",
+       " ('X', 'W'): 0.0,\n",
+       " ('X', 'X'): 1.0073952888151923e-06,\n",
+       " ('X', 'Y'): 0.0,\n",
+       " ('X', 'Z'): 0.0,\n",
+       " ('Y', ' '): 0.0007565538619002094,\n",
+       " ('Y', 'A'): 0.00038986197677147943,\n",
+       " ('Y', 'B'): 1.3096138754597501e-05,\n",
+       " ('Y', 'C'): 1.2088743465782307e-05,\n",
+       " ('Y', 'D'): 7.051767021706346e-06,\n",
+       " ('Y', 'E'): 0.0005913410345345179,\n",
+       " ('Y', 'F'): 0.0,\n",
+       " ('Y', 'G'): 1.712571990985827e-05,\n",
+       " ('Y', 'H'): 0.0,\n",
+       " ('Y', 'I'): 4.029581155260769e-06,\n",
+       " ('Y', 'J'): 0.0,\n",
+       " ('Y', 'K'): 0.0,\n",
+       " ('Y', 'L'): 1.9140510487488655e-05,\n",
+       " ('Y', 'M'): 8.562859954929134e-05,\n",
+       " ('Y', 'N'): 6.044371732891154e-06,\n",
+       " ('Y', 'O'): 8.764339012692174e-05,\n",
+       " ('Y', 'P'): 0.0002508414269149829,\n",
+       " ('Y', 'Q'): 0.0,\n",
+       " ('Y', 'R'): 3.425143981971654e-05,\n",
+       " ('Y', 'S'): 0.00019241250016370173,\n",
+       " ('Y', 'T'): 1.3096138754597501e-05,\n",
+       " ('Y', 'U'): 0.0,\n",
+       " ('Y', 'V'): 2.0147905776303846e-06,\n",
+       " ('Y', 'W'): 0.0,\n",
+       " ('Y', 'X'): 2.0147905776303846e-06,\n",
+       " ('Y', 'Y'): 0.0,\n",
+       " ('Y', 'Z'): 2.0147905776303846e-06,\n",
+       " ('Z', ' '): 0.0008079310216297842,\n",
+       " ('Z', 'A'): 5.036976444075961e-05,\n",
+       " ('Z', 'B'): 0.0,\n",
+       " ('Z', 'C'): 0.0,\n",
+       " ('Z', 'D'): 0.0,\n",
+       " ('Z', 'E'): 0.00012088743465782308,\n",
+       " ('Z', 'F'): 0.0,\n",
+       " ('Z', 'G'): 0.0,\n",
+       " ('Z', 'H'): 0.0,\n",
+       " ('Z', 'I'): 7.454725137232423e-05,\n",
+       " ('Z', 'J'): 0.0,\n",
+       " ('Z', 'K'): 0.0,\n",
+       " ('Z', 'L'): 0.0,\n",
+       " ('Z', 'M'): 0.0,\n",
+       " ('Z', 'N'): 0.0,\n",
+       " ('Z', 'O'): 3.525883510853173e-05,\n",
+       " ('Z', 'P'): 0.0,\n",
+       " ('Z', 'Q'): 0.0,\n",
+       " ('Z', 'R'): 0.0,\n",
+       " ('Z', 'S'): 0.0,\n",
+       " ('Z', 'T'): 0.0,\n",
+       " ('Z', 'U'): 6.044371732891154e-06,\n",
+       " ('Z', 'V'): 0.0,\n",
+       " ('Z', 'W'): 0.0,\n",
+       " ('Z', 'X'): 0.0,\n",
+       " ('Z', 'Y'): 0.0,\n",
+       " ('Z', 'Z'): 0.0}"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "dic_bigrammes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "67831663",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(('E', ' '), 0.057268407378566054),\n",
+       " ((' ', ' '), 0.03262248163770237),\n",
+       " (('S', ' '), 0.02958518484192457),\n",
+       " (('T', ' '), 0.02605627914520495),\n",
+       " ((' ', 'D'), 0.02170030191636806),\n",
+       " ((' ', 'L'), 0.019695585291625826),\n",
+       " (('E', 'S'), 0.017492411794987),\n",
+       " (('L', 'E'), 0.017183141441320736),\n",
+       " (('R', 'E'), 0.01647393515799484),\n",
+       " (('D', 'E'), 0.015477621217356614),\n",
+       " (('E', 'N'), 0.014341279331573078),\n",
+       " ((' ', 'E'), 0.013803330247345764),\n",
+       " (('A', 'I'), 0.01378116755099183),\n",
+       " ((' ', 'S'), 0.013711657276063582),\n",
+       " ((' ', 'P'), 0.01343966054808348),\n",
+       " ((' ', 'C'), 0.013061887314777783),\n",
+       " (('O', 'U'), 0.012327496149231508),\n",
+       " (('I', 'T'), 0.011940656358326475),\n",
+       " (('E', 'T'), 0.011831857667134434),\n",
+       " (('N', 'T'), 0.011739177300563437),\n",
+       " (('N', ' '), 0.011271745886553186),\n",
+       " (('T', 'E'), 0.010749915126946917),\n",
+       " (('A', ' '), 0.009896651317320449),\n",
+       " (('Q', 'U'), 0.009879525597410592),\n",
+       " (('E', 'R'), 0.009805985741327083),\n",
+       " (('O', 'N'), 0.009751586395731062),\n",
+       " (('R', ' '), 0.009421160740999678),\n",
+       " (('L', 'A'), 0.009333517350872757),\n",
+       " (('A', 'N'), 0.008944662769390092),\n",
+       " (('U', 'R'), 0.008690799156608664),\n",
+       " ((' ', 'A'), 0.008402684104007518),\n",
+       " (('I', 'E'), 0.008215308580287893),\n",
+       " (('S', 'E'), 0.007897979064311108),\n",
+       " (('N', 'E'), 0.007763995490898687),\n",
+       " ((' ', 'M'), 0.007655196799706647),\n",
+       " (('M', 'E'), 0.007513154063983705),\n",
+       " (('I', 'S'), 0.0071746692469418),\n",
+       " ((' ', 'Q'), 0.007045722649973455),\n",
+       " (('I', 'L'), 0.006979234560911652),\n",
+       " ((' ', 'T'), 0.006519862309211925),\n",
+       " (('U', 'E'), 0.006516840123345479),\n",
+       " (('E', 'U'), 0.006431211523796188),\n",
+       " (('C', 'E'), 0.006391923107532395),\n",
+       " (('I', ' '), 0.006347597714824527),\n",
+       " (('I', 'N'), 0.0063203980420265165),\n",
+       " (('A', 'R'), 0.006013142478937883),\n",
+       " (('U', ' '), 0.005950683971031341),\n",
+       " (('A', 'U'), 0.005504407858086211),\n",
+       " ((' ', 'F'), 0.005501385672219765),\n",
+       " (('U', 'N'), 0.005457060279511897),\n",
+       " (('U', 'S'), 0.005419786653825735),\n",
+       " (('L', 'L'), 0.005408705305648767),\n",
+       " ((' ', 'R'), 0.005337180240142889),\n",
+       " (('U', 'I'), 0.005311995357922509),\n",
+       " (('O', 'I'), 0.005168945226910752),\n",
+       " (('E', 'L'), 0.005157863878733785),\n",
+       " ((' ', 'V'), 0.00510648671900421),\n",
+       " (('T', 'R'), 0.005041006025231222),\n",
+       " (('R', 'A'), 0.00497653272674705),\n",
+       " (('P', 'A'), 0.004955377425681931),\n",
+       " (('C', 'O'), 0.004954370030393116),\n",
+       " (('R', 'I'), 0.004897955894219465),\n",
+       " (('C', 'H'), 0.004773038878406381),\n",
+       " (('T', 'A'), 0.004757927949074153),\n",
+       " (('N', 'S'), 0.004723676509254437),\n",
+       " (('L', ' '), 0.00450507173158154),\n",
+       " (('V', 'E'), 0.004388213878078978),\n",
+       " (('S', 'A'), 0.004386199087501348),\n",
+       " (('U', 'T'), 0.004235089794179069),\n",
+       " ((' ', 'N'), 0.004184720029738309),\n",
+       " (('M', 'A'), 0.0040769287338350835),\n",
+       " ((' ', 'B'), 0.0039953297154410525),\n",
+       " (('E', 'M'), 0.003989285343708161),\n",
+       " (('R', 'O'), 0.003953019113310815),\n",
+       " (('S', 'O'), 0.003906678930025316),\n",
+       " ((' ', 'U'), 0.003761614008435928),\n",
+       " (('O', 'R'), 0.003753554846125407),\n",
+       " (('P', 'E'), 0.003739451312081994),\n",
+       " (('I', 'R'), 0.0036256156444458773),\n",
+       " (('T', 'O'), 0.003620578668001801),\n",
+       " ((' ', 'I'), 0.00361251950569128),\n",
+       " (('S', 'S'), 0.003540994440185401),\n",
+       " (('S', 'T'), 0.0035006986286327934),\n",
+       " (('D', 'I'), 0.0034865950945893805),\n",
+       " (('T', 'I'), 0.0034855876993005654),\n",
+       " (('S', 'I'), 0.0033989517044624587),\n",
+       " (('A', 'S'), 0.003386862960996677),\n",
+       " (('N', 'D'), 0.0033516041258881447),\n",
+       " (('E', 'C'), 0.003330448824823026),\n",
+       " (('O', 'M'), 0.003261945945183593),\n",
+       " (('A', 'V'), 0.00322064273834217),\n",
+       " (('P', 'O'), 0.003111844047150129),\n",
+       " (('M', 'O'), 0.0030947183272402707),\n",
+       " (('V', 'O'), 0.0030665112591534453),\n",
+       " ((' ', 'J'), 0.003020171075867947),\n",
+       " (('H', 'E'), 0.003007074937113349),\n",
+       " (('D', 'A'), 0.0029859196360482302),\n",
+       " ((' ', 'G'), 0.00295871996325022),\n",
+       " (('P', 'R'), 0.0028992836412101235),\n",
+       " (('V', 'A'), 0.002824736389837799),\n",
+       " (('L', 'U'), 0.0027048563504687914),\n",
+       " (('A', 'L'), 0.0026061316121649023),\n",
+       " (('L', 'I'), 0.002576917148789262),\n",
+       " (('X', ' '), 0.0024701332481748516),\n",
+       " (('H', 'A'), 0.002435881808355135),\n",
+       " (('G', 'E'), 0.002404652554401864),\n",
+       " (('S', 'U'), 0.0023804750674702993),\n",
+       " (('R', 'S'), 0.0023603271616939956),\n",
+       " (('R', 'T'), 0.0022515284705019547),\n",
+       " (('U', 'X'), 0.0022344027505920966),\n",
+       " (('V', 'I'), 0.0021900773578842282),\n",
+       " (('P', 'L'), 0.002167914661530294),\n",
+       " (('N', 'O'), 0.002162877685086218),\n",
+       " (('N', 'C'), 0.0021588481039309573),\n",
+       " (('D', 'U'), 0.002153811127486881),\n",
+       " (('L', 'O'), 0.002151796336909251),\n",
+       " ((' ', 'O'), 0.002137692802865838),\n",
+       " (('A', 'T'), 0.0020863156431362635),\n",
+       " (('F', 'A'), 0.0020309089022514278),\n",
+       " (('M', 'I'), 0.0019211028157705718),\n",
+       " (('T', 'T'), 0.001917073234615311),\n",
+       " (('M', 'M'), 0.0018797996089291488),\n",
+       " (('D', 'O'), 0.0018505851455535083),\n",
+       " (('E', 'E'), 0.0018354742162212804),\n",
+       " (('E', 'V'), 0.0018213706821778677),\n",
+       " (('A', 'C'), 0.0018203632868890526),\n",
+       " (('G', 'R'), 0.0017518604072496195),\n",
+       " (('J', 'E'), 0.0017518604072496195),\n",
+       " (('R', 'D'), 0.001712571990985827),\n",
+       " (('N', 'A'), 0.0016883945040542623),\n",
+       " (('N', 'N'), 0.0016873871087654472),\n",
+       " (('E', 'P'), 0.0016380247396135027),\n",
+       " (('U', 'L'), 0.0016047806950826014),\n",
+       " (('B', 'O'), 0.001587654975172743),\n",
+       " (('A', 'M'), 0.0015725440458405151),\n",
+       " (('P', 'I'), 0.0015715366505517),\n",
+       " (('O', 'L'), 0.0015624700929523633),\n",
+       " (('B', 'L'), 0.0015423221871760594),\n",
+       " (('F', 'I'), 0.0015413147918872442),\n",
+       " (('F', 'O'), 0.001540307396598429),\n",
+       " ((' ', 'H'), 0.0015262038625550164),\n",
+       " (('C', 'A'), 0.0015121003285116037),\n",
+       " (('C', 'R'), 0.0014939672133129302),\n",
+       " (('R', 'R'), 0.0014546787970491377),\n",
+       " (('A', 'P'), 0.0014254643336734972),\n",
+       " (('N', 'G'), 0.0014113607996300845),\n",
+       " (('H', 'O'), 0.0013952424750090413),\n",
+       " (('O', 'T'), 0.0013861759174097045),\n",
+       " (('M', 'P'), 0.0013801315456768136),\n",
+       " (('T', 'U'), 0.0013650206163445856),\n",
+       " (('E', 'I'), 0.0013418505247018361),\n",
+       " (('C', ' '), 0.0013277469906584234),\n",
+       " (('U', 'V'), 0.0013136434566150107),\n",
+       " (('C', 'I'), 0.0013116286660373804),\n",
+       " (('B', 'E'), 0.001283421597950555),\n",
+       " (('D', ' '), 0.001283421597950555),\n",
+       " (('I', 'M'), 0.0012713328544847727),\n",
+       " (('E', 'A'), 0.0012612589015966208),\n",
+       " (('B', 'R'), 0.0012582367157301752),\n",
+       " (('I', 'O'), 0.001241110995820317),\n",
+       " (('U', 'A'), 0.0012310370429321651),\n",
+       " (('O', 'S'), 0.0012280148570657195),\n",
+       " (('N', 'I'), 0.001224992671199274),\n",
+       " (('B', 'A'), 0.0012189482994663828),\n",
+       " (('R', 'C'), 0.0012169335088887524),\n",
+       " (('E', 'G'), 0.0011383566763611673),\n",
+       " (('C', 'L'), 0.0011333196999170913),\n",
+       " (('I', 'C'), 0.0011333196999170913),\n",
+       " (('R', 'U'), 0.0011302975140506457),\n",
+       " (('I', 'G'), 0.0011222383517401242),\n",
+       " (('A', 'B'), 0.0011182087705848636),\n",
+       " (('F', 'E'), 0.0011101496082743419),\n",
+       " (('A', 'G'), 0.0011061200271190812),\n",
+       " (('M', 'B'), 0.001104105236541451),\n",
+       " (('T', 'S'), 0.0010990682600973748),\n",
+       " (('E', 'Z'), 0.00107287598258818),\n",
+       " (('I', 'A'), 0.0010617946344112128),\n",
+       " (('I', 'V'), 0.0010557502626783216),\n",
+       " (('H', 'I'), 0.0010275431945914962),\n",
+       " (('R', 'M'), 0.001010417474681638),\n",
+       " (('G', 'A'), 0.0010094100793928227),\n",
+       " (('U', 'P'), 0.000974151244284291),\n",
+       " (('I', 'D'), 0.0009278110609987921),\n",
+       " (('D', 'R'), 0.0009257962704211617),\n",
+       " (('V', 'R'), 0.0009137075269553794),\n",
+       " (('J', 'O'), 0.000895574411756706),\n",
+       " (('G', 'N'), 0.0008734117154027718),\n",
+       " (('F', 'F'), 0.0008693821342475109),\n",
+       " (('P', 'U'), 0.0008603155766481743),\n",
+       " (('G', 'U'), 0.0008492342284712072),\n",
+       " (('U', 'C'), 0.000816997579229121),\n",
+       " (('E', 'D'), 0.0008099458122074147),\n",
+       " (('Z', ' '), 0.0008079310216297842),\n",
+       " (('E', 'F'), 0.0007847609299870348),\n",
+       " (('P', 'P'), 0.0007827461394094044),\n",
+       " (('B', 'I'), 0.0007706573959436221),\n",
+       " (('Y', ' '), 0.0007565538619002094),\n",
+       " (('F', 'R'), 0.0007525242807449486),\n",
+       " (('N', 'U'), 0.0007414429325679815),\n",
+       " (('G', 'O'), 0.0007253246079469385),\n",
+       " (('C', 'U'), 0.0007233098173693081),\n",
+       " (('U', 'D'), 0.0007223024220804929),\n",
+       " (('C', 'T'), 0.0007001397257265586),\n",
+       " (('O', 'E'), 0.0006991323304377435),\n",
+       " (('R', 'N'), 0.0006820066105278852),\n",
+       " ((' ', 'Y'), 0.0006709252623509181),\n",
+       " (('U', 'M'), 0.0006668956811956573),\n",
+       " (('O', 'C'), 0.000649769961285799),\n",
+       " (('N', 'F'), 0.0006396960083976471),\n",
+       " (('R', 'G'), 0.0006296220555094953),\n",
+       " (('A', 'D'), 0.0006195481026213433),\n",
+       " (('O', 'P'), 0.0006094741497331914),\n",
+       " (('P', 'H'), 0.000607459359155561),\n",
+       " (('I', 'Q'), 0.0005994001968450394),\n",
+       " (('S', 'P'), 0.0005953706156897787),\n",
+       " (('Y', 'E'), 0.0005913410345345179),\n",
+       " (('F', 'L'), 0.0005671635476029533),\n",
+       " (('S', 'Q'), 0.000560111780581247),\n",
+       " (('E', 'B'), 0.0005550748041371709),\n",
+       " (('G', 'I'), 0.0005510452229819102),\n",
+       " (('J', 'U'), 0.0005228381548950848),\n",
+       " (('M', 'U'), 0.0005137715972957481),\n",
+       " (('O', 'Y'), 0.0005107494114293025),\n",
+       " (('S', 'C'), 0.0004966458773858898),\n",
+       " (('P', 'T'), 0.0004916089009418138),\n",
+       " (('I', 'X'), 0.00047649797160958596),\n",
+       " (('G', 'L'), 0.00046440922814380365),\n",
+       " (('I', 'F'), 0.0004593722516997277),\n",
+       " (('L', 'Q'), 0.00045332787996683654),\n",
+       " (('O', 'D'), 0.00045332787996683654),\n",
+       " (('D', 'S'), 0.00045030569410039095),\n",
+       " (('E', 'X'), 0.0004462761129451302),\n",
+       " (('L', 'S'), 0.00043922434592342385),\n",
+       " (('I', 'B'), 0.0004311651836129023),\n",
+       " (('F', 'U'), 0.00042209862601356557),\n",
+       " (('H', 'U'), 0.00042209862601356557),\n",
+       " (('O', ' '), 0.0004210912307247504),\n",
+       " (('P', 'S'), 0.0004120246731254137),\n",
+       " (('Y', 'A'), 0.00038986197677147943),\n",
+       " (('B', 'U'), 0.0003858323956162187),\n",
+       " (('J', 'A'), 0.00038482500032740346),\n",
+       " (('M', ' '), 0.00037374365215043636),\n",
+       " (('O', 'B'), 0.0003636696992622844),\n",
+       " (('R', 'V'), 0.0003636696992622844),\n",
+       " (('P', ' '), 0.0003606475133958388),\n",
+       " (('C', 'C'), 0.00033647002646427425),\n",
+       " (('U', 'G'), 0.0003284108641537527),\n",
+       " (('T', 'H'), 0.0003233738877096767),\n",
+       " (('U', 'B'), 0.00032236649242086156),\n",
+       " (('H', ' '), 0.0003203517018432312),\n",
+       " (('O', 'G'), 0.0003062481677998185),\n",
+       " (('O', 'H'), 0.00029919640077811214),\n",
+       " (('A', 'Y'), 0.0002871076573123298),\n",
+       " (('R', 'L'), 0.00028106328557943864),\n",
+       " (('U', 'J'), 0.0002719967279801019),\n",
+       " (('E', 'H'), 0.00026998193740247154),\n",
+       " (('U', 'F'), 0.00026192277509195003),\n",
+       " (('A', 'Q'), 0.0002518488222037981),\n",
+       " (('Y', 'P'), 0.0002508414269149829),\n",
+       " (('R', 'B'), 0.0002498340316261677),\n",
+       " (('R', 'P'), 0.00024076747402683097),\n",
+       " (('O', 'F'), 0.00023976007873801578),\n",
+       " (('N', 'V'), 0.00023069352113867905),\n",
+       " (('E', 'Q'), 0.0002226343588281575),\n",
+       " (('G', 'Y'), 0.00021860477767289674),\n",
+       " (('A', 'H'), 0.00019341989545251692),\n",
+       " (('F', ' '), 0.00019341989545251692),\n",
+       " (('Y', 'S'), 0.00019241250016370173),\n",
+       " (('V', 'U'), 0.00018536073314199538),\n",
+       " (('N', 'Q'), 0.0001843533378531802),\n",
+       " (('I', 'P'), 0.00018133115198673463),\n",
+       " (('E', 'O'), 0.00017226459438739788),\n",
+       " (('L', 'T'), 0.0001692424085209523),\n",
+       " (('G', 'T'), 0.00015110929332227884),\n",
+       " (('B', 'S'), 0.00014707971216701809),\n",
+       " (('E', 'J'), 0.00014103534043412693),\n",
+       " (('U', 'O'), 0.00014103534043412693),\n",
+       " (('X', 'I'), 0.00013801315456768136),\n",
+       " (('A', 'F'), 0.0001319687828347902),\n",
+       " (('L', 'D'), 0.0001319687828347902),\n",
+       " (('A', 'J'), 0.00013096138754597502),\n",
+       " (('G', ' '), 0.00013096138754597502),\n",
+       " (('C', 'Q'), 0.00012793920167952942),\n",
+       " (('S', 'M'), 0.00012793920167952942),\n",
+       " (('R', 'Q'), 0.00012693180639071423),\n",
+       " (('L', 'H'), 0.00012390962052426867),\n",
+       " (('X', 'P'), 0.00012390962052426867),\n",
+       " (('X', 'E'), 0.00012290222523545345),\n",
+       " (('Z', 'E'), 0.00012088743465782308),\n",
+       " (('L', 'Y'), 0.00011282827234730154),\n",
+       " (('I', 'I'), 0.00011182087705848635),\n",
+       " (('X', 'T'), 0.00011182087705848635),\n",
+       " (('L', 'P'), 0.00010275431945914962),\n",
+       " (('O', 'Q'), 9.469515714862808e-05),\n",
+       " (('U', 'Y'), 9.268036657099769e-05),\n",
+       " (('I', 'Z'), 9.16729712821825e-05),\n",
+       " (('M', 'N'), 8.965818070455211e-05),\n",
+       " (('N', 'Z'), 8.865078541573692e-05),\n",
+       " (('Y', 'O'), 8.764339012692174e-05),\n",
+       " (('X', 'A'), 8.562859954929134e-05),\n",
+       " (('Y', 'M'), 8.562859954929134e-05),\n",
+       " ((' ', 'X'), 8.159901839403058e-05),\n",
+       " (('C', 'S'), 8.159901839403058e-05),\n",
+       " (('R', 'Y'), 8.059162310521539e-05),\n",
+       " (('M', 'Y'), 7.8576832527585e-05),\n",
+       " (('Z', 'I'), 7.454725137232423e-05),\n",
+       " (('N', 'R'), 7.051767021706346e-05),\n",
+       " (('V', ' '), 7.051767021706346e-05),\n",
+       " (('B', 'B'), 6.245850790654193e-05),\n",
+       " (('L', 'C'), 6.245850790654193e-05),\n",
+       " (('S', 'Y'), 6.044371732891154e-05),\n",
+       " (('O', 'V'), 5.339195030720519e-05),\n",
+       " (('H', 'Y'), 5.2384555018390004e-05),\n",
+       " (('R', 'F'), 5.2384555018390004e-05),\n",
+       " (('H', 'R'), 5.137715972957481e-05),\n",
+       " (('X', 'C'), 5.137715972957481e-05),\n",
+       " (('Z', 'A'), 5.036976444075961e-05),\n",
+       " (('D', 'M'), 4.9362369151944425e-05),\n",
+       " (('N', 'L'), 4.835497386312923e-05),\n",
+       " (('M', 'S'), 4.331799741905327e-05),\n",
+       " (('N', 'J'), 4.231060213023808e-05),\n",
+       " (('D', 'J'), 4.130320684142288e-05),\n",
+       " (('G', 'S'), 4.130320684142288e-05),\n",
+       " (('B', ' '), 3.828102097497731e-05),\n",
+       " (('L', 'G'), 3.828102097497731e-05),\n",
+       " (('U', 'Q'), 3.828102097497731e-05),\n",
+       " (('F', 'S'), 3.7273625686162116e-05),\n",
+       " (('L', 'M'), 3.7273625686162116e-05),\n",
+       " (('Q', ' '), 3.626623039734693e-05),\n",
+       " (('Z', 'O'), 3.525883510853173e-05),\n",
+       " (('Y', 'R'), 3.425143981971654e-05),\n",
+       " (('A', 'O'), 3.324404453090135e-05),\n",
+       " (('U', 'Z'), 3.022185866445577e-05),\n",
+       " (('N', 'H'), 2.9214463375640577e-05),\n",
+       " (('S', 'F'), 2.8207068086825385e-05),\n",
+       " (('C', 'Y'), 2.7199672798010194e-05),\n",
+       " ((' ', 'Z'), 2.6192277509195002e-05),\n",
+       " (('A', 'X'), 2.4177486931564615e-05),\n",
+       " (('B', 'J'), 2.4177486931564615e-05),\n",
+       " (('G', 'M'), 2.4177486931564615e-05),\n",
+       " (('I', 'U'), 2.216269635393423e-05),\n",
+       " (('M', 'T'), 2.216269635393423e-05),\n",
+       " (('T', 'C'), 2.216269635393423e-05),\n",
+       " (('L', 'B'), 2.0147905776303847e-05),\n",
+       " (('O', 'A'), 1.9140510487488655e-05),\n",
+       " (('S', 'L'), 1.9140510487488655e-05),\n",
+       " (('T', 'Y'), 1.9140510487488655e-05),\n",
+       " (('Y', 'L'), 1.9140510487488655e-05),\n",
+       " (('P', 'Y'), 1.8133115198673464e-05),\n",
+       " (('Y', 'G'), 1.712571990985827e-05),\n",
+       " (('S', 'H'), 1.6118324621043076e-05),\n",
+       " (('N', 'Y'), 1.5110929332227885e-05),\n",
+       " (('X', 'O'), 1.5110929332227885e-05),\n",
+       " (('A', 'Z'), 1.4103534043412693e-05),\n",
+       " (('B', 'Y'), 1.3096138754597501e-05),\n",
+       " (('L', 'V'), 1.3096138754597501e-05),\n",
+       " (('R', 'H'), 1.3096138754597501e-05),\n",
+       " (('R', 'Z'), 1.3096138754597501e-05),\n",
+       " (('S', 'D'), 1.3096138754597501e-05),\n",
+       " (('T', 'F'), 1.3096138754597501e-05),\n",
+       " (('Y', 'B'), 1.3096138754597501e-05),\n",
+       " (('Y', 'T'), 1.3096138754597501e-05),\n",
+       " (('S', 'N'), 1.2088743465782307e-05),\n",
+       " (('X', 'U'), 1.2088743465782307e-05),\n",
+       " (('Y', 'C'), 1.2088743465782307e-05),\n",
+       " (('A', 'E'), 1.1081348176967115e-05),\n",
+       " (('B', 'T'), 1.1081348176967115e-05),\n",
+       " (('U', 'H'), 1.1081348176967115e-05),\n",
+       " (('N', 'X'), 1.0073952888151924e-05),\n",
+       " (('T', 'M'), 1.0073952888151924e-05),\n",
+       " (('K', 'E'), 9.066557599336732e-06),\n",
+       " (('N', 'M'), 9.066557599336732e-06),\n",
+       " (('X', 'Q'), 9.066557599336732e-06),\n",
+       " (('X', 'V'), 9.066557599336732e-06),\n",
+       " (('L', 'Z'), 8.059162310521538e-06),\n",
+       " (('O', 'J'), 8.059162310521538e-06),\n",
+       " ((' ', 'K'), 7.051767021706346e-06),\n",
+       " (('D', 'V'), 7.051767021706346e-06),\n",
+       " (('S', 'B'), 7.051767021706346e-06),\n",
+       " (('Y', 'D'), 7.051767021706346e-06),\n",
+       " (('L', 'X'), 6.044371732891154e-06),\n",
+       " (('N', 'K'), 6.044371732891154e-06),\n",
+       " (('S', 'V'), 6.044371732891154e-06),\n",
+       " (('Y', 'N'), 6.044371732891154e-06),\n",
+       " (('Z', 'U'), 6.044371732891154e-06),\n",
+       " (('B', 'D'), 5.036976444075962e-06),\n",
+       " (('C', 'F'), 5.036976444075962e-06),\n",
+       " (('D', 'Y'), 5.036976444075962e-06),\n",
+       " (('E', 'Y'), 5.036976444075962e-06),\n",
+       " (('N', 'B'), 5.036976444075962e-06),\n",
+       " (('A', 'K'), 4.029581155260769e-06),\n",
+       " (('B', 'M'), 4.029581155260769e-06),\n",
+       " (('D', 'H'), 4.029581155260769e-06),\n",
+       " (('G', 'Z'), 4.029581155260769e-06),\n",
+       " (('K', 'A'), 4.029581155260769e-06),\n",
+       " (('K', 'O'), 4.029581155260769e-06),\n",
+       " (('L', 'F'), 4.029581155260769e-06),\n",
+       " (('S', 'G'), 4.029581155260769e-06),\n",
+       " (('S', 'R'), 4.029581155260769e-06),\n",
+       " (('X', 'H'), 4.029581155260769e-06),\n",
+       " (('Y', 'I'), 4.029581155260769e-06),\n",
+       " (('D', 'T'), 3.022185866445577e-06),\n",
+       " (('H', 'L'), 3.022185866445577e-06),\n",
+       " (('H', 'M'), 3.022185866445577e-06),\n",
+       " (('H', 'T'), 3.022185866445577e-06),\n",
+       " (('T', 'L'), 3.022185866445577e-06),\n",
+       " ((' ', 'W'), 2.0147905776303846e-06),\n",
+       " (('C', 'K'), 2.0147905776303846e-06),\n",
+       " (('E', 'K'), 2.0147905776303846e-06),\n",
+       " (('G', 'G'), 2.0147905776303846e-06),\n",
+       " (('G', 'H'), 2.0147905776303846e-06),\n",
+       " (('I', 'J'), 2.0147905776303846e-06),\n",
+       " (('K', 'L'), 2.0147905776303846e-06),\n",
+       " (('K', 'Y'), 2.0147905776303846e-06),\n",
+       " (('M', 'D'), 2.0147905776303846e-06),\n",
+       " (('M', 'L'), 2.0147905776303846e-06),\n",
+       " (('P', 'C'), 2.0147905776303846e-06),\n",
+       " (('R', 'J'), 2.0147905776303846e-06),\n",
+       " (('V', 'Y'), 2.0147905776303846e-06),\n",
+       " (('Y', 'V'), 2.0147905776303846e-06),\n",
+       " (('Y', 'X'), 2.0147905776303846e-06),\n",
+       " (('Y', 'Z'), 2.0147905776303846e-06),\n",
+       " (('A', 'A'), 1.0073952888151923e-06),\n",
+       " (('B', 'N'), 1.0073952888151923e-06),\n",
+       " (('B', 'V'), 1.0073952888151923e-06),\n",
+       " (('C', 'N'), 1.0073952888151923e-06),\n",
+       " (('D', 'L'), 1.0073952888151923e-06),\n",
+       " (('I', 'K'), 1.0073952888151923e-06),\n",
+       " (('J', ' '), 1.0073952888151923e-06),\n",
+       " (('K', ' '), 1.0073952888151923e-06),\n",
+       " (('K', 'H'), 1.0073952888151923e-06),\n",
+       " (('K', 'R'), 1.0073952888151923e-06),\n",
+       " (('K', 'U'), 1.0073952888151923e-06),\n",
+       " (('L', 'N'), 1.0073952888151923e-06),\n",
+       " (('N', 'P'), 1.0073952888151923e-06),\n",
+       " (('O', 'O'), 1.0073952888151923e-06),\n",
+       " (('O', 'W'), 1.0073952888151923e-06),\n",
+       " (('O', 'X'), 1.0073952888151923e-06),\n",
+       " (('O', 'Z'), 1.0073952888151923e-06),\n",
+       " (('P', 'M'), 1.0073952888151923e-06),\n",
+       " (('P', 'V'), 1.0073952888151923e-06),\n",
+       " (('T', 'N'), 1.0073952888151923e-06),\n",
+       " (('T', 'Q'), 1.0073952888151923e-06),\n",
+       " (('U', 'U'), 1.0073952888151923e-06),\n",
+       " (('V', 'S'), 1.0073952888151923e-06),\n",
+       " (('W', 'I'), 1.0073952888151923e-06),\n",
+       " (('W', 'O'), 1.0073952888151923e-06),\n",
+       " (('W', 'P'), 1.0073952888151923e-06),\n",
+       " (('X', 'D'), 1.0073952888151923e-06),\n",
+       " (('X', 'S'), 1.0073952888151923e-06),\n",
+       " (('X', 'X'), 1.0073952888151923e-06),\n",
+       " (('A', 'W'), 0.0),\n",
+       " (('B', 'C'), 0.0),\n",
+       " (('B', 'F'), 0.0),\n",
+       " (('B', 'G'), 0.0),\n",
+       " (('B', 'H'), 0.0),\n",
+       " (('B', 'K'), 0.0),\n",
+       " (('B', 'P'), 0.0),\n",
+       " (('B', 'Q'), 0.0),\n",
+       " (('B', 'W'), 0.0),\n",
+       " (('B', 'X'), 0.0),\n",
+       " (('B', 'Z'), 0.0),\n",
+       " (('C', 'B'), 0.0),\n",
+       " (('C', 'D'), 0.0),\n",
+       " (('C', 'G'), 0.0),\n",
+       " (('C', 'J'), 0.0),\n",
+       " (('C', 'M'), 0.0),\n",
+       " (('C', 'P'), 0.0),\n",
+       " (('C', 'V'), 0.0),\n",
+       " (('C', 'W'), 0.0),\n",
+       " (('C', 'X'), 0.0),\n",
+       " (('C', 'Z'), 0.0),\n",
+       " (('D', 'B'), 0.0),\n",
+       " (('D', 'C'), 0.0),\n",
+       " (('D', 'D'), 0.0),\n",
+       " (('D', 'F'), 0.0),\n",
+       " (('D', 'G'), 0.0),\n",
+       " (('D', 'K'), 0.0),\n",
+       " (('D', 'N'), 0.0),\n",
+       " (('D', 'P'), 0.0),\n",
+       " (('D', 'Q'), 0.0),\n",
+       " (('D', 'W'), 0.0),\n",
+       " (('D', 'X'), 0.0),\n",
+       " (('D', 'Z'), 0.0),\n",
+       " (('E', 'W'), 0.0),\n",
+       " (('F', 'B'), 0.0),\n",
+       " (('F', 'C'), 0.0),\n",
+       " (('F', 'D'), 0.0),\n",
+       " (('F', 'G'), 0.0),\n",
+       " (('F', 'H'), 0.0),\n",
+       " (('F', 'J'), 0.0),\n",
+       " (('F', 'K'), 0.0),\n",
+       " (('F', 'M'), 0.0),\n",
+       " (('F', 'N'), 0.0),\n",
+       " (('F', 'P'), 0.0),\n",
+       " (('F', 'Q'), 0.0),\n",
+       " (('F', 'T'), 0.0),\n",
+       " (('F', 'V'), 0.0),\n",
+       " (('F', 'W'), 0.0),\n",
+       " (('F', 'X'), 0.0),\n",
+       " (('F', 'Y'), 0.0),\n",
+       " (('F', 'Z'), 0.0),\n",
+       " (('G', 'B'), 0.0),\n",
+       " (('G', 'C'), 0.0),\n",
+       " (('G', 'D'), 0.0),\n",
+       " (('G', 'F'), 0.0),\n",
+       " (('G', 'J'), 0.0),\n",
+       " (('G', 'K'), 0.0),\n",
+       " (('G', 'P'), 0.0),\n",
+       " (('G', 'Q'), 0.0),\n",
+       " (('G', 'V'), 0.0),\n",
+       " (('G', 'W'), 0.0),\n",
+       " (('G', 'X'), 0.0),\n",
+       " (('H', 'B'), 0.0),\n",
+       " (('H', 'C'), 0.0),\n",
+       " (('H', 'D'), 0.0),\n",
+       " (('H', 'F'), 0.0),\n",
+       " (('H', 'G'), 0.0),\n",
+       " (('H', 'H'), 0.0),\n",
+       " (('H', 'J'), 0.0),\n",
+       " (('H', 'K'), 0.0),\n",
+       " (('H', 'N'), 0.0),\n",
+       " (('H', 'P'), 0.0),\n",
+       " (('H', 'Q'), 0.0),\n",
+       " (('H', 'S'), 0.0),\n",
+       " (('H', 'V'), 0.0),\n",
+       " (('H', 'W'), 0.0),\n",
+       " (('H', 'X'), 0.0),\n",
+       " (('H', 'Z'), 0.0),\n",
+       " (('I', 'H'), 0.0),\n",
+       " (('I', 'W'), 0.0),\n",
+       " (('I', 'Y'), 0.0),\n",
+       " (('J', 'B'), 0.0),\n",
+       " (('J', 'C'), 0.0),\n",
+       " (('J', 'D'), 0.0),\n",
+       " (('J', 'F'), 0.0),\n",
+       " (('J', 'G'), 0.0),\n",
+       " (('J', 'H'), 0.0),\n",
+       " (('J', 'I'), 0.0),\n",
+       " (('J', 'J'), 0.0),\n",
+       " (('J', 'K'), 0.0),\n",
+       " (('J', 'L'), 0.0),\n",
+       " (('J', 'M'), 0.0),\n",
+       " (('J', 'N'), 0.0),\n",
+       " (('J', 'P'), 0.0),\n",
+       " (('J', 'Q'), 0.0),\n",
+       " (('J', 'R'), 0.0),\n",
+       " (('J', 'S'), 0.0),\n",
+       " (('J', 'T'), 0.0),\n",
+       " (('J', 'V'), 0.0),\n",
+       " (('J', 'W'), 0.0),\n",
+       " (('J', 'X'), 0.0),\n",
+       " (('J', 'Y'), 0.0),\n",
+       " (('J', 'Z'), 0.0),\n",
+       " (('K', 'B'), 0.0),\n",
+       " (('K', 'C'), 0.0),\n",
+       " (('K', 'D'), 0.0),\n",
+       " (('K', 'F'), 0.0),\n",
+       " (('K', 'G'), 0.0),\n",
+       " (('K', 'I'), 0.0),\n",
+       " (('K', 'J'), 0.0),\n",
+       " (('K', 'K'), 0.0),\n",
+       " (('K', 'M'), 0.0),\n",
+       " (('K', 'N'), 0.0),\n",
+       " (('K', 'P'), 0.0),\n",
+       " (('K', 'Q'), 0.0),\n",
+       " (('K', 'S'), 0.0),\n",
+       " (('K', 'T'), 0.0),\n",
+       " (('K', 'V'), 0.0),\n",
+       " (('K', 'W'), 0.0),\n",
+       " (('K', 'X'), 0.0),\n",
+       " (('K', 'Z'), 0.0),\n",
+       " (('L', 'J'), 0.0),\n",
+       " (('L', 'K'), 0.0),\n",
+       " (('L', 'R'), 0.0),\n",
+       " (('L', 'W'), 0.0),\n",
+       " (('M', 'C'), 0.0),\n",
+       " (('M', 'F'), 0.0),\n",
+       " (('M', 'G'), 0.0),\n",
+       " (('M', 'H'), 0.0),\n",
+       " (('M', 'J'), 0.0),\n",
+       " (('M', 'K'), 0.0),\n",
+       " (('M', 'Q'), 0.0),\n",
+       " (('M', 'R'), 0.0),\n",
+       " (('M', 'V'), 0.0),\n",
+       " (('M', 'W'), 0.0),\n",
+       " (('M', 'X'), 0.0),\n",
+       " (('M', 'Z'), 0.0),\n",
+       " (('N', 'W'), 0.0),\n",
+       " (('O', 'K'), 0.0),\n",
+       " (('P', 'B'), 0.0),\n",
+       " (('P', 'D'), 0.0),\n",
+       " (('P', 'F'), 0.0),\n",
+       " (('P', 'G'), 0.0),\n",
+       " (('P', 'J'), 0.0),\n",
+       " (('P', 'K'), 0.0),\n",
+       " (('P', 'N'), 0.0),\n",
+       " (('P', 'Q'), 0.0),\n",
+       " (('P', 'W'), 0.0),\n",
+       " (('P', 'X'), 0.0),\n",
+       " (('P', 'Z'), 0.0),\n",
+       " (('Q', 'A'), 0.0),\n",
+       " (('Q', 'B'), 0.0),\n",
+       " (('Q', 'C'), 0.0),\n",
+       " (('Q', 'D'), 0.0),\n",
+       " (('Q', 'E'), 0.0),\n",
+       " (('Q', 'F'), 0.0),\n",
+       " (('Q', 'G'), 0.0),\n",
+       " (('Q', 'H'), 0.0),\n",
+       " (('Q', 'I'), 0.0),\n",
+       " (('Q', 'J'), 0.0),\n",
+       " (('Q', 'K'), 0.0),\n",
+       " (('Q', 'L'), 0.0),\n",
+       " (('Q', 'M'), 0.0),\n",
+       " (('Q', 'N'), 0.0),\n",
+       " (('Q', 'O'), 0.0),\n",
+       " (('Q', 'P'), 0.0),\n",
+       " (('Q', 'Q'), 0.0),\n",
+       " (('Q', 'R'), 0.0),\n",
+       " (('Q', 'S'), 0.0),\n",
+       " (('Q', 'T'), 0.0),\n",
+       " (('Q', 'V'), 0.0),\n",
+       " (('Q', 'W'), 0.0),\n",
+       " (('Q', 'X'), 0.0),\n",
+       " (('Q', 'Y'), 0.0),\n",
+       " (('Q', 'Z'), 0.0),\n",
+       " (('R', 'K'), 0.0),\n",
+       " (('R', 'W'), 0.0),\n",
+       " (('R', 'X'), 0.0),\n",
+       " (('S', 'J'), 0.0),\n",
+       " (('S', 'K'), 0.0),\n",
+       " (('S', 'W'), 0.0),\n",
+       " (('S', 'X'), 0.0),\n",
+       " (('S', 'Z'), 0.0),\n",
+       " (('T', 'B'), 0.0),\n",
+       " (('T', 'D'), 0.0),\n",
+       " (('T', 'G'), 0.0),\n",
+       " (('T', 'J'), 0.0),\n",
+       " (('T', 'K'), 0.0),\n",
+       " (('T', 'P'), 0.0),\n",
+       " (('T', 'V'), 0.0),\n",
+       " (('T', 'W'), 0.0),\n",
+       " (('T', 'X'), 0.0),\n",
+       " (('T', 'Z'), 0.0),\n",
+       " (('U', 'K'), 0.0),\n",
+       " (('U', 'W'), 0.0),\n",
+       " (('V', 'B'), 0.0),\n",
+       " (('V', 'C'), 0.0),\n",
+       " (('V', 'D'), 0.0),\n",
+       " (('V', 'F'), 0.0),\n",
+       " (('V', 'G'), 0.0),\n",
+       " (('V', 'H'), 0.0),\n",
+       " (('V', 'J'), 0.0),\n",
+       " (('V', 'K'), 0.0),\n",
+       " (('V', 'L'), 0.0),\n",
+       " (('V', 'M'), 0.0),\n",
+       " (('V', 'N'), 0.0),\n",
+       " (('V', 'P'), 0.0),\n",
+       " (('V', 'Q'), 0.0),\n",
+       " (('V', 'T'), 0.0),\n",
+       " (('V', 'V'), 0.0),\n",
+       " (('V', 'W'), 0.0),\n",
+       " (('V', 'X'), 0.0),\n",
+       " (('V', 'Z'), 0.0),\n",
+       " (('W', ' '), 0.0),\n",
+       " (('W', 'A'), 0.0),\n",
+       " (('W', 'B'), 0.0),\n",
+       " (('W', 'C'), 0.0),\n",
+       " (('W', 'D'), 0.0),\n",
+       " (('W', 'E'), 0.0),\n",
+       " (('W', 'F'), 0.0),\n",
+       " (('W', 'G'), 0.0),\n",
+       " (('W', 'H'), 0.0),\n",
+       " (('W', 'J'), 0.0),\n",
+       " (('W', 'K'), 0.0),\n",
+       " (('W', 'L'), 0.0),\n",
+       " (('W', 'M'), 0.0),\n",
+       " (('W', 'N'), 0.0),\n",
+       " (('W', 'Q'), 0.0),\n",
+       " (('W', 'R'), 0.0),\n",
+       " (('W', 'S'), 0.0),\n",
+       " (('W', 'T'), 0.0),\n",
+       " (('W', 'U'), 0.0),\n",
+       " (('W', 'V'), 0.0),\n",
+       " (('W', 'W'), 0.0),\n",
+       " (('W', 'X'), 0.0),\n",
+       " (('W', 'Y'), 0.0),\n",
+       " (('W', 'Z'), 0.0),\n",
+       " (('X', 'B'), 0.0),\n",
+       " (('X', 'F'), 0.0),\n",
+       " (('X', 'G'), 0.0),\n",
+       " (('X', 'J'), 0.0),\n",
+       " (('X', 'K'), 0.0),\n",
+       " (('X', 'L'), 0.0),\n",
+       " (('X', 'M'), 0.0),\n",
+       " (('X', 'N'), 0.0),\n",
+       " (('X', 'R'), 0.0),\n",
+       " (('X', 'W'), 0.0),\n",
+       " (('X', 'Y'), 0.0),\n",
+       " (('X', 'Z'), 0.0),\n",
+       " (('Y', 'F'), 0.0),\n",
+       " (('Y', 'H'), 0.0),\n",
+       " (('Y', 'J'), 0.0),\n",
+       " (('Y', 'K'), 0.0),\n",
+       " (('Y', 'Q'), 0.0),\n",
+       " (('Y', 'U'), 0.0),\n",
+       " (('Y', 'W'), 0.0),\n",
+       " (('Y', 'Y'), 0.0),\n",
+       " (('Z', 'B'), 0.0),\n",
+       " (('Z', 'C'), 0.0),\n",
+       " (('Z', 'D'), 0.0),\n",
+       " (('Z', 'F'), 0.0),\n",
+       " (('Z', 'G'), 0.0),\n",
+       " (('Z', 'H'), 0.0),\n",
+       " (('Z', 'J'), 0.0),\n",
+       " (('Z', 'K'), 0.0),\n",
+       " (('Z', 'L'), 0.0),\n",
+       " (('Z', 'M'), 0.0),\n",
+       " (('Z', 'N'), 0.0),\n",
+       " (('Z', 'P'), 0.0),\n",
+       " (('Z', 'Q'), 0.0),\n",
+       " (('Z', 'R'), 0.0),\n",
+       " (('Z', 'S'), 0.0),\n",
+       " (('Z', 'T'), 0.0),\n",
+       " (('Z', 'V'), 0.0),\n",
+       " (('Z', 'W'), 0.0),\n",
+       " (('Z', 'X'), 0.0),\n",
+       " (('Z', 'Y'), 0.0),\n",
+       " (('Z', 'Z'), 0.0)]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "bigrammes_triees = sorted([(key, value) for key, value in dic_bigrammes.items()],\n",
+    "                      key=lambda x: x[1],\n",
+    "                      reverse = True)\n",
+    "bigrammes_triees "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "13ee1ccd",
+   "metadata": {},
+   "source": [
+    "### Affichage visuel"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "c982ce2a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import matplotlib.pyplot as plt "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "6d597bd8",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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NfrFL36h9vZ2XXHFFaqtrVV5eflpyzc0NKi6ulq7d+9WYWGhfvKTn6iqqiry/d27d+unP/2pdu7cqU8++UT/+I//qIULF3puV8x7ICorKzVr1ixdeeWVuv766/XKK69Ikp555pmo5RcvXqzu7u7I0dbWFusmAQBwTtq0aZMWLlyopUuXqqmpSeXl5aqsrFRra2vU8i0tLZo5c6bKy8vV1NSkJUuW6P7779fmzZsjZY4ePapx48bp5z//ua/pBgP+Gud5552nK6+8Unv37o36/UAgoEAgMNDNAADAnzhsprVy5Urdc889mjt3riSptrZWr732mtauXauampp+5detW6exY8eqtrZWkjRhwgTt2LFDK1as0KxZsyRJkydP1uTJkyVJDz74oPFHGfCFpHp7e7Vnzx4VFBQMdFUAAAwYKxybQ1K/uX+9vb396uvr69POnTtVUVHhOF9RUaFt27ZFbWNjY2O/8jfeeKN27NihEydiO9wT8wTigQceUENDg1paWvTee+/pu9/9rnp6enTnnXfGuioAAM5JRUVFys3NjRzRehO6uroUCoWUl5fnOJ+Xl6eOjuhznjo6OqKWDwaD6uqK7Xy9mA9hfPrpp/r+97+vrq4uXXjhhZoyZYreffddFRcXx7oqAAAGTwyHMNra2pSTkxM5faahfMuyvnIJu9+5s5WPdt6vmCcQzz33XKwvCQBA/MVwHYicnBxHAhHNqFGjlJqa2q+3obOzs18vwyn5+flRy6elpUV9E9IPNtMCACABZWRkqLS0VPX19Y7z9fX1mjZtWtSYqVOn9iu/ZcsWlZWVKT09PabtYzMtAABciMd23tXV1ZozZ47Kyso0depUPf7442ptbY2s67B48WLt379fGzZskCRVVVVp1apVqq6u1rx589TY2Kj169dr48aNkWv29fXpv/7rvyJ/3r9/v5qbmzV8+HB97Wtfc902EggAANyIw2ucs2fP1oEDB/TII4+ovb1dEydOVF1dXWReYXt7u2NNiJKSEtXV1WnRokVavXq1CgsL9dhjj0Ve4ZSkzz77TJMmTYp8vWLFCq1YsULTp0/X1q1bXbeNBAIAgAQ2f/58zZ8/P+r3nn766X7npk+frvfff/+017v44osjEyv9IIEAAMANW5LfVb6TZysMEggAANyIxxyIREYCAQCAG7ZiMAciJi1JCEmXQISPHh38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",
+      "text/plain": [
+       "<Figure size 640x480 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "c = plt.pcolor(bigrammes_livre)\n",
+    "plt.colorbar(c) \n",
+    "plt.show() "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "017c7afa",
+   "metadata": {},
+   "source": [
+    "## Cryptanalyse Cesar"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "690d4446",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def dist_bigrammes(bigramme1, bigramme2):\n",
+    "    ''' calcule la distance euclidienne \n",
+    "    '''\n",
+    "    dist = 0\n",
+    "    for i in range(NB_CARS):\n",
+    "        for j in range(NB_CARS):\n",
+    "            dist += (bigramme1[i][j] - bigramme2[i][j])**2\n",
+    "    \n",
+    "    return dist**0.5"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "id": "30f1ab26",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def cesar_dechiffre(texte_chiffre, k):\n",
+    "    texte_clair= \"\"\n",
+    "    for lettre in texte_chiffre:\n",
+    "        nb_chiffre = pos_char(lettre)\n",
+    "        nb_clair = (nb_chiffre - k) % 26\n",
+    "        lettre_clair = chr(nb_clair + POS_A)\n",
+    "        texte_clair = texte_clair + lettre_clair\n",
+    "    return texte_clair"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "id": "a54222f3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def casser_cesar(texte_chiffre):\n",
+    "    \n",
+    "    d_min = 2 # car ||a-b||=(a-b)·(a-b)=||a||+||b||-2 (a·b)=2-2 (a·b)\n",
+    "              # donc toujours plus petit que 2\n",
+    "    cle = 0\n",
+    "    texte_dechiffre_final = texte_chiffre\n",
+    "    for k in range(1,26):\n",
+    "        texte_dechiffre = cesar_dechiffre(texte_chiffre, k)\n",
+    "        bigramme_dechiffre =  calc_bigrammes(texte_dechiffre)\n",
+    "        d = dist_bigrammes(bigramme_dechiffre, bigrammes_livre)\n",
+    "        \n",
+    "        if d < d_min:\n",
+    "            d_min = d\n",
+    "            cle = k\n",
+    "            texte_dechiffre_final = texte_dechiffre\n",
+    "            \n",
+    "    return cle, texte_dechiffre_final"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "id": "bd6f21e0",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "La clé pour déchiffrer \" INKANNWLJPN \" est  10  et le texte dechiffré est :  ZEBREENCAGE\n"
+     ]
+    }
+   ],
+   "source": [
+    "texte_chiffre_01='INKANNWLJPN'\n",
+    "cle, texte_dechiffre = casser_cesar(texte_chiffre_01)\n",
+    "print('La clé pour déchiffrer \"', texte_chiffre_01, '\" est ', cle, \n",
+    "      ' et le texte dechiffré est : ', texte_dechiffre)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "id": "fbd32638",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "La clé pour déchiffrer \" LKDKSVVO \" est  11  et le texte dechiffré est :  BATAILLE\n"
+     ]
+    }
+   ],
+   "source": [
+    "texte_chiffre_02='LKDKSVVO'\n",
+    "cle, texte_dechiffre = casser_cesar(texte_chiffre_02)\n",
+    "print('La clé pour déchiffrer \"', texte_chiffre_02, '\" est ', cle, \n",
+    "      ' et le texte dechiffré est : ', texte_dechiffre)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "id": "ee411e60",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "La clé pour déchiffrer \" REYPKENA \" est  23  et le texte dechiffré est :  VICTOIRE\n"
+     ]
+    }
+   ],
+   "source": [
+    "texte_chiffre_03='REYPKENA'\n",
+    "cle, texte_dechiffre = casser_cesar(texte_chiffre_03)\n",
+    "print('La clé pour déchiffrer \"', texte_chiffre_03, '\" est ', cle, \n",
+    "      ' et le texte dechiffré est : ', texte_dechiffre)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e520793f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0d112f3f",
+   "metadata": {},
+   "source": [
+    "## Cryptanalyse Affine"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "id": "04b2009c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def find_inverse_Z26(x):\n",
+    "    '''\n",
+    "      Si l'inverse n'existe pas, 0 est retourné\n",
+    "    '''\n",
+    "    for k in range(1,26):\n",
+    "        r = (x * k) % 26\n",
+    "        if r == 1:\n",
+    "            return k\n",
+    "    return 0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "id": "0118daea",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def affine_dechiffre(texte_chiffre,a,b):\n",
+    "    \n",
+    "    inverse = find_inverse_Z26(a)     # c est l'inverse de a mod 26\n",
+    "            \n",
+    "    texte_clair= \"\"\n",
+    "    for lettre in texte_chiffre:               # Boucle\n",
+    "        nb_chiffre = pos_char(lettre)              # Bijection b\n",
+    "        nb_clair = inverse*(nb_chiffre-b)%26      # Fonction de dechiffrement\n",
+    "        lettre_clair = chr(nb_clair + POS_A)          # Bijection b^-1\n",
+    "        texte_clair = texte_clair + lettre_clair   \n",
+    "    return texte_clair"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "id": "ec6b34e6",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'EDWDLOOH'"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "affine_dechiffre('LCRCWXXM',9,2)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "id": "9d7cd8bb",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25]"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# tous les éléments qui possède une inverse dans Z26\n",
+    "INV_Z26 = [find_inverse_Z26(k) for k in range(26) if find_inverse_Z26(k)!=0]\n",
+    "INV_Z26"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "id": "d22ce0c3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def casser_affine(texte_chiffre):\n",
+    "    \n",
+    "    d_min = 2 # car ||a-b||=(a-b)·(a-b)=||a||+||b||-2 (a·b)=2-2 (a·b)\n",
+    "              # donc toujours plus petit que 2\n",
+    "    cle = (1,0)\n",
+    "    texte_dechiffre_final = texte_chiffre\n",
+    "    for a in INV_Z26:\n",
+    "        for b in range(1,26):\n",
+    "            texte_dechiffre = affine_dechiffre(texte_chiffre, a,b)\n",
+    "            bigramme_dechiffre =  calc_bigrammes(texte_dechiffre)\n",
+    "            d = dist_bigrammes(bigramme_dechiffre, bigrammes_livre)\n",
+    "            \n",
+    "            if d < d_min:\n",
+    "                d_min = d\n",
+    "                cle = (a,b)\n",
+    "                texte_dechiffre_final = texte_dechiffre\n",
+    "                # print((a,b), texte_dechiffre, d)\n",
+    "            \n",
+    "    return cle, texte_dechiffre_final"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "id": "a8a10ff4",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((9, 3), 'BATAILLE')"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "casser_affine('LCRCWXXM')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "id": "461e5130",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((11, 4), 'BRAVOCENESTPASFACILE')"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "casser_affine('OIDABZVQVTEMDTGDZNUV')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "id": "a030790f",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((25, 14), 'LECOMMANDEMENTMILITAIREESTPRET')"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "casser_affine('CJLZBBNAKJBJAUBFCFUNFWJJVUYWJU')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7e20405a",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "61148a97",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.12.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/recursivite/ex_decomposition_quatre_carres.ipynb b/recursivite/ex_decomposition_quatre_carres.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..73c300d5ea815be5af64370aba57e782abdcd9a9
--- /dev/null
+++ b/recursivite/ex_decomposition_quatre_carres.ipynb
@@ -0,0 +1 @@
+{"cells":[{"metadata":{},"cell_type":"markdown","source":"<div style='background-color: #e3a8b6;\n    border: 0.5em solid black;\n    border-radius: 0.5em;\n    padding: 1em;'>\n    <h2>Exercice</h2>\n    <h1>Décomposition d'un entier positif en somme d'au plus quatre carrés</h1>\n</div>"},{"metadata":{},"cell_type":"markdown","source":"Le théorème des quatre carrés de Lagrange affirme que tout nombre entier positif `n` peut s'écrire comme la somme d'au plus quatre carrés.\n\nPar exemple, $1871 = 1 + 25 + 81 + 1764 = 1^2 + 5^2 + 9^2 + 42^2$.\n\nPour afficher une possibilité on peut donner l'algorithme suivant qui permet de décomposer un entier positif `n` en une somme d'au plus quatre carrés."},{"metadata":{},"cell_type":"markdown","source":"<div style='background-color: #f7bd83;\n    border-radius: 0.5em;\n    padding: 1em;\n    margin: 0em 2em 0em 2em'>\n\n<p><b>Algorithme de décomposition de l'entier positif <code>n</code> en une somme d'au plus quatre carrés</b></p>\n<p><b>Début</b></p>\n<p STYLE=\"padding:0 0 0 40px;\">Si <code>n</code> est le carré d'un entier alors</p>\n<p STYLE=\"padding:0 0 0 80px;\">Retourner un tableau contenant uniquement l'élément <code>n</code></p>\n    <p STYLE=\"padding:0 0 0 40px;\">Sinon</p>\n    <p STYLE=\"padding:0 0 0 80px;\"><code>liste_carres</code> ← tableau contenant la liste décroissante des nombres compris entre 1 et <code>n</code> qui sont des carrés d'entiers</p>\n<p STYLE=\"padding:0 0 0 80px;\">Pour chaque élément <code>carre</code> de <code>liste_carres</code> faire</p>\n<p STYLE=\"padding:0 0 0 120px;\"><code>decompo</code> ← liste renvoyé par <code>decomposition_carres(n - carre)</code> auquel on ajoute l'élément <code>carre</code> à la fin</p>\n<p STYLE=\"padding:0 0 0 120px;\">Si longueur(<code>decompo</code>) $\\leq$ 4 alors</p>\n<p STYLE=\"padding:0 0 0 160px;\">Retourner <code>decompo</code></p>\n    <p><b>Fin</b></p>\n        \n</div>"},{"metadata":{},"cell_type":"markdown","source":"**(1)** 💻 Définir une fonction `est_carre` qui prend en paramètre d'entrée un entier positif `n` et qui renvoie `True` si `n` est le carré d'un entier et `False` sinon."},{"metadata":{"trusted":true},"cell_type":"code","source":"def est_carre(n):\n    if round(n**0.5)**2 == n:\n        return True\n    else:\n        return False","execution_count":5,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Test\nnb = 9\nprint(nb, \"est-il un carre ? \", est_carre(nb))\nnb = 10\nprint(nb, \"est-il un carre ? \", est_carre(nb))","execution_count":7,"outputs":[{"output_type":"stream","text":"9 est-il un carre ?  True\n10 est-il un carre ?  False\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"**(2)** 💻 Définir une fonction `liste_carres_entiers` qui prend en paramètre d'entrée un entier positif `n` et qui renvoie la liste décroissante des entiers compris entre 1 et `n` et qui sont des carrés d'entiers."},{"metadata":{"trusted":true},"cell_type":"code","source":"def liste_carres_entiers(n):\n    L = []\n    for k in reversed(range(1, n+1)):\n        if est_carre(k):\n            L.append(k)\n    return L","execution_count":37,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Test\nlistes_carres = liste_carres_entiers(100)\nprint(listes_carres) # doit afficher [100, 81, 64, 49, 36, 25, 16, 9, 4, 1]","execution_count":38,"outputs":[{"output_type":"stream","text":"[100, 81, 64, 49, 36, 25, 16, 9, 4, 1]\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Test\nlistes_carres = liste_carres_entiers(871)\nprint(listes_carres) # doit afficher [100, 81, 64, 49, 36, 25, 16, 9, 4, 1]","execution_count":39,"outputs":[{"output_type":"stream","text":"[841, 784, 729, 676, 625, 576, 529, 484, 441, 400, 361, 324, 289, 256, 225, 196, 169, 144, 121, 100, 81, 64, 49, 36, 25, 16, 9, 4, 1]\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"**(3)** 💻 Implémenter la fonction `decomposition_carres` qui prend en paramètre d'entrée un entier positif `n` et qui renvoie, sous forme de tableau de longueur inférieure ou égale à 4, une décomposition de `n` en somme de carrés d'entiers."},{"metadata":{"trusted":true},"cell_type":"code","source":"def decomposition_carres(n):\n    if est_carre(n):\n        return [n]\n    else:\n        listes_carres = liste_carres_entiers(n)\n        for carre in listes_carres:\n            decompo = decomposition_carres(n - carre) + [carre]\n            if len(decompo) <= 4:\n                return decompo","execution_count":35,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Test\nnb = 1871\nprint(\"La décomposition de \",nb, \"est : \", decomposition_carres(nb))","execution_count":43,"outputs":[{"output_type":"stream","text":"La décomposition de  1871 est :  [1, 25, 81, 1764]\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"**(4)** ✏️ Donner une décomposition en somme d'au plus quatre carrés pour les entiers $300$, $1789$, $2021$ et $12345$."},{"metadata":{"trusted":true},"cell_type":"code","source":"def print_decompoision(n, decompo):\n    s = str(n)+ \" = \"\n    for n in decompo:\n        s = s + str(int(n**0.5))+\"² + \"\n    s = s[:-3]\n    print(s)","execution_count":45,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"nb = 1871\nprint_decompoision(nb, decomposition_carres(nb))\nnb = 300\nprint_decompoision(nb, decomposition_carres(nb))\nnb = 1789\nprint_decompoision(nb, decomposition_carres(nb))\nnb = 2021\nprint_decompoision(nb, decomposition_carres(nb))\nnb = 12345\nprint_decompoision(nb, decomposition_carres(nb))","execution_count":48,"outputs":[{"output_type":"stream","text":"1871 = 1² + 5² + 9² + 42²\n300 = 1² + 1² + 3² + 17²\n1789 = 5² + 42²\n2021 = 2² + 9² + 44²\n12345 = 2² + 2² + 4² + 111²\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"## Une version non récursive"},{"metadata":{"trusted":true},"cell_type":"code","source":"def decomposition_carres2(n):\n    listes_carres = liste_carres_entiers(n)\n    listes_carres = listes_carres + [0]\n    for carre1 in listes_carres:\n        for carre2 in listes_carres:\n            for carre3 in listes_carres:\n                for carre4 in listes_carres:\n                    if carre1 + carre2 +carre3 +carre4 ==n :\n                        return [carre1, carre2, carre3, carre4]","execution_count":50,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"nb = 1871\nprint_decompoision(nb, decomposition_carres2(nb))\nnb = 300\nprint_decompoision(nb, decomposition_carres2(nb))\nnb = 1789\nprint_decompoision(nb, decomposition_carres2(nb))\nnb = 2021\nprint_decompoision(nb, decomposition_carres2(nb))\nnb = 12345\nprint_decompoision(nb, decomposition_carres2(nb))","execution_count":51,"outputs":[{"output_type":"stream","text":"1871 = 43² + 3² + 3² + 2²\n300 = 17² + 3² + 1² + 1²\n1789 = 42² + 5² + 0² + 0²\n2021 = 44² + 9² + 2² + 0²\n12345 = 111² + 4² + 2² + 2²\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.5"}},"nbformat":4,"nbformat_minor":2}
\ No newline at end of file