C'est une fonction décroissante sur ]0,1] qui s'annule en 1. En effet, l'information associée à quelque chose de certain ($p_i=1$) est nulle, alors que celle associée à quelque chose de peu probable ($p_i\rightarrow0$) est très grande $(\rightarrow\infty)$.
Avec un modèle de Markov, si on essaie de "créer" des mots lettre par lettre, plus on monte dans les ordres, plus la structure de la langue commence à apparaître. À partir de l'ordre 3, il apparaît des mots qui seraient potentiellement de la langue considérée. Ce modèle peut être adapté, comme par exemple pour le correcteur orthographique des téléphones.\\
L'idée générale de la compression d'une source de Markov est d'effectuer des prédictions pour avoir accès aux informations, de sorte qu'il ne reste à transmettre que ce que l'on ne peut pas prédire.\\
Un \emph{code} est un ensemble binaire de $\{0,1\}^*$ (union de tous les ensembles $\{0,1\}^2=\{00,11,01,10\}$ , $\{0,1\}^3= ...$ ...). Un code est donc un sous-ensemble de $\{0,1\}^*$.\\
Attention, ce sont des théorèmes d'existence : ils ne peuvent pas servir à vérifier qu'un code est préfixe ou décodable de manière unique.
\begin{exemple}
Le code $\{1,00,10\}$ n'est pas préfixe, pourtant on a $\sum2^{-l_i}=2^{-1}+2^{-2}+2^{-2}=1$. On sait seulement qu'il existe un code préfixe dont les mots de code ont ces longueurs.
\end{exemple}
\end{rem}
\begin{rem}
On sait que "préfixe" implique "décodable de manière unique". En revanche, si un code est décodable de manière unique, on peut seulement dire qu'il existe un code préfixe équivalent, sans qu'il soit le même.
L'entropie (avec une source sans mémoire) donne une borne supérieure de la quantité d'information réelle contenue dans un message. Dans le cas d'un texte, l'entropie au sens d'une source de Makorv diminue quand on augmente l'ordre, jusqu'à se stabiliser au bout d'un certain ordre.
On montre que la longueur moyenne $\overline{l}$ d'un code de Huffmann associé à une source satisfait
\[ H(x)\leq\overline{l}\leq H(X)+1\]
On peut obtenir des codes plus performants en codant des paires de symboles, des triplets... des N-uplets de symboles. Avec ce type de technique, la longueur moyenne $\overline{l}$ par symbole de la source initiale satisfait :
\[H(X)\leq\overline{l}\leq H(X)+1\]
L'inconvénient est la taille de la table de Huffmann à gérer.
Le code arithmétique vu en \ref{sec:arithm} possède plusieurs défauts:
\begin{itemize}
\item Il faut coder tout le vecteur généré pour la source pour obtenir le code arithmétique. Ceci introduit du délai de codage.
\item Les bornes inf et sup de l'intervalle de codage deviennent de plus en plus proches il faut les représenter en précision infinie.
\end{itemize}
L'idée du coadge arithmétique ``pratique'' est d'émettre ou de stocker sur le disque les bits de code dès qu'ils sont déterminé sans ambiguité. On peux alors dilater l'intervalle de codage.
$c =[c,0\underbracket{1...1}_{f}[$ et $[l_k,h_k [=[2l_k,2h_k [$
\item Sinon si $[l_k,h_k[\subset[0.5,1[$: \\
$c =[c,1\underbracket{0...0}_{f}[$ et $[l_k,h_k[=[2l_{k}-1,2h_{k}-1[$
\item Sinon si $[l_k,h_k[\subset[0.25,0.75[$ :\\
$f= f+1$, $[l_k,h_k[=[2l_k-0.5 , 2h_k-0.5[$
\end{enumerate}
\item Tant que $[l_k,h_k[\subset[0,0.5[$ ou $[l_k,h_k[\subset[0.5, 1[$ ou $[l_k,h_k[\subset[0.25,0.75[$ :\\
aller en 4
\end{enumerate}
\begin{rem}
en pratique le codage arithmétique se fait sur des intervalles entiers en partant de $[l_0,h_0[=[0,2^M]$ après découpages, les bornes des intervalles sont arrondies. On test si :
\begin{align*}
[l_k,h_k] &\subset [0,2^{M-1}[\\
&\subset[2^{M-1},2^M[\\
&\subset[2^{M-2},2^{M-1}+2^{M-2}]
\end{align*}
Les probabilités d'apparition de chaque symbole sont estimée en cours de codage.
Il faut montrer que $c(x_{1:N})\in[l_N,h_N[$ (et qu'alors on pourra décoder), et que cette procédure de codage est efficace, ie $E(\mu(X_1...X_N ))\simeq NH(x)$
\begin{itemize}
\item On sait que $c(\vec{x})\leq\mu(\vec{x})$ et on veut montrer que :
\[
\lambda(x)-\lambda(\vec{x}) \leq\frac{h_N-l_N}{2}
\]
On considère la représentation binaire de $\lambda(\vec{x})$:
Cette procédure est efficace pour $N\to+\infty$, avec l'$\infty$ petit. Par exemple, pour $N=100$, alors la longueur moyenne sera proche à $1\%$ de l'entropie.
\end{itemize}
\subsection{Code de Lempel-Ziv-Welch}
\paragraph{Idée}
Avant l'algorithme arithmétique adaptatif, il fallait avoir les probabilités d'apparition des symboles (Huffmann, codage arithmétique,...). Le code LZW permet de faire une compression sans passer par la phase d'estimation des probabilités des symboles. Par exemple pour un texte, l'alphabet est gros, et le codeur arithmétique ne fonctionne pas très bien pour les gros alphabets, car il utilise d'abord une phase de binarisation.\\
\subsubsection{Codage}
Le codage de LZW est une variante des codes LZ77 et LZ78 qui utilise un dictionnaire et n'a pas besoin des probabilités de la source. C'est un cde universel.\\
On considère une source $X$ à valeurs dans $\X=\{a,b,c\}$.
\begin{enumerate}
\item On initialise le dictionnaire de codage à l'aide des symboles de l'alphabet $\X$.
\item On cherche la plus longue suite de symboles restant à coder et appartenant au dictionnaire et on la code.
\item On rajoute cette suite suivi du premier symbole non codé $\omega$ au dictionnaire.
\item Aller en 2 tant qu'il existe des symboles à coder.
\end{enumerate}
\begin{exemple}
On a à coder la séquence $aabababca$.
\begin{center}
\begin{tabular}{|c|c|c|c|c|c|c|c|}
\hline
$a$&$b$&$c$&$aa$&$ab$&$ba$&$aba$&$abac$\\
\hline
0 & 1 & 2 & 3 & 4 & 5 & 6 & 7\\
\hline
\end{tabular}
\end{center}
On code $a$, on émet 0 et on ajoute $aa$ au dictionnaire.
On code $a$, on émet 0 et on ajoute $ab$ au dictionnaire.
On code $b$, on émet 1 et on ajoute $ba$ au dictionnaire.
On code $ab$, on émet 4 et on ajoute $aba$ au dictionnaire.
On code $aba$, on émet 6 et on ajoute $abac$ au dictionnaire.
On code $c$, on émet 2.
\end{exemple}
\subsubsection{Décodage}
Le décodage se fait
\begin{enumerate}
\item à partir du dictionnaire initial
\item à chaque décodage d'un mot, on rajoute ce mot suivi de $\omega$ au dictionnaire
\item$\omega$ n'est déterminé que si on a décodé le mot suivant
\end{enumerate}
\begin{exemple}
On a à décoder 001462.\\
On décode $a$, on ajoute $a\omega$ (3) au dictionnaire.
On décode $a$, donc le (3) est $aa$ et on ajoute $a\omega$ (4) au dictionnaire.
On décode $b$, donc le (4) était $ab$ et on ajoute $b\omega$ (5) au dictionnaire.
On décode $ab$, donc le (5) était $ba$ et on ajoute $ab\omega$ (6) au dictionnaire.
On décode $ab\omega$, qui était en fait un $aba$ et on ajoute $aba\omega$ (7) au dictionnaire.
On décode $c$ donc le (7) était $abac$.
\end{exemple}
En pratique :
\begin{itemize}
\item les codes générés sont à nouveau codés à l'aide d'un code de Huffmann
\item la taille du dictionnaire est limitée, les mots les moins utilisés sont effacés.