
\begin{enumerate}
\item La lettre \og Q \fg{} occupe la place 16; donc $x=16$. On calcule alors:
\[
ax+b \equiv 17\times16+2\equiv14\mod 26.
\]
14 est la position de la lettre \og O \fg.

\underline{Ainsi, \og Q \fg{} est chiffrée en \og O \fg.}

\item Raisonnons par l'absurde.

Supposons donc que $\pgcd{a}{26}\neq 1$. Notons $x$ et $x'$ les rangs de deux lettres différentes.
\[
\begin{cases}
ax+b\equiv r(x)\mod26\\
ax'+b\equiv r(x')\mod26
\end{cases}
\iff
\begin{cases}
ax+b &= 26q+r(x),\ q\in\N*\\
ax'+b &= 26q'+r(x'),\ q'\in\N*
\end{cases}
\]
Alors,
\begin{align*}
r(x)-r(x') & = 26(q'-q)+a(x-x')\\
& = 26(q'-q)+a\dfrac{26}{\pgcd{a}{26}}\quad\text{en prenant }x\text{ et }x' \text{ tels que }x-x'=\dfrac{26}{\pgcd{a}{26}}\\
& = 26\left(q'-q+\dfrac{a}{\pgcd{a}{26}}\right)\\
& \equiv 0\mod 26.
\end{align*}

Il est donc possible de trouver deux $x$ et $x'$ différents tels que $r(x)\equiv r(x')\mod 26$.

Dans ce cas, le décryptage est impossible.

\uline{Par conséquent, si $\pgcd{a}{26}\neq1$, une lettre chiffrée peut corresponde à plusieurs lettres.}

\item Supposons que $\pgcd{a}{26}=1$. Soient deux nombres $x$ et $x'$ tels que $r(x)=r(x')$.
\[
\begin{cases}
ax+b\equiv r(x)\mod26\\
ax'+b\equiv r(x)\mod26
\end{cases}
\iff
\begin{cases}
ax+b &= 26q+r(x),\ q\in\N*\\
ax'+b &= 26q'+r(x),\ q'\in\N*
\end{cases}
\]
Alors,
\[ a(x-x')=26(q-q').\]
Or, $\pgcd{a}{26}=1$, donc d'après le théorème de Gauss, 26 divise $(x-x')$.

De plus, $0\leqslant x \leqslant 25$ et $0\leqslant x' \leqslant 25$.

Par conséquent, $-25 \leqslant x-x' \leqslant 25$.

On en déduit alors que $x-x'=0$ (seul 0 est divisible par 26 sur $\llbracket -25;25\rrbracket$).

\uline{Dans ce cas, on est assuré que le décryptage est possible (à une lettre codée ne correspond qu'une solution décodée).}

\item On part du principe que $y\equiv ax+b\mod 26$ est le rang de la lettre codée. Alors, en convenant de noter $a'$ l'inverse de $a$ modulo 26, on a :
\begin{align*}
ax+b\equiv y\mod 26 & \Leftrightarrow aa'x+ba'\equiv a'y\mod 26\\
& \Leftrightarrow x\equiv a'(y-b)\mod 26.
\end{align*}

Pour décoder la lettre \og Q \fg, dont le rang est $y=16$, on fait :
\begin{align*}
x & \equiv 23(16-2)\mod 26\\
& \equiv 322 \mod 26\\
& \equiv 12\times26+10\mod 26\\
&\equiv 10 \mod 26.
\end{align*}

Et 10 est le rang de la lettre \og K \fg.

\item Voici une fonction possible.
\begin{python}
from string import ascii_uppercase

def chiffrement_affine(a,b,lettre):
    lettre = lettre.upper() # on convertir la lettre en majuscule... au cas où...
    x = ascii_uppercase.index(lettre)
    r = (a * x + b) % 26

    return ascii_uppercase[r]
\end{python}

J'ai ici fait appel à \texttt{ascii\_uppercase} (du module \texttt{string}) qui désigne la chaîne de caractères \og ABC...XYZ \fg.

\item Voici une fonction possible:
\begin{python}
def dechiffrement_affine(a,b,lettre):
    lettre = lettre.upper()
    x = ascii_uppercase.index(lettre)

    # calcule l'inverse de a modulo 26

    i = 0
    while (a*i%26 != 1):
        i = i + 1

    # calcule le rang de la lettre initiale

    y = ( i * (x-b) ) % 26

    return ascii_uppercase[y]
\end{python}
\end{enumerate}
