Aller au contenu

Spécification fondatrice · Architecture de référence

ArithSpec — un substrat arithmétique normatif pour réseaux impulsionnels bit-exacts

Tout le reste de ce projet repose sur une seule décision : calculer en arithmétique entière, définie au bit près, plutôt qu’en virgule flottante. Voici la spécification formelle de l’architecture ArithSpec, fondation normative de l’ensemble de cette recherche.

Recherche
Indépendante · EventCompute
Statut
Publié
Dépôt
13 juin 2026 · v1
DOI
10.5281/zenodo.20723008
Licence
CC BY 4.0 · accès ouvert
Spécification
v2.5 — gelée le 7 juin 2026

ARITHSPEC · LA DIFFÉRENCE EN UN REGARD

Même entrée. Deux façons d’obtenir un résultat.

La virgule flottante peut varier selon l’environnement d’exécution. ArithSpec fixe les règles du calcul au bit près : pour un même protocole, des implémentations conformes doivent produire le même résultat.

Virgule flottante

Écart possible

Même entrée, deux exécutions. Une variation numérique peut se propager.

Deux trajectoires en virgule flottanteLes tracés partent ensemble puis s’écartent dans cette illustration qualitative. Cela montre une possibilité, pas un résultat systématique ni une mesure.

Exécution AExécution BSorties potentiellement différentes

ArithSpec · calcul déterministe

Bit à bit

Même entrée, implémentations conformes : les trajectoires se superposent.

Deux trajectoires conformes à ArithSpecLes tracés des deux implémentations restent exactement superposés dans ce schéma, jusqu’au même résultat.

Tracés A/B superposésMême résultat bit à bit
  1. Entrée
  2. Calcul
  3. Arrondi
  4. Propagation
  5. Sortie
  6. Rejeu
  7. Comparaison

Schéma qualitatif, sans données mesurées. La divergence en virgule flottante n’est pas systématique ; son tracé est volontairement accentué pour rendre le phénomène lisible. Le tracé ArithSpec illustre le résultat prescrit pour des implémentations conformes.

Spécification et résultats de conformité : dépôt ArithSpec · DOI 10.5281/zenodo.20723008

Pourquoi supprimer la virgule flottante

Un même programme en virgule flottante, compilé deux fois avec des options différentes, peut produire deux résultats différents. Sur deux architectures processeur, c’est presque garanti. Les écarts sont minuscules — de l’ordre du milliardième — et parfaitement suffisants pour qu’un neurone franchisse son seuil d’un côté et pas de l’autre.

À partir de cet instant, les deux exécutions divergent, et plus rien n’est comparable. Vous ne pouvez plus rejouer une décision à l’identique, ni la comparer à une référence, ni démontrer à un auditeur que le système embarqué s’est comporté comme la version que vous avez validée.

ArithSpec supprime le problème à la racine : arithmétique entière en virgule fixe, arrondi au plus proche pair avec bits de garde, saturation explicite après arrondi, cinq indicateurs d’anomalie observables, sérialisation canonique. Aucune liberté n’est laissée à l’implémentation.

Ce que « normatif » veut dire

Le mot est employé au sens de l’ingénierie des standards, pas au sens philosophique. Une spécification normative prescrit un comportement exact et ne laisse aucune liberté d’implémentation dans les opérations arithmétiques.

Une implémentation conforme doit produire exactement le résultat spécifié — pas une approximation, pas un résultat « équivalent à ε près ». Exactement identique. Bit pour bit.

C’est une exigence beaucoup plus forte que l’accord numérique habituel. « Presque pareil » est interdit. La spécification v2.5 est gelée depuis le 7 juin 2026 : elle ne peut plus changer sans incrémenter la version majeure, précisément pour qu’une empreinte calculée aujourd’hui reste vérifiable dans dix ans.

La famille : Full, Lite, Mini

ArithSpec n’est pas un format unique mais une famille, pour couvrir du serveur au plus petit microcontrôleur. Chaque membre est bit-exact avec lui-même sur toute plateforme — mais les membres ne sont pas bit-exacts entre eux : ce sont des spécifications distinctes.

Membre Format Type natif Résolution Usage Statut
ArithSpec-Full INT64 · Q32.32 int64 / accumulateur int128 ≈ 2,3 × 10⁻¹⁰ Référence, PC et serveur Référence
ArithSpec-Lite INT32 · Q16.16 int32 / accumulateur int64 ≈ 1,5 × 10⁻⁵ Embarqué — Pi, Pico Certifiée
ArithSpec-Mini INT16 · Q8.8 int16 ≈ 3,9 × 10⁻³ Ultra-embarqué Travaux futurs
Ce que « Q16.16 » signifie

