$Id: QuCalc.usage.fr 2.18 2005-12-11 20:26:47-05 dumais Exp $ Bienvenue à QuCalc, le module de calcul quantique pour Mathematica 4.0. Auteur: Paul Dumais, dumais@iro.umontreal.ca Documentation: Paul Dumais et Hugo Touchette «Mathematica» est une marque enregistrée par «Wolfram Research». QuCalc peut et doit être distribué gratuitement. Il doit être distribué sans modification, avec le nom des auteurs et le présent message. Pour obtenir de l'aide, tapez «?intro» ou «?list». Remarques générales au sujet de QuCalc ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ QuCalc est une bibliothèque de fonctions Mathematica qui permet de simuler et résoudre différents calculs reliés à l'informatique quantique. QuCalc a été développé par Paul Dumais du Laboratoire d'informatique théorique et quantique (Université de Montréal) et au Crypto and Quantum Info Lab (Université McGill). Une connaissance minimale de Mathematica est requise afin d'utiliser efficacement QuCalc. Il est utile de rappeler que Mathematica n'a pas de type de donnée pour les matrices: on doit utiliser une «liste de listes» pour représenter une matrice. Il est fortement recommandé d'exécuter et d'analyser les exemples suggérés dans les rubriques d'aide de QuCalc. Ils forment un complément essentiel au texte des rubriques. Le paradigme adopté est celui de la conversion en vecteurs et matrices. Les kets sont affichés en vecteurs colonnes de coordonnées dans la base canonique (i.e. la base dans laquelle l'opérateur de Pauli \sigma_z est diagonal), les transformations unitaires sont converties en matrices carrées, les états mixtes sont des matrices (de densité), etc. Les identificateurs définis lorsque que vous chargez QuCalc commencent tous par une minuscule. Par convention, Mathematica se réserve les identificateurs commençant par une majuscule. Certains identificateurs de Mathematica sont surdéfinis par QuCalc, par exemple «CircleTimes». Lorsque vous vous demandez comment interpréter un résultat x retourné par QuCalc, essayez FullForm[x]. Au moins, vous saurez comment QuCalc, lui, interprète ce que vous voyez. Si x semble plus compliqué qu'il ne devrait, essayez les divers outils de simplification offerts par Mathematica: Simplify[x], FullSimplify[x], TrigReduce[x], ComplexExpand[x], ... En général, les fonctions ne testent pas leurs entrées. Lorsqu'on donne des données non valides à une fonction, le résultat est indéfini: messages d'insulte de Mathematica, réponse farfelue, etc. Pour signaler une erreur ou un bogue, poser une question, émettre un commentaire ou suggérer de nouvelles fonctions, envoyez un courriel à Paul Dumais, dumais@iro.umontreal.ca. Pour obtenir de l'aide sur l'un des sujet suivants, entrez «?» suivi du nom du sujet. Informations générales: intro list Identificateurs Mathematica surdéfinis par QuCalc: CenterDot CircleDot CirclePlus CircleTimes Dot OverBar OverTilde \[Placeholder] Power Subscript SuperDagger Vee Wedge Types de données: ens ket schmidt sqo state supop unit Tests: ensQ ketQ sqoQ stateQ supopQ unitQ Constantes: bb84 cnot knot mm mmm not phim phip psim psip sigx sigy sigz wh xm xp ym yp zm zp Fonctions: anc band bits block bnot bor bscal bxor circuit cycle ctrl dag dotexp eigen eigenVal eigenVect entropy fgate fidelity fourier gate id kron krondiv kronexp ktrl lvNorm lvProd maxmix phase randomUnit regAnc regGet regOper regSet regState regTrout rotx roty rotz swap trout unvec vec Dot[x, y, ...] x.y. ... Donne le produit (composition, application) de ses arguments. Les arguments peuvent être des matrices, des «ket», des «unit», des «state», etc., pour autant que l'opération soit sensée. Notez que si u est un «unit» et r est un «state», alors u.r donne la matrice de densité obtenue par l'application de u sur l'état r. On ne doit pas entrer u.r.dag[u]. Essayez: dag[xp] . zp sigz . zm sigz . sigz wh . state[zm] mmm . xp wh . mm . wh Voir aussi: circuit, dotexp, kron OverBar[x] Donne le conjugé complexe de x. Synonyme de la fonction Mathematica «Conjugate». Cette fonction peut être entrée en notation 2D en tapant: «CTRL-&» «_». Essayez: OverBar[I] Voir aussi: dag anc[nA, nB, nC] Retourne une structure de type «sqo» représentant l'opération d'ajouter une ancille |0> de dimension nB entre des espaces de Hilbert de dimentions nA et nC. Essayez: r = anc[2,2,2] . ket["11"] eigen[r] Voir aussi: sqo, trout band[s1, s2, ...] Wedge[s1, s2, ...] Donne le «et» bit à bit de chaînes de bits, i.e. de listes de 0 et 1. Cette fonction peut être entrée en notation infixe avec l'opérateur Mathematica «Wedge», en tapant: «ESC» «^» «ESC». Essayez: band[{0,1,1,1}, {0,0,1,1}] Voir aussi: bits, bnot, bor, bscal, bxor bb84 Constante de type «ens» représentant un mélange statistique équiprobable des 4 états correspondant aux qubits 0 et 1 dans les base canoniques et diagonales. Essayez: bb84 wh . bb84 state[bb84] Voir aussi: ens, zp bits[x, n] Convertit l'entier x en binaire, i.e. une chaîne de n 0 et 1. Essayez: ket[bits[5,3]] ket[bits[5,4]] Voir aussi: band, bnot, bor, bscal, bxor block[u, v] Produit en bloc des transformations unitaires u et v. Essayez: block[wh, wh] Voir aussi: kron, unit bnot[s] OverTilde[s] Donne la négation d'une chaîne de bits, i.e. une liste de 0 et 1. Cette fonction peut être entrée en notation 2D en tapant: «CTRL-&» «~». Essayez: bnot[{0,1,0}] Voir aussi: band, bits, bor, bscal, bxor bor[s1, s2, ...] Vee[s1, s2, ...] Donne le «ou» bit à bit de chaînes de bits, i.e. de listes de 0 et 1. Cette fonction peut être entrée en notation infixe avec l'opérateur Mathematica «Vee», en tapant: «ESC» «v» «ESC». Essayez: bor[{0,1,1,1}, {0,0,1,1}] Voir aussi: band, bits, bnot, bscal, bxor bscal[s1, s2] CircleDot[s1, s2] Donne le produit scalaire booléen de s1 et s2, où s1 et s2 sont deux chaînes de bits, i.e. de deux listes de 0 et 1. Cette fonction peut être entrée en notation infixe avec l'opérateur Mathematica «CircleDot», un point entouré d'un cercle, en tapant: «ESC» «c» «.» «ESC». Essayez: bscal[{0,1,1,1}, {0,0,1,1}] Voir aussi: band, bits, bnot, bor, bxor bxor[s1, s2, ...] CirclePlus[s1, s2, ...] Donne le «ou» exclusif bit à bit de chaînes de bits, i.e. de listes de 0 et 1. Cette fonction peut être entrée en notation infixe avec l'opérateur Mathematica «CirclePlus», un plus entouré d'un cercle, en tapant: «ESC» «c» «+» «ESC». Essayez: bxor[{0,1,1,1}, {0,0,1,1}] Voir aussi: band, bits, bnot, bor, bscal circuit[m] Cette fonction effectue une série de compositions et de produits de Kronecker correspondant à la disposition des éléments de la matrice m. Les lignes de m représentent des fils quantiques sur lesquelles circulent de gauche à droite des qubits. Les colonnes de m représentent des portes quantiques. Par exemple, circuit[{{wh,id[]}, {not,not}}] retourne une structure de type «unit» équivalente à un circuit de deux portes sur deux fils quantiques. Le premier fil subit un Walsh-Hadamard suivi d'une négation. Le deuxième fil ne subit rien à la première porte et une négation à la deuxième porte. Pour construire une porte agissant de fa~con cohérente sur plusieurs qubits à la fois, on place la transformation voulue sur le dernier des fils visés. Les autres fils contiennent des nombres entiers qui décrivent une «liste chaînée» de fils, du haut vers le bas. Par exemple, circuit[{{id[]},{1},{3},{id[]},{id[]},{ctrl[ctrl[not]]}}] est une porte de Toffoli (ctrl[ctrl[not]]) agissant sur les 2e, 3e et 6e fils d'un circuit de 6 fils. Cette fonction est particulièrement utile lorsqu'elle est utilisée avec la notation 2D de Mathematica pour saisir les matrices («CTRL-RETURN» pour ajouter des lignes et «CTRL-,» pour ajouter des colonnes). Dans ce cas, le circuit apparaît exactement comme si on le dessinait au tableau. Notez aussi que le «Placeholder» de Mathematica, le petit carré qui apparaît en notation 2D, compte pour la transformation identité, il n'est donc pas nécessaire de remplir toutes les cases du circuit. Essayez: circuit[{{ 1, 1, 1 }, {cnot, knot, cnot}}] circuit[{{ 1, mm}, {cnot, mm}}] Voir aussi: Dot, Placeholder, ctrl, cycle, fgate, gate, kron, ktrl, swap phim phip psim psip xm xp ym yp zm zp Diverses constantes de type «ket». phim, phip, psim, psip: états de Bell. xm, xp, ym, yp, zm, zp: états purs situés aux pôles et aux quatre points cardinaux de l'équateur de la sphère de Poincaré. Essayez: cnot . kron[wh, id[]] . ket["00"] == phip Voir aussi: ket cnot knot not sigx sigy sigz wh Diverses constantes de type «unit». cnot: contrôle-not; knot: contrôle-not inversé; not: négation (sur 1 qubit); sigx, sigy, sigz: matrices de Pauli; wh: transformation de Walsh-Hadamard. Essayez: not == sigx Voir aussi: unit ctrl[u] ctrl[n, u] ktrl[u] Diverses formes de portes contrôlées. ctrl[u]: porte u contrôlée; ctrl[n,u]: porte u contrôlée par n fils; ktrl[u]: porte u contôlée et inversée. Essayez: ctrl[not] == cnot ctrl[2,not] ktrl[wh] Voir aussi: circuit, cnot, knot cycle[n,i,j] Transformation unitaire agissant sur n qubits qui accomplit une permutation circulaire des qubits i à j, du haut vers le bas, de 1 position. Essayez: c = cycle[3,1,3] c . ket["010"] == ket["001"] Power[c,2] == dag[c] Voir aussi: circuit dag[x] SuperDagger[x] Donne le conjugé-transposé de x. Cette fonction peut être entrée en notation 2D en tapant: «CTRL-^» «ESC» «d» «g» «ESC». Essayez: dag[wh] == wh dotexp[x, n] Power[x, n] x^n Retourne le résultat de x.x. ... .x (n fois). L'argument x peut être un «unit», un «supop», un «sqo», etc., pour autant que l'opération est sensée. Essayez: Simplify[rotx[t]^3] Voir aussi: Dot, kronexp eigen[r] eigenVal[r] eigenVect[r] Calcul de valeurs et vecteurs propres de l'état r. eigen[r]: retourne un ensemble statistique (structure de type «ens») constitué de paires valeur-vecteur propre. eigenVal[r]: retourne une matrice diagonale des valeurs propres de l'état r, sous forme de «state». eigenVect[r]: retourne une matrice unitaire dont les colonnes sont des vecteurs propres de r. Essayez: eigen[maxmix[2]] eigenVect[state[xp]] eigenVal[state[xp]] eigen[state[yp]] == yp eigen[bb84] eigen[state[bb84]] Voir aussi: ens, schmidt, state, unit ens[...] Type de donnée représentant un ensemble statistique d'états. Un «ens» valide contient une liste de paires {p,r} où p est un nombre entre 0 et 1 (une probabilité) et r est une donnée de type «ket» ou de type «state». La somme des p doit donner 1. Un «ens» contenant une liste triviale d'une seule paire {p,r} où p=1 est automatiquement converti au «state» (ou au «ket») r. Essayez: bb84 FullForm[bb84] mmm . xp FullForm[mmm . xp] eigen[maxmix[2]] FullForm[eigen[maxmix[2]]] Voir aussi: bb84, eigen, ensQ, ket, state, sqo entropy[r] Calcul (numérique) de l'entropie de von Neumann de l'état r. Essayez: entropy[state[bb84]] Voir aussi: fidelity fgate[m, n, f] Retourne une transformation unitaire agissant sur m+n qubits qui est équivalente à la fonction f sur des valeurs classiques. La fonction f est une «pure function» Mathematica. Elle prend en argument m bits et doit retourner une liste de n bits. On peut voir f comme une fonction (classique) de m bits vers n bits. Sur un état pur de la base canonique |x,y>, fgate laisse les m premiers qubits |x> inchangés, et transforme les n derniers qubits |y> en |y XOR f(x)>, où XOR représente le ou exclusif de deux chaînes de n bits. Essayez: fgate[1,1,({#})&] fgate[1,2,({(#), (#)})&] Voir aussi: circuit, gate fidelity[r1, r2] Calcul (numérique) de la fidélité de deux états (purs ou mixtes). Essayez: fidelity[zp, xp] Voir aussi: entropy fourier[m] Transformée de Fourier de dimension m. Essayez: fourier[4] Voir aussi: circuit gate[n, b, f] gate[n, f] Retourne une transformation unitaire de dimension b^n (2^n si b est omis) qui est décrite par la fonction f. La fonction f est une «pure function» Mathematica. Elle prend en argument n entiers entre 0 et b-1, et doit retourner un «ket». Pour des valeurs différentes de ses arguments, f doit retourner des kets qui sont orthogonaux. Essayez: gate[2,(ket[{#1, bxor[#1,#2]}])&] Voir aussi: circuit, fgate id[n] id[] La transformation unitaire identité sur n (1 si n est omis) qubits. Essayez: id[8] Voir aussi: circuit ket[...] Type de donnée représentant un état pur. Un «ket» valide contient une matrice de nombres de dimension n par 1. Tout «ket» valide doit être de norme 1. Notez que pour entrer une matrice en notation 2D, «CTRL-RETURN» permet de créer des lignes. Pour obtenir un «bra», utilisez dag[ket[...]]. Il n'y a pas de donnée de type «bra». L'expression ket[0] (ou ket[1]) est convertie de façon à représenter le bit 0 (ou 1) dans la base canonique d'un espace de Hilbert de dimension 2, i.e. un qubit. Pour obtenir un registre de plusieurs qubits on peut concaténer les bits dans une liste ou dans une chaîne de caractères. Pour obtenir un registre quantique dont la dimension est une puissance d'une base autre que 2, on peut ajouter en indice la valeur de la base, voir les exemples ci-dessous. Notez que la mise en indice «Subscript[x,y]» peut être entrée en notation 2D en tapant: «x» «CTRL-_» «y». Essayez: ket[0] FullForm[ket[0]] FullForm[ket[0][[1]]] ket[{0,1,0}] ket["010"] ket[Subscript[2, 3]] ket[Subscript[{0,2,0}, 3]] ket[Subscript["020", 3]] -zm ket[(1/Sqrt[2])(zp+zm)] Voir aussi: ketQ, phip, zp kron[x, y, ...] CircleTimes[x, y, ...] Donne le produit de Kronecker. Les arguments peuvent être des matrices, des «ket», des «unit», des «state», etc., pour autant que l'opération soit sensée. Cette fonction peut être entrée en notation infixe avec l'opérateur Mathematica «CircleTimes», un x entouré d'un cercle, en tapant: «ESC» «c» «*» «ESC». Notez que cet opérateur a une préséance moins forte que le produit «Dot», noté avec un point «.». Essayez: kron[zp, xp] kron[wh, cnot] kron[zm, maxmix[2]] kron[mm, mm] kron[mm, wh] Voir aussi: Dot, circuit, krondiv, kronexp krondiv[v, w] «Division de Kronecker». Retourne une matrice y de dimension N/n x 1, tel que v = kron[w, y], où v est une matrice de dimension N x 1 et w est une matrice de dimension n x 1. La fonction krondiv n'est implantée que pour les matrices Mathematica, pas pour les «ket» ou autres types de données de QuCalc. Notez que pour entrer une matrice colonne en notation 2D, «CTRL-RETURN» permet de créer des lignes. Essayez: krondiv[{{4},{5},{8},{10},{12},{15}}, {{1},{2},{3}}] Voir aussi: kron, vec, unvec kronexp[x, n] Produit de Kronecker itéré n fois. Essayez: kronexp[wh, 3] kronexp[mm, 3] kronexp[zp, 3] == ket["000"] Voir aussi: kron, dotexp lvProd[x, y] CenterDot[x, y] lvNorm[x] lvProd[x, y] retourne le produit de Liouville de x et y. Les arguments peuvent être deux «unit» ou deux «state». Le produit de Liouville de x et y est défini comme la trace du produit matriciel de dag[x] et y. Cette fonction peut être entrée en notation infixe avec l'opérateur Mathematica «CenterDot» en tapant: «ESC» «.» «ESC». Notez que cet opérateur a une préséance moins forte que le produit ordinaire «Dot», et également moins forte que le produit de kronecker «kron». lvNorm[x] retourne la norme de Liouville de x. L'argument peut être un «unit» ou un «state». La norme de Liouville de x est définie comme la racine carrée du produit de Liouville de x avec lui-même. Essayez: lvProd[sigx, sigz] lvNorm[maxmix[2]] Voir aussi: unit, state, Dot, kron, dag maxmix[n] Retourne l'état complètement mélangé de dimension n. Essayez: maxmix[3] Voir aussi: state mm Constante de type «supop» représentant une mesure dans la base canonique sur 1 qubit. Essayez: mm mm . xp mm . zp kron[mm, mm] mm . mm == mm wh . mm . wh Voir aussi: mmm, supop mmm Constante de type «sqo» représentant une mesure dans la base canonique sur 1 qubit. Essayez: mmm mmm . xp mmm . zp kron[mmm, id[]] mmm . mmm == mm Voir aussi: mm, sqo randomUnit[] Retourne une transformation unitaire de dimension 2 aléatoire. La distribution est basée sur des choix aléatoires d'angles d'Euler dans la sphère de Poincaré. Plus précisément, randomUnit[] est construit comme suit: phase[t1] . rotz[t2] . roty[t3] . rotz[t4] où t1, t2, t3 et t4 sont choisis uniformément et de façon indépendante entre 0 et 2 pi Essayez: randomUnit[] . zp Voir aussi: phase, unit phase[t] rotx[t] roty[t] rotz[t] phase[t] est un changement de phase global d'un angle t sur 1 qubit. rotx[t], roty[t] et rotz[t] sont des rotations d'un angle t autour de l'axe correspondant au nom de la fonction dans la sphère de Poincaré. Essayez: phase[t] rotx[t] roty[t] rotz[t] Voir aussi: unit, randomUnit schmidt[...] Type de donnée représentant une décomposition de Schmidt d'un état pur considéré comme un état bipartite. Un «schmidt» valide contient une liste de triplets {q, k1, k2} où les q sont les nombres de Schmidt, la somme des q^2 doit être égale à 1, les k1 (les k2) sont des données de type «ket» et forment une base orthonormale de Schmidt de l'espace d'Alice (de Bob). L'expression schmidt[n1, n2, k] où k est un «ket» de dimension n1*n2 est convertie de façon à représenter une décomposition de Schmidt de l'état k avec n1 et n2 pour les dimensions des espaces d'Alice et Bob. Un quatrième argument facultatif, de type «pure function» Mathematica, peut être ajouté à l'appel. Il s'agit d'une fonction de simplification qui sera utilisée à certaines étapes du calcul. L'appel schmidt[n1, n2, k] est équivalent à schmidt[n1, n2, k, (Simplify[#])&]. Essayez: s = schmidt[2, 2, phip] FullForm[s] FullForm[s[[1]]] ket[s] Voir aussi: ket, eigen sqo[...] Type de donnée représentant un «selective quantum operation» (SQO). Mathématiquement, un SQO est défini par une famille de matrices carrées ou rectangulaires A_{i,j}, 1<=i<=m, 1<=j<=k_i, de dimensions s par r, telles que la somme \sum A_{i,j}^\dagger A_{i,j} est égale à la matrice identité de dimension r par r. Un SQO est une opération quantique générale qui comprend comme cas particuliers la transformation unitaire, le superopérateur, le POVM («Positive Operator Valued Measure»), le «trace out» et l'ajout d'une ancille. Appliqué à un état mixte \rho quelconque de dimension r, le SQO décrit ci-dessus donne, avec probabilité p_i, l'état \sigma_i = (1/p_i) B_i de dimension s, où B_i = \sum_{j} A_{i,j} \rho A_{i,j}^\dagger p_i = tr(B_i). Il est rare que vous aurez à construire un SQO de toute pièce en travaillant avec QuCalc, sauf par exemple dans le cas où vous souhaitez mesurer un état selon des axes formant des angles de 60 degrés entre eux. Pour connaître les détails d'implantation d'un «sqo», analysez les exemples ci-dessous. En général, il préférable de combiner les «sqo» déjà définis par QuCalc avec des transformations unitaires, etc. Essayez: mmm FullForm[mmm] q = kron[mmm, mm] FullForm[q] mmm . xp Voir aussi: anc, mmm, sqoQ, supop, trout state[...] Type de donnée représentant un état mixte. Un «state» valide contient une matrice carrée de nombres. Cette matrice doit être hermitienne, positive et de trace 1. Notez que pour entrer une matrice en notation 2D, «CTRL-RETURN» permet de créer des lignes, et «CTRL-,» crée des colonnes. Les «state» représentant des états purs ne sont pas automatiquement convertis en «ket», utilisez «eigen» pour cela. Essayez: r = state[phip] FullForm[r] FullForm[r[[1]]] state[(1/2)(state[phip] + state[phim])] Voir aussi: eigen, ket, maxmix, stateQ supop[...] Type de donnée représentant un superopérateur. Un «supop» valide contient une liste de matrices carrées A_j telles que la somme \sum_j A_j^\dagger A_j égale la matrice identité. Appliqué à un état mixte \rho, le «supop» décrit ci-dessus donne l'état mixte \sum_{j} A_j \rho A_j^\dagger pourvu que les dimensions des matrices soient compatibles. Notez que pour entrer une matrice en notation 2D, «CTRL-RETURN» permet de créer des lignes, et «CTRL-,» crée des colonnes. Essayez: mm FullForm[mm] mm . xp Voir aussi: mm, sqo, supopQ swap[n, i, j] swap[] swap[n, i, j] est une transformation unitaire agissant sur n qubits et est telle que les qubits i et j sont intervertis. swap[] est équivalent à swap[2,1,2]. Essayez: c = swap[4,1,3] c . ket["0110"] == ket["1100"] Power[c,2] == id[4] Voir aussi: circuit ensQ[x] ketQ[x] sqoQ[x] stateQ[x] supopQ[x] unitQ[x] Fonctions booléennes testant la validité de x selon le type de donnée correspondant au nom de la fonction. Essayez: unitQ[wh] Simplify[unitQ[fourier[3]]] ketQ[ket[zp + zm]] Voir aussi: ens, ket, sqo, state, supop, unit trout[nA, nB, nC] Retourne une structure de type «sqo» représentant le «trace out» d'un espace de Hilbert de dimension nB entre des espaces de dimentions nA et nC. Essayez: trout[2, 2, 1] . phip trout[1, 2, 2] . phip trout[2, 4, 2] . ket["0110"] == state[ket["00"]] Voir aussi: sqo, anc unit[...] Type de donnée représentant une transformation unitaire. Un «unit» valide contient matrice carrée unitaire. Notez que pour entrer une matrice en notation 2D, «CTRL-RETURN» permet de créer des lignes, et «CTRL-,» crée des colonnes. Essayez: FullForm[sigz] FullForm[sigz[[1]]] I wh unit[Exp[(I Pi)/4] wh] unit[(1/Sqrt[3])(sigx + sigy + sigz)] Voir aussi: cnot, fourier, id, knot, not, phase, randomUnit, rotx, sigx, unitQ, wh vec[x] unvec[v, n] Mise en vecteur d'une matrice x, les colonnes de la matrice, prises de gauche à droite, sont concaténées de haut en bas. unvec[v, n] remet un vecteur v en matrice de n lignes. Ces fonctions ne sont implantées que pour les matrices Mathematica, pas pour les «ket» ou autres types de données de QuCalc. Notez que pour entrer une matrice en notation 2D, «CTRL-RETURN» permet de créer des lignes et «CTRL-,» crée des colonnes Essayez: v = vec[{{1,2,3},{4,5,6},{7,8,9},{10,11,12}}] FullForm[v] unvec[v, 2] Voir aussi: krondiv Mathematica permet la saisie des expressions mathématiques en notation bidimensionnelle ou «notation 2D». Cette fonctionnalité de Mathematica est particulièrement pratique pour la saisie des matrices, tapez: «CTRL-RETURN» pour créer des lignes, «CTRL-,» pour créer des colonnes. Mathematica fait apparaître des petites boîtes ou \[Placeholder], pour la saisie des données. Notamment, l'argument de la fonction «circuit» de QuCalc est une matrice, et elle peut donc être saisie de cette façon. Si une boîte est laissée vide, alors elle sera interprétée comme la porte quantique triviale, c'est-à-dire l'opérateur identité. Les autres raccourcis utiles reconnus par QuCalc sont les suivants: «CTRL-&» «_» : conjugaison complexe, «CTRL-&» «~» : négation d'une chaîne de bits, «CTRL-^» «ESC» «d» «g» «ESC» : conjugaison et transposition d'une matrice, «CTRL-^» : pour la saisie d'un exposant, «CTRL-_» : pour la saisie d'un indice. Voir aussi: circuit, OverBar, OverTilde, Power, Subscript, SuperDagger Les arguments de la fonction Mathematica Subscript, qui correspond à la mise en indice, peuvent être saisis en notation 2D en tapant «CTRL-_». QuCalc surdéfinit et utilise cette fonction à quelques endroits. Voir: ket, regOper, regState regSet[l] regGet[] regSet[l] définit les éléments de la liste l comme les noms des registres quantiques avec lesquelles les fonctions regOper, regState, regTrout et regAnc peuvent travailler. Les éléments de l peuvent être des identificateurs, des entiers, des chaînes de caractères, etc., mais pas des listes. Chaque registre correspond à un qubit et donc à un espace de Hilbert de dimension 2. Deux registres distincts ne peuvent pas porter le même nom. regGet[] retourne la liste des noms de registres telle que définie par le dernier appel à regSet. Essayez: regSet[{Alice, Bob}] regGet[] regSet[{z,y,x,1,2,3}] regGet[] Voir aussi: regAnc, regOper, regState, regTrout regOper[o,l] L'argument o est soit un «unit», un «supop» ou un «sqo», de dimension carrée, et l est une liste de registres préalablement déclarés par un appel à la fonction regSet. Le nombre de qubits sur lesquels o agit doit être égal au nombre d'éléments de l. L'appel regOper[o,l] retourne l'opérateur o agissant dans les registres donnés. L'opérateur identité est implicitement utilisé pour les registres définis par le dernier appel à regSet mais qui n'apparaissent pas dans l. Les appels Subscript[o, r1,r2,...] ou Subscript[o, {r1,r2,...}] sont équivalents à regOper[o, {r1,r2,...}]. Ces formes peuvent être saisies à l'aide de la notation 2D de Mathematica en tapant «CTRL-_». Essayez: regSet[{a,b}] regOper[cnot, {a,b}] regOper[cnot, {b,a}] regSet[{a,z,b}] regOper[cnot, {a,b}] regOper[cnot, {b,a}] Voir aussi: regAnc, regSet, regState, regTrout, sqo, supop, unit regState[s,l] L'argument s est soit un «ket», un «state» ou un «ens», et l est la liste des registres préalablement déclarés par un appel à la fonction regSet. La liste l doit contenir tous les registres déclarés par regSet, mais pas nécessairement dans le même ordre. Le nombre de qubits correspondant à l'état s doit être égal au nombre de registres. L'appel regState[s,l] retourne l'état s résidant dans les registres donnés par l. Les appels kron[Subscript[s1, r1,r2,...], Subscript[s2, t1,t2,...]] ou kron[Subscript[s1, {r1,r2,...}], Subscript[s2, {t1,t2,...}]] sont équivalents à regState[kron[s1,s2], {r1,r2,...,t1,t2,...}]. Ces formes peuvent être saisies à l'aide de la notation 2D de Mathematica en tapant «CTRL-_» pour produire les indices, et en tapant «ESC» «c» «*» «ESC» pour obtenir le symbole du produit de Kronecker en notation infixe. Cette syntaxe est notamment pratique si on la combine à la forme semblable de la fonction regOper, comme illustré ci-dessous. Dans les exemples suivants, il faut taper «CTRL-_» là où on a écrit «_», et il faut taper «ESC» «c» «*» «ESC» là où on a écrit «*», essayez: regSet[{Alice,Bob}] wh_Alice . not_Bob . (zp_Alice * zm_Bob) wh_Alice . not_Bob . (zm_Bob * zp_Alice) not_Bob . wh_Alice . (zp_Alice * zm_Bob) not_Bob . wh_Alice . (zm_Bob * zp_Alice) Voir aussi: ens, ket, kron, regAnc, regOper, regSet, regTrout, state regTrout[l] La liste l contient des noms de registres préalablement déclarés par un appel à la fonction regSet. L'appel regTrout[l] retourne un «sqo» correspondant au «trace out» des registres donnés, par rapport à l'espace ambiant défini par l'appel à regSet. Essayez: regSet[{1,2,3,4}] regTrout[{3,1}].ket["0101"] == state[ket["11"]] Voir aussi: regAnc, regOper, regSet, regState, sqo, trout regAnc[l] La liste l contient des noms de registres préalablement déclarés par un appel à la fonction regSet. L'appel regAnc[l] retourne un «sqo» correspondant à l'ajout d'une ancille initialisée à l'état «ket[0]». Les registres ancillaires sont ceux donnés par l et l'espace résultant est tel que défini par l'appel à regSet. Essayez: regSet[{1,2,3,4}] regAnc[{3,1}].ket["11"] == state[ket["0101"]] Voir aussi: anc, regOper, regSet, regState, regTrout, sqo