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,…,2n−1} 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,…,2n−1} 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 ∀n≥2,∀k<2n :
Γn(k)={0Γn−1(k) si k<2n−1 1Γn−1(2n−k−1) sinon
1.a) Donner la table des valeurs de Γ3.
b) Prouver que pour tout entier n et pour tout entier k<2n–1, 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 n≥1 et k<2n. On considère la fonction Φn de {0,…,2n−1} 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 0≤r<2n. Prouver la relation :
Bn+1(2n+r)⊕Bn+1(2n−r−1)=11…1⏟n+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<2n−1. 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 n≥1 que pour tout k<2n−1, Γ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+1−1.
Si k<2n−1 : 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 2n−1<k<2n+1−1 : on a Γn+1(k)=1Γn(2n+1−k) et Γn+1(k+1)=1Γn(2n+1−k−1). Or, par hypothèse de récurrence, Γn(2n+1−k) et Γn(2n+1−k−1) ne diffèrent que d’un seul bit, et donc Γn+1(k) et Γn+1(k+1) aussi.
Enfin, si k=2n+1−1 : 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)=b1b2…bn. On a alors Bn(⌊k2⌋)=0b1b2…bn−1. De ce fait, en écrivant Φn(k)=a1a2…an on a les relations suivantes :v
a1=b1a2=b1⊕b2a3=b2⊕b3⋯=⋯an=bn−1⊕bn
On considère la fonction Fn de {0,1}n dans {0,2n} définie par Fn(a1a2…an)=u où u a pour représentation binaire u1u2…un avec
u1=a1u2=a1⊕a2u3=a1⊕a2⊕a3⋮=⋮un=a1⊕a2⊕…⊕an
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 2n−r−1 sont distincts. Pour le prouver, on procède par récurrence forte sur (n,r). Soit n∈N 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 2n−r−1 sont distincts ».
On vérifie à la main pour n=0 et n=1.
Pour tout n, on a :
Bn(2n)=100…0⏟n fois et Bn(2n−1)=011…1⏟n fois
Ce qui prouve H(n,0).
Soit n≥1 et 2n−1>r≥0. On suppose H(m,k) vrai pour tout m<n, k<2m et H(n,l) vrai pour 0≤l≤r. Prouvons H(n,r+1).
On note Bn+1(2n+r)=b1b2…bn+1. Par hypothèse de récurrence on a :
Bn+1(2n−r−1)=¯b1¯b2…¯bn+1
où ¯bi est le bit inverse de bi.
Si bn+1=0 : on a alors Bn+1(2n+r+1)=b1b2…bn1 et Bn+1(2n−r−2)=¯b1¯b2…¯bn0. Donc les représentations binaires de 2n+r+1 et 2n−r−2 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(2n−1+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+r−12+1)0
De même Bn+1(2n−r−2)=Bn(2n−1−k−1)1.
Or, par hypothèse de récurrence, Bn(2n−1−k−1)=¯Bn(2n−1+k).
Il en résulte que Bn+1(2n+r+1)=¯Bn+1(2n−r−2). 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 n≥2 :
Φn(k)={0Φn−1(k) si k<2n−1 1Φn−1(2n−k−1) sinon
Si k<2n−1 on a bien Φn(k)=0Φn−1(k).
Si k≥2n−1 on pose r=k−2n−1. On a alors k=2n−1+r et 2n−k−1=2n−1−r−1. On écrit Bn(k)=b1b2…bn. La question précédente nous donne Bn(2n−1−r−1)=¯b1¯b2…¯bn. On note de plus que b1=1. Ainsi :
Φn(k)=1(b1⊕b2)…(bn−1⊕bn)=1u
Avec u un mot binaire sur n−1 bits.
Et de plus :
Φn(2n−1−r−1)=0(¯b1⊕¯b2)…(¯bn−1⊕¯bn)=0(b1⊕b2)…(bn−1⊕bn)Φn(2n−1−r−1)=0u
Donc Φn−1(2n−1−r−1)=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 a1a2…an codage de Gray d’un nombre, la représentation en binaire sur n bits de ce nombre est b1b2…bn avec :
b1=a1b2=a1⊕a2b3=a1⊕a2⊕a3⋯=⋯bn=a1⊕a2⊕…⊕an
Pour passer d’un codage binaire b1b2…bn à un codage de Gray a1a2…an on pose :
a1=b1a2=b1⊕b2a3=b2⊕b3⋯=⋯an=bn−1⊕bn
On note que ces deux opérations peuvent être chacune réalisées avec n−1 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+1−1. Si k est inférieur strictement à 2n−1 notre méthode fonctionne par hypothèse de récurrence, et on peut calculer le codage de Gray de k+1. Sinon, si k=2n−1, on a Γn(k)=10…0. Et par notre définition, Γn+1(k)=010…0 et Γn+1(k+1)=110…0. Or Γn+1(k) possède un nombre impair de 1. Notre méthode fonctionne donc bien.
Enfin, si k≥2n on considère 2n+1−k−1 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+1−k−2)|1.
Si k est pair, 2n+1−k−2 est également pair et on a montré précédemment que pour passer de Γn+1(2n+1−k−2) à Γn+1(2n+1−k−1) 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.