ToolDingo

Simulateur d’ordinateur quantique

Écrivez un petit circuit quantique en JavaScript, simulez-le directement dans votre navigateur et observez son schéma, ses probabilités et son vecteur d’état. Vous pouvez aussi décrire un calcul de façon générale, par exemple une addition, et le voir transformé automatiquement en véritable circuit quantique réversible.

Modèle de bruit

Les véritables ordinateurs quantiques ne calculent pas parfaitement : les qubits sont extrêmement sensibles et perdent une partie de leur information, phénomène appelé décohérence, à chaque interaction indésirable avec leur environnement — chaleur, champs électromagnétiques ou qubits voisins. Les opérations de porte ne sont jamais parfaitement précises et même la lecture finale peut échouer. Le simulateur effectue par défaut un calcul idéal ; vous pouvez activer ici des modèles d’erreur courants et observer directement leurs effets dans les résultats.

S’applique à toutes les simulations de cette page, aussi bien aux exécutions de haut niveau qu’aux circuits écrits manuellement.
%
Par porte et qubit concerné, ou par bit lu pour le modèle de lecture. Choisissez une valeur adaptée au scénario que vous souhaitez explorer.

Code du programme

Décrivez un calcul avec quantum.add, quantum.subtract, quantum.multiply, quantum.divide ou quantum.random. Ctrl+Entrée lance la simulation. La documentation complète est accessible avec le bouton « Documentation ».

Documentation

Décrivez un calcul dans l’éditeur : un véritable circuit quantique est automatiquement généré puis simulé. Maximum : 4 000 caractères. Ctrl+Entrée lance la simulation.

FormuleDescriptionLimites
quantum.add({ a, b })Additionner deux nombresRésultat sur 4 bits max. (0 à 15)
quantum.subtract({ a, b })Soustractiona ≥ b, 4 bits max.
quantum.multiply({ a, b })MultiplicationFacteurs de 0 à 7 (3 bits)
quantum.divide({ a, b })Division (quotient + reste)b ≥ 1 ; limite stricte : bits(a)+bits(b)+bits(a÷b)+1 ≤ 10
quantum.random({ bits })Véritable nombre aléatoire quantique1 à 10 bits

Choisir un exemple

Code du circuit

Maximum : 4 000 caractères. Méthodes QuantumCircuit disponibles : x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (alias : toffoli), swap, measureAll, run. Ctrl+Entrée lance la simulation.

Choisir un exemple

Principes de base : comment cela fonctionne-t-il ?

Schéma d’une installation quantique : un ordinateur de contrôle dirige plusieurs faisceaux laser sur une table optique vers un qubit placé dans une chambre à vide.
De l’ordinateur de contrôle classique au qubit physique, en passant par les lasers et l’optique.

Du programme au qubit physique

Un véritable ordinateur quantique ne se résume pas à une puce. Une électronique de contrôle classique traduit le circuit en impulsions précises. Dans l’exemple, des lasers de refroidissement, de repompage, de manipulation du qubit et de lecture façonnent ces signaux sur une table optique et les dirigent vers une chambre à vide protégée. Ils y modifient et mesurent l’état du qubit, puis le résultat revient à l’ordinateur classique.

Qubit et états de base

Un bit classique vaut 0 ou 1. Un qubit peut en plus exister dans une superposition des deux états de base |0⟩ et |1⟩. Avec plusieurs qubits, tous les états de base s’écrivent sous forme de chaîne de bits, par exemple |10⟩ pour 2 qubits ; dans ce simulateur, q0 est toujours le bit de poids fort, à gauche.

Superposition

Un qubit en superposition comporte simultanément des composantes de plusieurs états de base. Ces composantes sont décrites par des amplitudes complexes ; le carré du module d’une amplitude donne la probabilité d’obtenir l’état correspondant lors d’une mesure.

La sphère de Bloch

L’état d’un qubit peut être représenté par une flèche dans une sphère : le pôle nord représente |0⟩, le pôle sud |1⟩et tous les points de l’équateur des superpositions de poids égaux. La phase détermine la direction de la flèche le long de l’équateur. Les portes de rotation rx, ryet rz font tourner la flèche autour de l’axe correspondant ; les portes de phase comme S et T la font tourner autour de l’axe Z. Avec des qubits intriqués, la flèche se contracte vers le centre : le qubit individuel ne possède alors plus d’état pur propre, ce qui rend l’intrication visible.

Mesure et tirs

