Codage de Gray

Exercice

Le but du codage de Gray est de représenter les entiers de telle sorte qu’un seul bit soit modifié à chaque incrémentation. Pour n un entier strictement positif, on définit la fonction Γn de {0,,2n1} dans {0,1}n, qui à un entier associe son codage de Gray sur n bits. On définit de même la fonction Bn de {0,,2n1} dans {0,1}n qui à un entier associe son écriture binaire sur n bits.

On définit récursivement Γn : Γ1(0)=0, Γ1(1)=1 et n2,k<2n :

Γn(k)={0Γn1(k) si k<2n1 1Γn1(2nk1) sinon 

1.a) Donner la table des valeurs de Γ3.

b) Prouver que pour tout entier n et pour tout entier k<2n1, les représentations Γn(k) et Γn(k+1) ne diffèrent que d’un seul bit.

On note cependant que cette définition ne nous permet pas de passer rapidement d’un entier en binaire à sa représentation en codage de Gray.

Soit n1 et k<2n. On considère la fonction Φn de {0,,2n1} dans {0,1}n définie par :

Φn(k)=Bn(k)Bn(k2)

où l’opérateur correspond au XOR bit à bit.

2. Prouver que la fonction Φn est bijective.

3. Soit 0r<2n. Prouver la relation :

Bn+1(2n+r)Bn+1(2nr1)=111n+1 fois

4. Déduire que pour tout n et tout k<2n, on a Γn(k)=Φn(k).

5. Donner une méthode directe pour passer de Γn(k) à Bn(k) et de Bn(k) à Γn(k).

Maintenant que nous pouvons aisément représenter les entiers par un codage de Gray, il nous reste à savoir comment incrémenter les entiers sans repasser par le codage binaire. Pour ce faire on présente la méthode suivante : soit k<2n1. On connaît Γn(k) et on cherche Γn(k+1). Si le nombre de 1 dans Γn(k) est pair, alors on inverse le bit le plus à droite. Sinon, on inverse le bit à gauche du bit à 1 le plus à droite.

6. Prouver la correction de cette méthode.


Correction

1. a) Calculons Γ3.

Γ1(0)=0Γ1(1)=1Γ2(0)=00Γ2(1)=01Γ2(2)=11Γ2(3)=10Γ3(0)=000Γ3(1)=001Γ3(2)=011Γ3(3)=010Γ3(4)=110Γ3(5)=111Γ3(6)=101Γ3(7)=100


b) Prouvons par récurrence sur n1 que pour tout k<2n1, Γn(k) et Γn(k+1) ne diffèrent que d’un seul bit.

La table des valeurs de Γ1 ci-dessus nous permet de vérifier le cas 1. On suppose maintenant la propriété vraie au rang n, montrons qu’elle le reste au rang n+1.

Soit k<2n+11.

Si k<2n1 : on a par hypothèse de récurrence que Γn(k) et Γn(k+1) ne diffèrent que d’un seul bit. Or :

Γn+1(k)=0Γn(k) et Γn+1(k+1)=0Γn(k+1)

Ainsi Γn+1(k) et Γn+1(k) ne diffèrent que d’un seul bit.

Si 2n1<k<2n+11 : on a Γn+1(k)=1Γn(2n+1k) et Γn+1(k+1)=1Γn(2n+1k1). Or, par hypothèse de récurrence, Γn(2n+1k) et Γn(2n+1k1) ne diffèrent que d’un seul bit, et donc Γn+1(k) et Γn+1(k+1) aussi.

Enfin, si k=2n+11 : on a Γn+1(k)=0Γn(k) et Γn+1(k+1)=1Γn(k). Ces deux mots ne diffèrent que sur le premier bit, donc Γn+1(k) et Γn+1(k+1) ne diffèrent que d’un unique bit.

Cela prouve la propriété au rang n+1 et achève la récurrence.


2. On note Bn(k)=b1b2bn. On a alors Bn(k2)=0b1b2bn1. De ce fait, en écrivant Φn(k)=a1a2an on a les relations suivantes :v

a1=b1a2=b1b2a3=b2b3=an=bn1bn

On considère la fonction Fn de {0,1}n dans {0,2n} définie par Fn(a1a2an)=uu a pour représentation binaire u1u2un avec

u1=a1u2=a1a2u3=a1a2a3=un=a1a2an

On note que Fn(Φn(k))=k. De ce fait Φn est bijective. 


3. Cette relation signifie simplement que tous les bits de la représentation en binaire de 2n+r et 2nr1 sont distincts. Pour le prouver, on procède par récurrence forte sur (n,r). Soit nN et r<2n. On note H(n,r)= « Tous les bits de la représentation en binaire sur n+1 bits de 2n+r et 2nr1 sont distincts ».

On vérifie à la main pour n=0 et n=1.

Pour tout n, on a :

Bn(2n)=1000n fois  et Bn(2n1)=0111n fois 

