Algorithme de Sardinas-Patterson

De testwiki
Aller à la navigation Aller à la recherche

Modèle:Voir homonymes

En théorie des codes, l'algorithme de Sardinas-Patterson permet de déterminer si une partie d'un monoïde libre est un code en temps polynomial. Il est nommé d'après August Sardinas et George Patterson, qui le publièrent dans un article de 1953[1].

Objectif

On considère un monoïde libre A*. On appelle code à longueur variable ou code une partie C de A* telle que le sous-monoïde engendré C* est libre. L'algorithme de Sardinas-Patterson prend en entrée un alphabet A et une partie finie C de A* et détermine si C est un code.

L'objectif est de pouvoir transcrire un mot dans un alphabet B en un mot dans l'alphabet A en associant à chaque lettre de B un nombre variable de lettres de A, C étant alors l'ensemble des codages des lettres de B. On cherche alors à ce que ce code ne soit pas ambiguë. Par exemple, en code Morse, A est codé par .-, E par . et F par ..-.. Mais alors, ..-. peut être interprété comme EAE ou comme F. Le code Morse nécessite ainsi l'usage d'un autre caractère séparant les lettres[2].

Description de l'algorithme

Si P et Q sont deux parties de A*, on pose P1Q={uA*|pP,puQ}. On note ϵ le mot vide. L'algorithme calcule les éléments de la suite d'ensembles définie par récurrence :

  • D0=C et D1=C1C{ϵ}
  • Dn+1=C1DnDn1C pour n1.

Si lors du calcul, on obtient un Dn égal à un des précédents, alors C est un code. Si l'un des Dn contient ϵ, alors C n'est pas un code[2].

Terminaison

Chacun des Dn est une partie de l'ensemble des facteurs des éléments de C. Or C est fini, donc l'ensemble des facteurs de ses éléments est fini (dans un monoïde libre, chaque élément ayant un nombre fini de facteurs), donc l'ensemble des parties de cet ensemble est fini. Par conséquent, des termes de la suite (Dn) se répètent. L'algorithme s'arrête donc nécessairement[2].

Correction

La correction de l'algorithme s'énonce comme suit.

Théorème. C n'est pas un code si, et seulement si l'un des Dn contient ϵ.

Démonstration.

(⇒) Supposons que C n'est pas un code. Si ϵC, alors ϵD0. Sinon, on dispose de a1a2ak et b1b2bl égaux avec (ai) et (bj) deux suites d'éléments de C telles que a1b1. On peut voir ce mot comme un segment, par exemple :

A0B0-----------------A1--------B1---------B2-----A2-----------------B3---------A3B4

Les lettres en majuscules notent des positions dans le mot, de manière que a1=[A0A1], a2=[A1A2] et ainsi de suite et de même pour les bj, avec les crochets notant le facteur délimité par les deux positions. Exécutons l'algorithme sur cet exemple : comme a1=[A0A1] et b1=[B0B1] (avec A0=B0) sont dans C, alors a11b1=[A1B1] est dans D1. Ensuite, comme a2=[A1A2] est dans C, on a [B1A2]=[A1B1]1[A1A2]D11CD2. Ensuite[B2A2]=[B1B2]1[B1A2]=b21[B1A2]C1D2D3, puis [A2B3]=[B2A2]1b3D4. On peut ainsi faire augmenter de 1 l'indice de la lettre de gauche à chaque étape, en utilisant le terme de droite de l'union si l'ordre de A et B change dans les crochets, le terme de gauche sinon. Finalement, on arrive au même point à gauche et à droite : ϵ=[B4A3]D6 et on obtient le critère voulu. Comme la suite des (Dn) est définie par récurrence, elle ne peut pas se répéter avant d'inclure ϵ.

(⇐) Réciproquement, supposons ϵDn pour un entier n2 (le cas n=0 est immédiat). Par exemple, on a ϵ=cn11dn1 avec cn1C et dn1Dn1. Alors cn1=dn1. De même, on a par exemple dn1=dn21cn2, et donc dn2cn1=cn2. En développant les dkobtenus jusqu'à arriver dans D1, on obtient une égalité donc chaque membre est une concaténation d'éléments de C. Par construction, le dernier mot de ces deux suites est différent : l'un est cn1, l'autre en est un suffixe strict. On a donc obtenu un même mot en concaténant deux suites différentes de C : ce dernier n'est donc pas un code[3].

Notes et références

Modèle:Références

Modèle:Portail