Parmi
les objets mathématiques qui me fascinent complètement, un des plus
beaux et des plus remarquables est certainement le système de
racines de E8 (ou du moins tout le cortège d'objets
mathématiques plus ou moins liés à E8 : le système de
racines, les polytopes associés et leur groupe de Weyl, le réseau des
poids, les groupes de Lie ou de Chevalley associés, les immeubles de
Tits qui en découlent et les variétés de drapeaux en question,
etc. : il y a plein de choses auxquelles on pense quand on
dit E8
). Sans rentrer dans les détails
mathématiques, disons qu'il s'agit ici
d'un solide
semi-régulier en dimension 8 (pas exactement régulier
— il
n'y a que trois solides réguliers à partir de la dimension 5 et ils ne
sont pas très amusants — mais uniforme
), le plus grand et le
plus remarquable d'une famille de cinq objets exceptionnels ; il
s'agit aussi des points les plus proches de l'origine dans un
certain réseau
cristallographique aux propriétés
mirobolantes[#].
J'avais déjà fait une page interactive à son sujet (que je devrais d'ailleurs retravailler un peu), mais je reste sur ma faim : cette page ne laisse pas vraiment voir la beauté de l'objet, parce qu'on ne le voit pas bouger.
Bref, je voulais me faire une image du système de racines de E8 en train de tourner et d'exhiber quelques unes de ses impressionnantes symétries.
Le problème est que le polytope dont je parle a 240 sommets et 6720
arêtes[#2], et que tracer 6720
arêtes 25 fois par seconde ça a l'air un chouïa trop rapide pour une
bête application en JavaScript sur Canvas (enfin, si quelqu'un trouve
moyen d'optimiser ça et peut m'expliquer comment faire, je suis
preneur ; le calcul des projections de 240 points, lui, devrait être
très rapide). [Mise à jour : voir
néanmoins cette page.]
À défaut, je me suis fait une vidéo, que j'ai entre
autres mise sur
YouTube ; bon, l'ennui, c'est que la compression drastique que
YouTube fait subir à ses vidéos fait que c'est en fait
épouvantablement moche (surtout dans la deuxième partie de la vidéo,
celle où ça tourne très vite), ce qui est dommage pour quelque chose
censé être d'une beauté ineffable : j'en ai donc aussi fait
une version en plus
haute qualité à télécharger (170Mo ; le lien qui précède pointe
sur un fichier BitTorrent[#3],
si ça ne marche pas, vous pouvez réessayer sans
l'extension .torrent
pour télécharger directement le
fichier WebM), ce n'est toujours pas très satisfaisant, il y a encore
des artefacts de compression et aussi des artefacts d'aliasing dans le
tracé, mais bon, c'est quand même joli à regarder (et certainement
mieux que l'horreur qui a atterri sur YouTube).
Les premières 1′30″ montrent différentes petites rotations du polytope pour illustrer certains de ses plans de projection à haute symétrie (à 10″ on voit une symétrie d'ordre 30 appelée figure de Petrie, à 20″ une symétrie d'ordre 20, à 30″ une symétrie d'ordre 24, à 50″ une symétrie d'ordre 18, à 1′10″ une symétrie d'ordre 14). Les 2′30″ restantes sont différentes : cette fois, on revient toutes les 10″ à une projection équivalente, après avoir fait une rotation qui laisse le polytope symétrique (ça tourne donc beaucoup plus vite, et c'est cette partie-là qui a été le plus complètement massacrée par la compression vidéo sur YouTube).
Bizarrement, le plus difficile dans l'histoire a surtout été d'écrire le code qui interpole une rotation discrète en un mouvement continu (ou, de façon mathématiquement plus précise, qui inscrit une transformation orthogonale directe au bout d'un groupe à un paramètre de telles transformations[#4]).
[#] Par exemple, concernant le problème de savoir combien de sphères identiques on peut placer en contact avec une sphère donnée (sans qu'elles se chevauchent, bien sûr), la réponse est connue en toute petite dimension (≤4), en dimension 8 grâce à E8, en dimension 24 grâce au réseau de Leech (un autre réseau aux propriétés mirifiques), et c'est tout. Donc en fait je pourrais définir mon polyèdre E8 de la façon suivante : placez 240 sphères toutes identique autour d'une autre (également identique) en dimension 8, il n'y a essentiellement qu'une seule façon de faire ça, et les centres des 240 sphères forment le polyèdre dont je parle. Mais bon, il est plus simple de dire constructivement que mes 240 points sont ceux qui ont les coordonnées (±1,±1,0,0,0,0,0,0) (pour un choix quelconque de deux coordonnées non nulles et deux signes indépendants, ce qui fait 112 points) ou bien (±½,±½,±½,±½,±½,±½,±½,±½) (pour un nombre pair de signes moins, ce qui fait 128 points).
[#2] Il a aussi 60480 faces, qui sont des triangles équilatéraux, 241920 trois-cellules (c'est-à-dire les faces de dimension 3), qui sont des tétraèdres réguliers, 483840 quatre-cellules, qui sont des 4-simplexes réguliers, 483840 cinq-cellules, qui sont des 5-simplexes réguliers, 207360 six-cellules (dont 138240 relient une facette 7-simplexe à une facette 7-croix et 69120 relient deux 7-croix), et enfin 19440 facettes (=sept-cellules), 17280 étant des 7-simplexes réguliers et 2160 étant des octaèdres généralisés (des 7-croix). Enfin, son groupe de symétries (le groupe de Weyl de E8) est d'ordre 696729600 (et il est isomorphe, à un facteur 2 près, au groupe des transformations préservant une forme quadratique déployée de rang 8 sur 𝔽8).
[#3] Mon organisation
BitTorrent, basée sur XBT
est d'ailleurs épouvantablement
bordélique, mal foutue, et probablement bourrée de trous de sécurité
inquiétants. Mais je n'ai jamais réussi à trouver un tracker et
client BitTorrent qui me satisfassent (notamment,
sans PHP), à utiliser en ligne de commande (sur des
machines qui sont essentiellement des serveurs) ; si quelqu'un a des
suggestions, je suis preneur. Je devrais peut-être essayer la
combinaison opentracker et rTorrent, ce sera peut-être plus agréable
que l'horreur que j'ai actuellement.
[#4] En principe c'est très facile : on veut calculer Mt, pour M une transformation orthogonale directe, avec t variant de 0 à 1 : on calcule une matrice P de vecteurs-propres de sorte que D:=P·M·P−1 soit diagonale, et on calcule P−1·Dt·P pour différentes valeurs de t. Le problème est que M peut avoir la valeur-propre −1, auquel cas (−1)t a un problème de détermination (si on ne fait pas attention, on va se retrouver avec une matrice complexe et pas une matrice orthogonale réelle comme on le veut) : il faut donc trouver une base orthogonale de l'espace propre de −1 (et commencer par en trouver une base réelle, parce que les approximations numériques peuvent faire que le calcul initial donne des résultats complexes), puis fabriquer une matrice diagonale par blocs 2×2 de rotation d'angle 2π·t, bref, c'est lourdingue d'avoir quelque chose d'un peu robuste numériquement.