Aller au contenu

Utilisateur:Padex/Complément à b-1

Une page de Wikipédia, l'encyclopédie libre.

Intro[modifier | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

É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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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 | modifier le code]

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.