Utilisateur:Padex/Complément à b-1

En informatique, on représente souvent les entiers sur un nombre fixe de bits.

A priori, si on utilise   bits, on peut écrire   nombres différents.

Si on ne s'intéresse qu'aux entiers positifs, la notation binaire nous permet d'écrire tous les entiers de   à  .

Si maintenant on veut également écrire des entiers négatifs, plusieurs solutions s'offrent à nous. La première, la plus simple, est de s'inspirer de notre notation quotidienne, et de réserver un bit pour indiquer le signe du nombre. Ainsi, pour   :

  représente  

  représente  

Cette notation possède cependant deux inconvénients : la première est que le   possède deux notations (  et   pour  ), donc on ne peut plus écrire que   nombres ; la seconde est que l'arithmétique n'y est plus triviale ( ).

Dans les faits, cette notation n'est donc jamais utilisée.

Une autre approche est de considérer un décalage constant de  , utilisée notamment par la notation normalisée des nombres à virgule flottante IEEE 754. Cependant là aussi, l'addition n'est pas simple, et passe d'une opération linéaire à une opération affine.

La dernière approche que j'exposerai est celle de l'arithmétique modulaire. Elle est plus connue sous le nom de complément à deux, car c'est ainsi qu'on passe facilement de l'écriture d'un nombre à celle de son opposé ; mais au fond, ce qui légitime toutes les opérations, c'est de raisonner modulo  .

Avant le complément à deux, celui à un

modifier

Lorsqu'on veut introduire le complément à deux, il est courant d'introduire au préalable le complément à un.

L'idée est simple : pour obtenir le complément à un d'une chaîne de bits, vous modifiez chaque bit de cette dernière. Ainsi,   devient  ,   devient  ,   devient  , etc.

Ce que l'on constate ensuite trivialement, c'est que pour toute chaîne de bits  , on a   (i.e.   1 d'affilée).

Or   (ou bien en considérant que la dernière retenue « se perd » du fait du nombre limité de bits pour écrire le nombre, ou bien en raisonnant de façon modulaire).

Donc on observe que pour toute chaîne de bits  , on a  .

Par définition,   est donc l'écriture légitime de  . On nomme alors  .

Du vrai complément à un

modifier

Et si maintenant on voulait écrire des réels avec la même approche ?

Essayons pour voir. Mais cette fois-ci, on va faire du vrai complément à un, c'est-à-dire un complément à un (doublement) infini.

Prenons   par exemple. Au fond,   est une écriture extrêmement réduite d'un nombre dont l'écriture complète serait :

 .

Si on applique le complément à un sur cette écriture complète, que se passe-t-il ? On obtient :

 .

On reconnaît deux choses.

D'une part, à droite de la virgule, on reconnaît une écriture impropre, et donc on peut d'ores et déjà simplifier :

 .

D'autre part, à gauche de la virgule, on lit le nombre  . Ceux familiers avec les nombres  -adiques ne seront pas surpris si j'identifie ce nombre à  . Pour les autres, je vous propose ce petit jeu d'écriture (parfaitement informel sur les réels) :

 

Donc

 

Pour en revenir à notre exemple, on trouve que  . Pas mal, non ?

Si on en revient à nos entiers, on s'aperçoit que le complément à deux n'est en fait qu'un vrai complément à un, tronqué à gauche. En effet, le développement complet de notre entier après la virgule donne   donc son vrai complément à un donne  .

Une notation pas inintéressante

modifier

Écrire une infinité de chiffres à gauche, c'est long, surtout au début.

Heureusement pour nous, on peut constater que si un nombre est positif, alors de façon classique son développement complet à gauche sera, à partir d'un certain rang, uniquement constitué de  . Et s'il est négatif, alors son développement complet à gauche sera, à partir d'un certain rang, uniquement constitué de  . C'est d'ailleurs là que l'analogie avec les nombres 2-adiques s'arrête : il est hors de question d'avoir des développements à gauche non-stationnaires.

On peut alors vouloir écrire les réels positifs comme en notation binaire classique, à ceci près qu'on laisse au moins un 0 à gauche pour indiquer que le développement est stationnaire au-delà. Ainsi, pour les entiers, cela donne : 0, 01, 010, 011, 0100, etc.

De même, pour écrire les négatifs, on considère le vrai complément à un de leur opposé, puis on tronque à gauche en veillant à laisser un 1 pour indiquer que le développement est stationnaire au-delà. Ainsi, pour les entiers strictement négatifs, cela donne : 1, 10, 101, 100, 1011, 1010, 1001, 1000, etc.

Comparaison avec la notation binaire classique

modifier

On constate alors deux points. Le premier est que le   ne fait plus figure d'exception. En effet, en notation classique,   possède deux écritures :   et  , qui ont toutes les deux un développement après la virgule fini (pour ne pas dire nul). Alors que tous les autres entiers possèdent deux écritures :   par exemple peut s'écrire   ou  , la seconde étant jugée impropre. En vrai complément à un,   peut s'écrire   (propre) ou   (impropre).

Le second point est que l'ordre des nombres devient beaucoup plus logique. Ainsi, en notation décimale classique,   mais  . Cela parce que  . Cela n'a l'air de rien, mais combien ont commis des erreurs en manipulant les parties entières de négatifs ? En vrai complément à un,   et  . La partie entière de   est bien ce qui précède la virgule, à savoir  .

De même, on n'est plus obligés de faire des tours de passe-passe pour additionner deux nombres. Ainsi, en notation décimale classique, pour additionner -7 et -9, on va avoir tendance à effectuer -(7+9), c'est-à-dire qu'on prend l'opposé de chacun des termes, qu'on les additionne, puis qu'on reprend l'opposé du résultat ! Pire, s'il s'agit d'effectuer -7 + 9, on va considérer qu'on soustrait 7 à 9.

En vrai complément à un, si je veux additionner   et  , j'additionne, tout simplement. Pour éviter les erreurs, on pourra s'autoriser à écrire le premier terme   (qui est une écriture correcte bien que non minimale de  , tout comme 042 est une écriture correcte de 42 en notation décimale classique), et j'obtiens bien  , en me souvenant que   et que les   à gauche sont négatifs ( ), là où la retenue est positive ( ).

Et si je veux additionner   et  , là encore il me suffit d'additionner directement pour obtenir  , qu'on simplifiera en  .

Lacunes mineures

modifier

Il ne s'agit pas d'une notation bijective, tout comme notre notation habituelle.

Dans sa représentation compacte, tout nombre positif commence par 01, sauf le 0 ; de même, tout nombre négatif commence par 10, sauf -1. À cause de 0 et de -1, on ne peut pas optimiser la représentation en faisant sauter le premier bit, bien qu'il soit tout le reste du temps redondant avec le deuxième bit.

En base b

modifier

On peut généraliser le jeu d'écriture précédent et obtenir :

 

D'où le titre : complément à b-1.

Base hexadécimale

modifier

Idem que pour passer de la représentation binaire classique à la représentation hexadécimale classique : on regroupe les bits de la notation en (vrai) complément à un par quatre, jusqu'à atteindre au moins un bit, tel que le développement à gauche est stationnaire au-delà de ce bit. Puis on convertit.

Pour les entiers positifs, cela donne : 0, …, 7, 08, …, 0F, 10, …, 7F, 080, …, 0FF, etc.

Pour les entiers strictement négatifs, cela donne : F, E, …, 8, F7, …, F0, EF, EE, …, 80, F7F, etc.

Base décimale

modifier

On peut s'inspirer du cas précédent et profiter de la parité de 10 pour décider que :

 

 

 

 

 

 

 

 

Pour les entiers positifs, cela donne : 0, …, 4, 05, …, 09, 10, …, 49, 050, …, 099, 100, etc.

Pour les entiers strictement négatifs, on obtient : 9, …, 5, 94, …, 50, 949, …, 500, etc.

Base ternaire

modifier

On s'inspire des autres bases mais cette fois-ci on ne bénéficie plus d'une parité, donc les nombres positifs commencent par 01 ou 02 et les nombres négatifs commencent par 20 ou 21 (aucun ne peut commencer par 1).

HH:MM:SS en notation décimale

modifier

En supposant qu'on veuille noter des heures négatives, et qu'a priori on ne soit plus bornés entre 0 et 23.

Les minutes et les secondes s'écrivent comme on en a l'habitude : de 00 à 59. (on oubliera les secondes intercalaires !)

Les heures peuvent s'écrire en complément à 9 en base décimale, par exemple 9:59:59 précédant 0:00:00.

Formalisation

modifier

Manifestement, ce système de notation semble fonctionnel, et présente même quelques avantages pratiques sur notre système classique.

Cependant, pour l'introduire j'ai été contraint de poser :

 

Or cette égalité pose deux problèmes.

Le premier est qu'elle n'est pas rigoureuse (la série ne converge clairement pas dans  ).

Le second est qu'elle est contraire à toute intuition, notamment parce qu'il paraît absurde qu'une somme de termes strictement positifs puisse être égale à un terme strictement négatif.

Pour rendre cela rigoureux, en sachant que je souhaite conserver la métrique euclidienne sur   (je ne manipule pas des nombres 2-adiques), j'ai la conviction profonde que la justification de tout ceci est identique à celle du complément à deux : on raisonne en arithmétique modulaire. Tout se passerait donc comme si nous raisonnions « modulo l'infini ». Ou plutôt, modulo un infini.

J'ai cherché du côté de l'arithmétique des ordinaux, cela ne m'a pas inspiré ; je me suis tourné vers les nombres surréels, cela n'a rien donné non plus. Je suis tombé sur un article de Terence Tao pour formaliser d'autres bizarreries similaires, mais c'était assez bourrin et je ne me sens pas le niveau pour explorer cette voie. De plus, elle ne correspond pas à mon intuition.

Récemment je suis tombé sur les nombres hyperréels, une piste qui me semble cette fois la bonne, notamment grâce au principe de transfert. Je pense qu'avec cette notation, je suis en train de quotienter   par le groupe engendré par la suite  .

Si j'écris   comme étant l'hyperréel classe d'équivalence de la suite   avec  , nous avons :  .

Finalement, je pense que la structure   correspond exactement à ce que je recherche. Je vous invite à lire la version anglaise de cette sous-page (qui n'est en rien sa traduction) pour plus de détails.

Si vous avez des idées ou des connaissances, n'hésitez pas à les partager ! :)

Notation Q

modifier

Pour des raisons de commodités et de compatibilité avec notre système décimal actuel, on peut choisir d'utiliser un « onzième chiffre » pour remplacer la notation  .

J'ai choisi d'utiliser une lettre, comme on le fait en base hexadécimale. J'en ai pris une dont certaines graphies comme « q » rappellent le nombre 9 ; je n'ai pas choisi la lettre G pour qu'on ne s'imagine pas qu'il s'agit de F+1 = 16.

De plus, comme nous le rappelle Murakami, les japonais ne seront pas choqués par ce choix.

Une version simplifiée est de considérer que Q = -1, mais qu'on ne peut et doit utiliser ce chiffre que pour les réels négatifs, qui est le chiffre le plus à gauche (donc nécessairement avant la virgule).

Ainsi :

-0,07 = Q,93

-0,7 = Q,3

-1 = Q

-1,4 = Q8,6

-2 = Q8

-10 = Q0

-11 = Q89 etc.

Avec cette notation, tous les réels positifs s'écrivent de la façon usuelle. Comme on peut le voir ci-dessus, la notation Q n'est pas plus longue que l'usuelle pour les réels négatifs ; elle est au plus aussi longue, parfois même plus courte.