David Madore's WebLog: Petit navigateur d'ordinaux

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

Entry #1946 [older|newer] / Entrée #1946 [précédente|suivante]:

(dimanche)

Petit navigateur d'ordinaux

À la fois pour m'exercer à la programmation en JavaScript (dont j'ai déjà dû dire que c'est un langage dans lequel je trouve un mélange très étonnant de choix très élégants et puissants et de bizarreries insupportables), et pour exercer mon intuition sur les ordinaux, j'ai créé une petite page dynamique (devrais-je dire un jeu en HTML5 ?) d'exploration des ordinaux sous la forme de bâtonnets comme je les présentais dans une entrée récente.

La page est ici, et je l'inclus aussi dans une frame plus bas dans cette entrée (mais c'est moins commode de cette manière parce qu'on ne peut pas utiliser l'historique du navigateur et notamment le bouton back) ; son utilisation mérite sans doute quelques explications. L'idée est qu'un certain ordinal est présenté sous forme de bâtonnets (au départ, ε0, mais on peut en sélectionner d'autres), et plus précisément comme une somme infinie, toujours aux mêmes proportions géométriques, de différents termes (du genre ε0 = ω + ωω + ωωω + ωωωω + ⋯, les termes omis valant d'ailleurs tout autant que le total), et on peut sélectionner un de ces termes (soit un des quatre premiers termes, soit la totalité du reste de la série, ce qui fait cinq choix) pour zoomer dessus : cela se fait soit en cliquant sur le graphique, soit sur un des noms des ordinaux en-dessous (ce sont des liens) qui représentent les valeurs de ces différents termes. Le faire devrait déclencher une animation où on voit la partie en question s'étendre jusqu'à occuper toute la largeur de l'image. Lorsque ceci se produit, le titre reflète le nouvel ordinal qu'on est en train d'observer (la valeur de l'ordinal représenté dans l'image, le « nombre » de bâtonnets sur lesquels on a zoomé, si l'on veut).

En bas de l'image s'affiche aussi le « nombre » de bâtonnets qu'on a fait disparaître sur la gauche, c'est-à-dire la valeur de la somme des termes précédents de la série (à toutes les étapes), ou encore, si l'on préfère, l'ordinal du bâtonnet le plus à gauche à l'intérieur de l'ordinal initial : en quelque sorte, c'est notre position actuelle dans l'ordinal de départ alors que l'ordinal affiché dans le titre est en quelque sorte notre niveau de zoom ; il est donc possible, pour n'importe quel ordinal α plus petit que l'ordinal de départ (et multiple de ω, parce que mon programme refuse de descendre plus loin), de faire en sorte que cet ordinal removed at left vaille exactement α.

En cliquant sur la partie tout à droite (celle qui représente la somme de tous les autres termes de la série), on ne fait pas diminuer l'ordinal représenté, et le processus ne termine jamais (enfin, jusqu'à ce qu'on ait fait exploser JavaScript, ce qui ne devrait pas être long, j'imagine). Si on clicke sur d'autres parties, l'ordinal décroît toujours (je parle de celui indiqué dans le titre, i.e. la « largeur », pas celui du bas, la « position », qui elle augmente toujours), et donc on tombe forcément en un nombre fini d'étapes sur ω, mais à moins de clicker sur la partie la plus à gauche, ce nombre fini d'étapes risque souvent d'être considérablement plus long que la durée de vie de l'Univers, ou en tout cas que la mémoire de votre navigateur, donc il est facile de tomber sur des ordinaux impossiblement compliqués.

Bref, voilà le joujou, je fais d'autres remarques plus sérieuses en-dessous :