C’est une façon de ranger un nombre à virgule dans un entier. « Q16.16 » veut dire : 16 bits pour la partie entière, 16 bits pour la partie après la virgule. Le nombre 1,5 s’écrit alors comme l’entier 98 304 (soit 1,5 × 65 536). Toute l’arithmétique se fait sur ces entiers — et comme les entiers ne « flottent » jamais, deux machines obtiennent exactement le même résultat.

La formule qui décide de tout

Le cœur de la spécification, c’est la multiplication. C’est là que se joue la reproductibilité, parce que multiplier deux nombres à virgule fixe produit trop de bits, et qu’il faut en jeter une partie — donc arrondir. Un arrondi mal spécifié, et deux implémentations divergent. ArithSpec impose l’arrondi au plus proche pair (RNE), avec trois bits de contrôle nommés Garde, Arrondi, Sticky.

P = a × b   →   Q = P ≫ 16   puis arrondi RNE
Ple produit exact, sur le double de bits (aucune perte à ce stade)
Qle candidat au bon format, obtenu en décalant — mais il reste des bits
G, R, SGarde, Arrondi, Sticky : les bits jetés, qui décident de l’arrondi
RNEon arrondit au plus proche ; en cas d’égalité parfaite, vers le pair

La règle exacte (ArithSpec-Lite) : si le reste dépasse la moitié, on ajoute 1 ; s’il vaut exactement la moitié, on n’ajoute 1 que si Q est impair. Cette dernière clause — « ties-to-even » — est ce qui élimine le biais statistique de l’arrondi.

La même logique gouverne l’addition, qui sature au lieu de déborder : si le résultat sort de la plage, il est ramené à la borne et lève un indicateur d’anomalie, au lieu de repartir silencieusement à l’autre extrémité comme le ferait un entier machine ordinaire.

À retenir

Chaque opération est spécifiée jusqu’au bit d’arrondi près. C’est fastidieux — et c’est précisément ce qui manque à beaucoup de bibliothèques, où l’arrondi peut dépendre du compilateur. Cette précision maniaque est la fondation de tout le reste.

L’observable : une empreinte

Comment vérifier que deux implémentations sont d’accord, sans les comparer instruction par instruction ? On enregistre toute la trajectoire de calcul, on en prend le SHA-256, et on compare les empreintes. Deux implémentations sont conformes si, et seulement si, elles produisent la même.

C’est un test binaire, sans zone grise. Une empreinte identique prouve un accord bit pour bit sur des centaines de milliers d’opérations ; une empreinte différente le réfute. Il n’y a rien à négocier.

La chaîne de conformité

C’est le résultat le plus concret de ce travail, et le plus facile à réfuter : si une seule plateforme produisait une empreinte différente, la revendication tomberait.

Une seule empreinte, cinq exécutions200 000 opérations · même transcription · même SHA-256e1606bef1b34afe155adeace4aae7fd2aa22f0236ada22a61dd71631baae050aPCx86-64 · WindowsRust release2026-06-08identiqueRaspberry Pi 5aarch64 · LinuxRust release2026-06-08identiqueRaspberry Pi 5aarch64 · LinuxC++ g++ 142026-06-08identiquePCx86-64 · WindowsPython 3.112026-06-16identiqueRP2040 (Pico)thumbv6m · MicroPythonmatériel physique2026-06-16identiqueLe microcontrôleur (chemin MicroPython) exécute la MÊME arithmétique que le serveur, au bit près.Ce qui est certifié ici est le substrat arithmétique — pas un apprentissage embarqué.
Figure 1Le même protocole — 200 000 opérations, arrondi et saturation normatifs — exécuté cinq fois, sur trois machines, en trois langages et trois architectures processeur. Une seule et même empreinte SHA-256. La dernière ligne est un microcontrôleur physique, un Raspberry Pi Pico exécutant la chaîne par le chemin MicroPython, pas une simulation. Les deux dernières lignes (16 juin 2026) sont postérieures au dépôt de l’article (13 juin), dont la version publiée présente encore ce certificat physique comme un objectif ; le protocole et la trace seront publiés avec la prochaine version.
source : campagne du 8 au 16 juin 2026 (protocole non encore publié)
5exécutions, une empreintex86-64 · aarch64 · thumbv6m
3langages d’implémentationRust · C++ · Python (variante Lite ; la variante Full de l’article : C, Python, Rust)
200 000opérations par exécutionmultiplication, accumulation, décharge
Q16.16format de la variante embarquéeINT32, accumulateur INT64

Un second protocole, indépendant, mesure la même propriété à l’échelle d’un réseau : 1 000 neurones et 24 788 synapses exécutés sur x86-64 Windows et sur ARM64 natif (Raspberry Pi 5) produisent une empreinte identique pour la graine canonique et pour cinq graines supplémentaires (article E, §3.5). Sur chaque plateforme, une double exécution donne la même empreinte — le déterminisme intra-plateforme est établi avant toute comparaison inter-plateforme.

Le microcontrôleur physique

La dernière ligne du tableau mérite qu’on s’y arrête. Ce n’est pas un émulateur : c’est un Raspberry Pi Pico réel, une puce RP2040 à double cœur Cortex-M0+. Flashé en MicroPython, il a exécuté par ce chemin, le 16 juin 2026, trois jours après le dépôt de l’article, les 200 000 opérations et produit — au bit près — l’empreinte de référence e1606bef….

La distinction qui compte

Ce qui est certifié ici, c’est le substrat arithmétique : le calcul entier tourne bit-exact du serveur au microcontrôleur. Ce n’est pas un apprentissage embarqué, ni une boucle de décision embarquée : ceux-là restent des objectifs. La reproductibilité du calcul, elle, est établie sur du matériel réel, jusqu’au microcontrôleur Raspberry Pi Pico (chemin MicroPython).

Les modèles formels

Au-delà de la conformité mesurée, cinq modèles ont été soumis à une énumération exhaustive bornée avec l’outil TLC. Le terme est important : ce n’est pas une vérification formelle universelle, c’est l’exploration complète d’un espace d’états fini et déclaré.

Énumération exhaustive bornée — cinq modèles vérifiés par TLCDeux des cinq sont des contre-exemples attendus : ils montrent où la loi échoue vraimentK0CompositionLois de catégorie séquentielle sur la tranche Q16.1619 683 états✓ 5 invariantsArithSpecMonoidalStructure monoïdale et symétrie au niveau des valeurs1 679 616 états✓ 11 invariantsArithSpecTraceAssociativité stricte au niveau des traces343 états✓ 4 invariantsArithSpecLaxWitnessL’addition saturante n’est PAS associative : la loi est laxe— états△ contre-exempleArithSpecTrace (témoin)La concaténation de traces n’est pas commutative— états△ contre-exempleTLC2 v2.19 · OpenJDK Temurin 21 · énumération bornée, pas une preuve universelle
Figure 2Trois modèles passent sans erreur. Deux sont des contre-exemples volontaires — ils existent pour montrer où la structure algébrique échoue réellement. Les publier était un choix ; les taire aurait rendu le reste invérifiable. Seul le premier modèle figure dans l’article déposé ; les quatre autres viennent d’une note complémentaire, non encore publiée (juin 2026).
TLC2 v2.19, OpenJDK Temurin 21
Voir les données
Modèle États distincts Résultat
K0Composition 19 683 5 invariants, aucune erreur
ArithSpecMonoidal 1 679 616 (= 36⁴) 11 invariants, aucune erreur
ArithSpecTrace 343 (= 7³) 4 invariants, associativité stricte
ArithSpecLaxWitness — contre-exemple attendu : x=−1, y=1, z=65536
ArithSpecTrace (témoin) — contre-exemple attendu : concaténation non commutative

Périmètre et Limitations

Limitations architecturales

  • ArithSpec n’est pas une spécification d’efficacité. Elle prescrit l’exactitude reproductible, pas la vitesse ni la consommation.
  • L’exploration TLC est une énumération exhaustive bornée sur des espaces d’états finis déclarés — jamais une preuve universelle.
  • La conformité multi-plateforme porte sur le substrat arithmétique. Elle ne dit rien d’un apprentissage ou d’une boucle comportementale embarquée.
  • Sur le microcontrôleur, la conformité a été vérifiée par le chemin MicroPython ; les implémentations Rust, C++ et Python l’ont été sur PC ou sur Raspberry Pi 5 (figure 1).
  • ArithSpec-Mini (Q8.8) est un objectif déclaré, pas un résultat.

Reproductibilité algorithmique

Le dépôt public

Le document fondateur est déposé en accès ouvert, sous licence CC BY 4.0, en français et en anglais.

Deux identifiants, un seul document. 10.5281/zenodo.20723008 désigne le concept — il pointe toujours vers la dernière version. 10.5281/zenodo.20723009 désigne la version v1 précisément. Pour citer le travail, utilisez le premier.

Reproduire la conformité

Le protocole est court et entièrement spécifié : graine fixe, 200 000 itérations, multiplication normative Q16.16 avec arrondi GRS+RNE, addition saturante, décharge à seuil, transcription binaire de 14 octets par itération, puis SHA-256 de l’ensemble.

SEED     = 0x123456789abce900
N_OPS    = 200 000
THETA    = 1 << 15        (0,5 en Q16.16)
EMIT_CAP = 15

empreinte attendue :
e1606bef1b34afe155adeace4aae7fd2aa22f0236ada22a61dd71631baae050a

Une implémentation qui produit cette empreinte est conforme. Une implémentation qui en produit une autre ne l’est pas — et il n’y a rien à négocier.