Une à deux fois par nuit je me réveille en sueur froide avec une grande question existentielle dans la tête. En général c'est plus ou moins des histoires de zombie post-apocalypteek. Ou du hack. Des trucs fun quoi. Eh bien en ce moment c'est plutôt des questions de math et de programmation(*). Encore plus fun !
Ma question de cette nuit
Peut-on fabriquer une condition avec juste des opérations arithméteeks ?
Réponse courte : oui, on peut
Réponse longue comme... la fin de 2001 l'Odyssée de l'espace
Pour commencer l'énoncé mérite quelque précision(**). Par opérations arithméteeks j'entends des opérations usuelles sur les nombres. Par « condition » j'entends une structure du style : SI <gnagnagna> ALORS <pouetpouet>.
La partie compliquée à réaliser c'est le <gnagnagna>. Quand on y pense il s'agit d'une fonction définie partout mais pas continue. On peut d'ailleurs concentrer la difficulté en un point précis et transformer l'énoncé en : fabriquer une fonction z(x) qui s'annule seulement quand x égale zéro. On va même épurer le problème en demandant que la fonction z soit « normalisée » c'est-à-dire : SI x=0 ALORS z(x)=0 SINON z(x)=1. Perso, si on me donne ça comme fonction, je sais réaliser n'importe quelle condition sans trop me fouler. Et du coup j'aurais moyen de me rendormir.
Des fonctions z de ce type là on en rencontre à tous les coins de rues. Enfin disons dans le moindre bout de code. Et c'est très facile à définir en utilisant une définition par cas(***).
Seulement voilà, la définition par cas n'est pas arithméteek. Mais alors pas arithméteek du tout. En gros elle ne travaille pas vraiment sur les nombres comme le font par exemple l'addition ou la multiplication. Du coup va falloir réfléchir deux minutes. Petite précision tant que j'y suis, je me suis interdit de chercher la solution direct sur Internet (en fait c'est surtout que je ne savais pas trop quoi googler comme question). Du coup, obligé de chercher dans ma tête. Tu verrais le foutoir là-dedans on dirait ma piaule !
Bricole ta fonction avec Metallurgeek
D'abord la fonction devrait être symétreek autour de zéro. Ben ouais, y pas de raison que ça marche moins bien pour les négatifs que pour les positifs, hein ? Après j'ai vaguement l'idée qu'il faudrait diviser un truc par un autre de manière à empêcher la fonction de croitre arbitrairement. Et pour que la fonction s'annule en zéro une puissance paire de x au numérateur pourrait l'affaire. Au dénominateur il faut un truc qui ne s'annule pas. Parce que quand on annule un dénominateur ça peut créer une vergence dans la force. Tant qu'on y est ça serait bien que le dénominateur soit un poil plus grand que le numérateur. Comme ça la fonction resterait gentiment inférieure à un. Dernier truc, j'ai besoin d'une primitive fondamentalement pas continue. C'est là que j'utilise la fonction plancher. Ça on ne va pas y couper parce que je sais trop fabriquer du discontinu avec que du continu. Reste plus qu'à inverser les retro-gradateurs de tension, stabiliser l'endo-phase éthylo-plasmateek, refroidir la planète, et ça devrait le faire.
Et c'est ainsi qu'on arrive à la fonction indiquée au début de l'article. Clairement je ne suis pas le premier à avoir (re)trouvé ça. À mon avis c'est déjà dessiné sur les grottes de Lascaux (Dordogne) ou sur les grottes de La Squaw (Wyoming). Mais quand même je suis content, j'ai mitonné ma petite fonction et je peux me rendormir du sommeil du juste.
Epilogue : à quoi ça sert ?
- Dans la vraie vie, ça sert à se rendormir.
- En hacking, ça sert à coder une condition dans un payload injecté sans avoir besoin du caractère espace.
- En science fiction, ça sert à sauver les colons humains dans un vaisseau spatial dont l'IA a été contaminé par une intelligence mi-belliqueuse mi-hostile mi-traillette. Le seul module qu'on contrôle encore c'est le module arithméteek parce qu'il est de fabrication française et donc trop anteek pour être vérolé.
Epicologue : et les nombres complexes alors ?
Ben ouais, si x = i, le dénominateur il s'annule quand même ! Du coup, nouveau réveil en sueur froide...
(*) J'ai déjà ma question pour la prochaine nuit, et ce sera de la grammaire. Faut-il dire « en ce moment c'est plutôt des questions » ou « en ce moment ce sont plutôt des questions. » L'usage de base penche pour la solution 1, la doxa penche pour la solution 2. La bonne solution est surement la 3. Ou la 4.
(**) Quelque précision ? quelques précisions ?