Quelques remarques d'ordre mathématique, maintenant, suivies de quelques remarques d'ordre informatique :

  • Tous les ordinaux dans l'histoire ressemblent un peu à la même chose. En fait, dès qu'ils sont plus que légèrement compliqués, ils doivent être identiques au pixel près. La fractale à laquelle ils ressemblent, qui a tout à voir avec mon choix d'arrangement des bâtons, et rien avec la nature fondamentale des ordinaux, peut être décrite comme ceci : si on appelle u la transformation affine qui fixe le point au milieu à gauche du dessin et qui transforme l'axe des abscisses par un coefficient 10/3 et laisse les ordonnées identiques (c'est la transformation qui sert à zoomer sur la partie la plus à gauche de l'ordinal) et v la similitude qui fixe la pointe droite du dessin et qui a pour rapport 10/7 (les transformations qui servent à zoomer sur les autres parties de l'ordinal sont alors uv, uv², uv³, et v4 pour la partie restante), alors il s'agit du plus petit fermé contenant le bâtonnet tout à droite et stable par u et v. Ça, je répète, c'est à quoi mes dessins d'ordinaux ressemblent, et ça signifie simplement que la complexité est telle qu'on ne peut pas résoudre les petits bâtons individuels à moins de clicker très souvent ; mais cette fractale comporte un nombre infini de « bâtonnets » entre deux abscisses distinctes, alors que mes dessins d'ordinaux ont, en principe, un bâtonnet distinct à droite de n'importe quel bâtonnet donné. Bref, voilà une première limitation sérieuse de mon système, c'est qu'on n'y voit rien, et qu'on se retrouve plus ou moins à zoomer tout le temps de la même façon sur le même dessin, avec juste les noms qui changent, ce n'est ni très intéressant, ni très éclairant. ☹
  • Encore plus sérieux : ce système suggère, alors que c'est faux, qu'il existerait une façon unique, ou au moins très naturelle, de fabriquer n'importe quel ordinal comme somme d'une série d'ordinaux plus petits ; ou que la subdivision de l'ordinal a quelque chose d'intrinsèque. Or ce n'est pas le cas. Par exemple, l'écriture de ωω comme ω + ω² + ω³ + ⋯ laisse penser, comme elle est représentée, que le premier ω est spécial ou différent des autres ω qui peuvent se trouver à l'intérieur des autres termes : il n'en est rien, il a un rôle totalement semblable à celui que joue par exemple le premier ω du terme ω², c'est-à-dire que la séparation des termes n'a rien de magique ou d'intrinsèque. Je suis donc en train de donner une impression totalement fausse de certains ordinaux comme quoi ils seraient plus ou moins espacés à tel ou tel endroit, ce qui n'a aucun sens — seul l'ordre compte. J'avais fait plus attention à ce problème dans mon entrée précédente sur la question, notamment dans mon dessin de ωω, où j'ai fait au moins en sorte que rien ne distingue fondamentalement le premier ω du suivant, mais je ne sais pas généraliser naturellement ce genre d'astuce un peu ad hoc à des ordinaux considérablement plus grands (et de toute façon je ne suis pas persuadé que c'était vraiment plus clair).
  • Les noms que mon programme donne aux ordinaux ne sont pas forcément idéaux : ils sont systématiques et raisonnables, mais ce ne sont pas forcément ceux qu'on utiliserait le plus naturellement. Par exemple, on a ε0ω = ωε0+1, et ε02 = ωε0⁢2, et ε0ω = ωωε0+1, et ε0ε0 = ωωε0⁢2, et ε0ε0ω = ωωωε0+1 (tout cela est laissé en exercice au lecteur, c'est assez facile en se rappelant que ε0=ωε0 et en partant plutôt du membre de gauche) ; or dans chacune de ces égalités, mon programme utilisera la forme de droite pour nommer les ordinaux en question (parce qu'il utilise autant que possible la forme normale de Cantor) alors que la version de gauche (basée en premier lieu sur une écriture en base ε0) semble plus naturelle. Cela peut, au moins, surprendre.
  • Le programme en JavaScript contient un vrai petit système d'objets permettant de représenter les plus petits ordinaux (les plus petits signifiant ici, les ordinaux jusqu'à l'ordinal εεε, qui est le plus petit ordinal vérifiant l'équation α=εα, exclu). Il « sait » vraiment faire des additions, comparer deux ordinaux, trouver une suite qui converge vers un ordinal limite, fabriquer un nom HTML, etc. Ça m'a donné l'occasion de faire de la programmation orientée objet en JavaScript (mélangée à un petit peu de programmation fonctionnelle, puisque je n'hésite pas à renvoyer des fonctions qui capturent des variables internes, etc.). Et à comprendre un peu plus précisément comment fonctionne le système de prototypage de JavaScript (je savais le principe général que chaque objet avait un prototype, qui sert à déterminer la chaîne d'héritage, mais je ne comprenais pas bien la façon dont il était initialisé avec new ou Object.create).
  • C'était aussi l'occasion de faire joujou avec la manipulation des URL en JavaScript : je voulais faire en sorte que chaque état du programme (l'ordinal qu'on voit, mais aussi celui laissé à gauche) corresponde à une URL stable qu'on peut charger directement, du style http://www.madore.org/~david/math/drawordinals.html#?v=e pour la représentation initiale de ε0 (et de même, tous les liens dans la page activent des fonctions JavaScript mais comportent aussi des URL correctes et qu'on peut utiliser directement) ; j'ai donc suivi cette fameuse convention (souvent décriée, mais enfin je ne vois pas comment faire autrement) consistant à coder les paramètres à passer au JavaScript dans ce qui devrait normalement être l'identificateur de fragment. (J'ai utilisé un ‘?’ pour séparer ces paramètres, ça me semble plus propre que de ne rien mettre pour signaler qu'il est normal qu'il n'y ait pas de balise HTML ayant cet ID, mais en même temps je ne voulais pas utiliser le ‘!’ qu'on voit souvent dans cette fonction parce qu'il a un sens magique pour Google.) Ceci permet aussi que (si vous essayez le truc dans sa propre page et pas tel qu'il est inclus dans la présente entrée) les boutons de navigation dans l'historique (back/forward) marchent normalement, ce qui est toujours plus plaisant ; la magie, là, est de capter l'événement hashchange (ça ne marche pas sur tous les navigateurs, mais bon, c'est déjà ça).
  • Ah, et vous vous en foutez, mais si vous voyez des petites mains qui pointent pour marquer les items de cette liste de remarques, je suis assez fier de ma petite magouille en CSS qui m'a fait un peu suer (mais ça c'est parce que je suis mauvais en CSS, pas parce que c'était dur).

↑Entry #1946 [older|newer] / ↑Entrée #1946 [précédente|suivante]

Recent entries / Entrées récentesIndex of all entries / Index de toutes les entrées