measureAll() mesure tous les qubits simultanément et termine le circuit. Comme une mesure unique ne donne qu’un résultat aléatoire, le circuit est conceptuellement mesuré autant de fois qu’indiqué par les « tirs » avec run({ shots }), afin que la distribution des probabilités apparaisse sous forme d’histogramme. Les probabilités exactes sont aussi calculées directement depuis le vecteur d’état, indépendamment du hasard des tirs.

Porte de Hadamard

La porte de Hadamard h(q) fait passer un qubit d’un état déterminé,|0⟩ ou |1⟩, à une superposition de poids égaux de |0⟩ et |1⟩ , soit environ 50 % / 50 % lors de la mesure.

Portes de phase S et T

Les portes s(q) et t(q) ne modifient pas les probabilités de mesure d’un qubit isolé ; elles font seulement tourner la phase de l’amplitude |1⟩ , de 90° pour S et de 45° pour T. Leur effet n’apparaît qu’avec une superposition : entre deux portes de Hadamard, la phase détermine comment les amplitudes s’additionnent ou s’annulent par interférence. Les variantes adjointes sdg(q) et tdg(q) tournent en sens inverse et annulent S et T. Deux T équivalent à une S, et deux S à une Z.

CNOT et intrication conditionnelle

La porte CNOT cnot(control, target) inverse le qubit cible exactement lorsque le qubit de contrôle est dans l’état |1⟩. Si le contrôle se trouve auparavant en superposition, cela peut créer une intrication : les deux qubits ne peuvent alors plus être décrits indépendamment, comme dans l’état de Bell. Si le contrôle est au contraire dans un état de base déterminé, CNOT réalise seulement une inversion conditionnelle sans intrication. Toute porte CNOT ne crée donc pas automatiquement une intrication.

CZ, parente symétrique de CNOT

La porte CZ cz(a, b) inverse le signe de l’amplitude uniquement lorsque les deux qubits sont dans l’état |1⟩. Contrairement à CNOT, elle ne distingue ni contrôle ni cible et agit de la même façon sur les deux qubits ; elle est donc représentée par deux points reliés. CZ et CNOT peuvent être converties l’une dans l’autre : une CNOT est une CZ dont le qubit cible traverse une porte de Hadamard avant et après. CZ est un élément central de nombreux algorithmes, notamment la recherche de Grover.

État GHZ : l’intrication à trois

L’état GHZ, nommé d’après Greenberger, Horne et Zeilinger, étend le principe de l’état de Bell à trois qubits : une porte de Hadamard suivie de deux CNOT intrique les trois qubits, de sorte que la mesure ne donne que |000⟩ ou |111⟩ , jamais une chaîne mixte. Aucun qubit ne possède plus son propre état ; l’information réside exclusivement dans la corrélation commune.

Algorithme de Deutsch : le plus petit avantage quantique

L’algorithme de Deutsch répond, avec une seule évaluation d’un oracle inconnu, à une question qui en demanderait deux à un ordinateur classique : la fonction est-elle constante ou équilibrée ? L’astuce consiste à envoyer l’entrée dans l’oracle en superposition ; grâce aux interférences, la réponse est ensuite encodée sans ambiguïté dans le qubit d’entrée. Ce principe, le retour de phase, est au cœur de presque tous les algorithmes quantiques.

Recherche de Grover : amplifier les amplitudes

La recherche de Grover trouve une entrée marquée dans un ensemble non trié avec beaucoup moins de requêtes qu’une méthode classique. Un oracle marque l’état recherché par une inversion de phase, ici avec une porte CZ, puis l’opérateur de diffusion amplifie cette amplitude au détriment des autres. Avec 2 qubits, une seule itération suffit pour mesurer la bonne réponse avec une probabilité de 100 %.

Addition réversible : de quantum.add() au circuit

L’éditeur de programme traduit quantum.add({ a, b }) en un circuit de portes X, CNOT et CCNOT (Toffoli) qui reproduit l’addition classique de façon entièrement réversible : chaque porte peut être annulée exactement, car aucune information n’est supprimée. Une CCNOT,ccnot(c1, c2, target), inverse la cible uniquement lorsque les deux contrôles valent |1⟩ . Ce composant suffit à reconstruire tout circuit classique de manière réversible, y compris un additionneur complet avec retenue. Les entrées A et B sont d’abord initialisées dans des états de base déterminés avec des portes X. Comme tout le circuit ne traverse ainsi que des états déterminés, la mesure finale produit un seul résultat avec une probabilité de 100 % : la somme classique correcte. Voilà pourquoi quantum.add() donne un résultat déterministe malgré la simulation quantique.

Soustraction : l’addition à l’envers

Chaque porte d’un circuit quantique étant exactement inversible, le circuit additionneur complet peut être exécuté à l’envers : l’addition devient alors une soustraction. quantum.subtract({ a, b }) utilise précisément les portes de l’additionneur dans l’ordre inverse et calcule ainsi a − b. Ce n’est pas un artifice, mais le principe fondamental du calcul réversible : aucune étape ne détruit d’information et chacune peut être annulée. Cette version exige a ≥ b afin d’éviter un résultat négatif.

Multiplication : quantum.multiply()

La multiplication utilise les mêmes composants réversibles que l’addition. Selon la méthode posée, le facteur a est ajouté plusieurs fois à des positions décalées correspondant aux bits à 1 du facteur b. Chaque addition partielle est le même additionneur réversible à propagation de retenue, laquelle passe chaque fois au bit suivant du produit. Comme le registre de résultat grandit avec le produit, les facteurs sont limités ici à 3 bits, de 0 à 7 ; ainsi seulement, facteur, produit et qubit de retenue tiennent ensemble dans les 10 qubits du simulateur.

Division : quantum.divide()

La division n’utilise elle aussi que des composants réversibles : quantum.divide({ a, b }) réalise une division posée à partir de soustractions réversibles et décalées du diviseur dans le registre du reste ; le résultat contient le quotient et le reste (a = quotient · b + remainder). Le dividende, le diviseur, le quotient et un qubit d’emprunt devant tenir dans 10 qubits, la division est l’opération la plus contrainte : bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 , avec un diviseur b ≥ 1. Si les données dépassent cette capacité, l’éditeur le signale au lieu de calculer.

Véritable hasard : quantum.random()

Les ordinateurs classiques ne peuvent pas produire de véritable hasard : leurs « nombres aléatoires » proviennent d’algorithmes déterministes, donc pseudo-aléatoires. Un ordinateur quantique le peut : quantum.random({ bits }) place chaque bit dans une superposition 50/50 au moyen d’une porte de Hadamard, et seule la mesure décide, de façon fondamentalement imprévisible, de la valeur obtenue. Sur un matériel quantique réel, le hasard est physique ; ce simulateur l’imite avec le générateur pseudo-aléatoire de votre navigateur.

Simulateur et matériel quantique réel

Ce simulateur calcule exactement l’état au moyen de nombres à virgule flottante classiques dans votre navigateur. Cela n’est possible que parce qu’il se limite à de très petits circuits de 10 qubits au maximum. Les véritables ordinateurs quantiques utilisent des qubits physiques, sont sujets aux erreurs, à la décohérence et au bruit, et ne montrent leur avantage qu’avec des circuits beaucoup plus grands qu’il devient impraticable de simuler classiquement. Cet outil est pédagogique, ce n’est pas un véritable processeur quantique.

Questions fréquentes

S’agit-il d’un véritable ordinateur quantique ?
Non. Cet outil est un simulateur classique de vecteur d’état qui calcule exactement les propriétés mathématiques d’un petit circuit quantique, jusqu’à 10 qubits, au moyen de nombres à virgule flottante dans votre navigateur. Le matériel quantique réel utilise des qubits physiques et fonctionne de manière fondamentalement différente.
À quel bit correspond q0 dans une chaîne comme "10" ?
q0 est toujours le bit de poids fort, situé à gauche. Avec 2 qubits, x(0) crée donc l’état |10⟩, et non |01⟩.
Que signifie le nombre de tirs ?
Les tirs représentent le nombre de mesures simulées répétées, de 1 à 10 000. Chaque tir sélectionne aléatoirement un résultat de mesure selon la distribution de probabilité exacte du vecteur d’état. Les probabilités exactes ne dépendent pas du hasard et sont affichées séparément.
Pourquoi certains exemples affichent-ils un message d’erreur ?
Le périmètre de cette première version autorise exactement un circuit et un seul appel à run() après measureAll(). Les indices de qubit incorrects, les portes placées après measureAll(), les angles ou nombres de tirs invalides et les erreurs de syntaxe sont rejetés avec un message compréhensible.
À quoi servent les portes Hadamard, X et CNOT ?
X échange |0⟩ et |1⟩. Hadamard transforme un état de base en une superposition de poids égaux. CNOT inverse sa cible uniquement lorsque le contrôle vaut |1⟩ et peut créer une intrication lorsqu’elle est associée à une superposition.
Comment l’intrication est-elle créée ?
Un exemple applique Hadamard au premier qubit, puis CNOT à un second. Les qubits ne peuvent alors plus être décrits indépendamment, et la mesure produit des résultats corrélés comme |00⟩ ou |11⟩.