Ce qui prouve H(n,0).

Soit n1 et 2n1>r0. On suppose H(m,k) vrai pour tout m<n, k<2m et H(n,l) vrai pour 0lr. Prouvons H(n,r+1).

On note Bn+1(2n+r)=b1b2bn+1. Par hypothèse de récurrence on a :

Bn+1(2nr1)=¯b1¯b2¯bn+1

¯bi est le bit inverse de bi.

Si bn+1=0 : on a alors Bn+1(2n+r+1)=b1b2bn1 et Bn+1(2nr2)=¯b1¯b2¯bn0. Donc les représentations binaires de 2n+r+1 et 2nr2 sur n+1 bits sont bien distinctes bit à bit.

Si bn+1=1 : on a r impair.

Soit k=r+12. On a alors 2(2n1+k)=2n+r+1. On rappel que pour représenter le double d’un entier en binaire, il suffit d’ajouter un 0 à la fin, ce qui nous donne donc :

Bn+1(2n+r+1)=Bn(2n+r12+1)0

De même Bn+1(2nr2)=Bn(2n1k1)1.

Or, par hypothèse de récurrence, Bn(2n1k1)=¯Bn(2n1+k).

Il en résulte que Bn+1(2n+r+1)=¯Bn+1(2nr2). Cela prouve donc H(n,r+1) et achève notre récurrence.


4. Pour ce faire, il nous suffit de montrer que Γ1=Φ1, ce qui est immédiat ; puis que la récurrence suivante est satisfaite pour n2 :

Φn(k)={0Φn1(k) si k<2n1 1Φn1(2nk1) sinon 

Si k<2n1 on a bien Φn(k)=0Φn1(k).

Si k2n1 on pose r=k2n1. On a alors k=2n1+r et 2nk1=2n1r1. On écrit Bn(k)=b1b2bn. La question précédente nous donne Bn(2n1r1)=¯b1¯b2¯bn. On note de plus que b1=1. Ainsi :

Φn(k)=1(b1b2)(bn1bn)=1u

Avec u un mot binaire sur n1 bits.

Et de plus :

Φn(2n1r1)=0(¯b1¯b2)(¯bn1¯bn)=0(b1b2)(bn1bn)Φn(2n1r1)=0u

Donc Φn1(2n1r1)=u et Φ satisfait notre relation de récurrence.

On a donc bien prouvé que pour tout n et pour tout k<2n :

Γn(k)=Φn(k)


5. Pour passer de Γn(k) à Bn(k) on utilise la représentation binaire de la fonction F définie plus haut. Autrement dit, pour un mot a1a2an codage de Gray d’un nombre, la représentation en binaire sur n bits de ce nombre est b1b2bn avec :

b1=a1b2=a1a2b3=a1a2a3=bn=a1a2an

Pour passer d’un codage binaire b1b2bn à un codage de Gray a1a2an on pose :

a1=b1a2=b1b2a3=b2b3=an=bn1bn

On note que ces deux opérations peuvent être chacune réalisées avec n1 portes XOR.


6. On pose |u|1 le nombre de 1 dans le mot u.

Encore une fois, on va procéder par récurrence sur n, la taille de notre représentation. Montrons que pour les représentations de taille n notre méthode effectue bien l’incrémentation sur les entiers représentés avec le codage de Gray.

Le cas n=1 se vérifie aisément.

On suppose la propriété vraie au rang n, prouvons qu’elle le reste au rang n+1. Soit k un entier positif inférieur strictement à 2n+11. Si k est inférieur strictement à 2n1 notre méthode fonctionne par hypothèse de récurrence, et on peut calculer le codage de Gray de k+1. Sinon, si k=2n1, on a Γn(k)=100. Et par notre définition, Γn+1(k)=0100 et Γn+1(k+1)=1100. Or Γn+1(k) possède un nombre impair de 1. Notre méthode fonctionne donc bien.

Enfin, si k2n on considère 2n+1k1 qui est inférieur à 2n.

Comme on modifie un bit à chaque incrémentation, on change également la parité du nombre de 1 dans notre codage. Il en résulte que |Γn+1(k)|1 est de même parité que k. Il en résulte que |Γn+1(k)|1 est de même parité que |Γn+1(2n+1k2)|1.

Si k est pair, 2n+1k2 est également pair et on a montré précédemment que pour passer de Γn+1(2n+1k2) à Γn+1(2n+1k1) il suffisait de changer le bit le plus à droite. Donc, pour passer de Γn+1(k+1) à Γn+1(k), il faut changer le bit le plus à droite. Autrement dit, on doit bien changer le dernier bit pour passer de Γn+1(k) à Γn+1(k+1).

Le cas impair se résout de même.

On a donc prouver le cas n+1, ce qui achève la récurrence.

On a donc bien une méthode simple pour implémenter l’incrémentation avec le codage de Gray.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *