(* $Id: QuCalc.m.pre 2.26 2005-12-14 20:31:30-05 dumais Exp $ *) (* Auteur: Paul Dumais dumais@iro.umontreal.ca Département d'informatique et recherche opérationnelle Université de Montréal CP 6128, succ. Centre-Ville Montréal, QC H3C 3J7 Canada "\[LeftGuillemet]Mathematica\[RightGuillemet] est une marque enregistr\[EAcute]e par \[LeftGuillemet]Wolfram Research\[RightGuillemet].\nQuCalc peut et doit \[EHat]tre distribu\[EAcute] gratuitement. Il doit \[EHat]tre\ndistribu\[EAcute] sans modification, avec le nom des auteurs et le pr\[EAcute]sent\nmessage." *) BeginPackage["QuCalc`", {"LinearAlgebra`Orthogonalization`"}] rcsRevision = StringReplace["$Revision: 2.26 $", "$" -> ""]; rcsDate = StringReplace["$Date: 2005-12-14 20:31:30-05 $", "$" -> ""]; Print[ "Bienvenue \[AGrave] QuCalc, le module de calcul quantique pour Mathematica 4.0.\n\nAuteur: Paul Dumais, dumais@iro.umontreal.ca\nDocumentation: Paul Dumais et Hugo Touchette", "\n\n", "\[LeftGuillemet]Mathematica\[RightGuillemet] est une marque enregistr\[EAcute]e par \[LeftGuillemet]Wolfram Research\[RightGuillemet].\nQuCalc peut et doit \[EHat]tre distribu\[EAcute] gratuitement. Il doit \[EHat]tre\ndistribu\[EAcute] sans modification, avec le nom des auteurs et le pr\[EAcute]sent\nmessage.", "\n\n", rcsRevision, "\n", rcsDate, "\n\n", "Pour obtenir de l'aide, tapez \[LeftGuillemet]?intro\[RightGuillemet] ou \[LeftGuillemet]?list\[RightGuillemet]." ]; $PrePrint = MatrixForm; intro::usage = "Remarques g\[EAcute]n\[EAcute]rales au sujet de QuCalc\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nQuCalc est une biblioth\[EGrave]que de fonctions Mathematica qui permet de\nsimuler et r\[EAcute]soudre diff\[EAcute]rents calculs reli\[EAcute]s \[AGrave] l'informatique\nquantique. QuCalc a \[EAcute]t\[EAcute] d\[EAcute]velopp\[EAcute] par Paul Dumais du Laboratoire\nd'informatique th\[EAcute]orique et quantique (Universit\[EAcute] de Montr\[EAcute]al) et au\nCrypto and Quantum Info Lab (Universit\[EAcute] McGill).\n\nUne connaissance minimale de Mathematica est requise afin d'utiliser\nefficacement QuCalc. Il est utile de rappeler que Mathematica n'a pas\nde type de donn\[EAcute]e pour les matrices: on doit utiliser une \[LeftGuillemet]liste de\nlistes\[RightGuillemet] pour repr\[EAcute]senter une matrice. Il est fortement recommand\[EAcute]\nd'ex\[EAcute]cuter et d'analyser les exemples sugg\[EAcute]r\[EAcute]s dans les rubriques\nd'aide de QuCalc. Ils forment un compl\[EAcute]ment essentiel au texte des\nrubriques.\n\nLe paradigme adopt\[EAcute] est celui de la conversion en vecteurs et\nmatrices. Les kets sont affich\[EAcute]s en vecteurs colonnes de coordonn\[EAcute]es\ndans la base canonique (i.e. la base dans laquelle l'op\[EAcute]rateur de\nPauli \\sigma_z est diagonal), les transformations unitaires sont\nconverties en matrices carr\[EAcute]es, les \[EAcute]tats mixtes sont des matrices (de\ndensit\[EAcute]), etc.\n\nLes identificateurs d\[EAcute]finis lorsque que vous chargez QuCalc commencent\ntous par une minuscule. Par convention, Mathematica se r\[EAcute]serve les\nidentificateurs commen\[CCedilla]ant par une majuscule. Certains\nidentificateurs de Mathematica sont surd\[EAcute]finis par QuCalc, par exemple\n\[LeftGuillemet]CircleTimes\[RightGuillemet].\n\nLorsque vous vous demandez comment interpr\[EAcute]ter un r\[EAcute]sultat x retourn\[EAcute]\npar QuCalc, essayez FullForm[x]. Au moins, vous saurez comment\nQuCalc, lui, interpr\[EGrave]te ce que vous voyez. Si x semble plus compliqu\[EAcute]\nqu'il ne devrait, essayez les divers outils de simplification offerts\npar Mathematica: Simplify[x], FullSimplify[x], TrigReduce[x],\nComplexExpand[x], ...\n\nEn g\[EAcute]n\[EAcute]ral, les fonctions ne testent pas leurs entr\[EAcute]es. Lorsqu'on\ndonne des donn\[EAcute]es non valides \[AGrave] une fonction, le r\[EAcute]sultat est\nind\[EAcute]fini: messages d'insulte de Mathematica, r\[EAcute]ponse farfelue, etc.\n\nPour signaler une erreur ou un bogue, poser une question, \[EAcute]mettre un\ncommentaire ou sugg\[EAcute]rer de nouvelles fonctions, envoyez un courriel \[AGrave]\nPaul Dumais, dumais@iro.umontreal.ca."; list::usage = "Pour obtenir de l'aide sur l'un des sujet suivants, entrez \[LeftGuillemet]?\[RightGuillemet] suivi\ndu nom du sujet.\n\nInformations g\[EAcute]n\[EAcute]rales:\n\tintro list\n\nIdentificateurs Mathematica surd\[EAcute]finis par QuCalc:\n\tCenterDot CircleDot CirclePlus CircleTimes\n\tDot OverBar OverTilde \\[Placeholder]\n\tPower Subscript SuperDagger Vee\n\tWedge\n\nTypes de donn\[EAcute]es:\n\tens ket schmidt sqo\n\tstate supop unit\n\nTests:\n\tensQ ketQ sqoQ stateQ\n\tsupopQ unitQ\n\nConstantes:\n\tbb84 cnot knot mm\n\tmmm not phim phip\n\tpsim psip sigx sigy\n\tsigz wh xm xp\n\tym yp zm zp\n\nFonctions:\n\tanc band bits block\n\tbnot bor bscal bxor\n\tcircuit cycle ctrl dag\n\tdotexp eigen eigenVal eigenVect\n\tentropy fgate fidelity fourier\n\tgate id kron krondiv\n\tkronexp ktrl lvNorm lvProd\n\tmaxmix phase randomUnit regAnc\n\tregGet regOper regSet regState\n\tregTrout rotx roty rotz\n\tswap trout unvec vec"; CenterDot::usage = "lvProd[x, y]\nCenterDot[x, y]\nlvNorm[x]\n\tlvProd[x, y] retourne le produit de Liouville de x et y. Les\n\targuments peuvent \[EHat]tre deux \[LeftGuillemet]unit\[RightGuillemet] ou deux \[LeftGuillemet]state\[RightGuillemet]. Le\n\tproduit de Liouville de x et y est d\[EAcute]fini comme la trace du\n\tproduit matriciel de dag[x] et y.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CenterDot\[RightGuillemet] en tapant:\n\t\[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet].\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet]. Notez que cet op\[EAcute]rateur a une pr\[EAcute]s\[EAcute]ance\n\tmoins forte que le produit ordinaire \[LeftGuillemet]Dot\[RightGuillemet], et \[EAcute]galement moins\n\tforte que le produit de kronecker \[LeftGuillemet]kron\[RightGuillemet].\n\n\tlvNorm[x] retourne la norme de Liouville de x. L'argument\n\tpeut \[EHat]tre un \[LeftGuillemet]unit\[RightGuillemet] ou un \[LeftGuillemet]state\[RightGuillemet]. La norme de Liouville de x\n\test d\[EAcute]finie comme la racine carr\[EAcute]e du produit de Liouville de\n\tx avec lui-m\[EHat]me.\n\n\tEssayez:\n\t\tlvProd[sigx, sigz]\n\t\tlvNorm[maxmix[2]]\n\n\tVoir aussi:\n\t\tunit, state, Dot, kron, dag"; CircleDot::usage = "bscal[s1, s2]\nCircleDot[s1, s2]\n\tDonne le produit scalaire bool\[EAcute]en de s1 et s2, o\[UGrave] s1 et s2\n\tsont deux cha\[IHat]nes de bits, i.e. de deux listes de 0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CircleDot\[RightGuillemet], un point entour\[EAcute] d'un\n\tcercle, en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet].\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tbscal[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tband, bits, bnot, bor, bxor"; CirclePlus::usage = "bxor[s1, s2, ...]\nCirclePlus[s1, s2, ...]\n\tDonne le \[LeftGuillemet]ou\[RightGuillemet] exclusif bit \[AGrave] bit de cha\[IHat]nes de bits, i.e. de\n\tlistes de 0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CirclePlus\[RightGuillemet], un plus entour\[EAcute] d'un\n\tcercle, en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet]+\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tbxor[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tband, bits, bnot, bor, bscal"; CircleTimes::usage = "kron[x, y, ...]\nCircleTimes[x, y, ...]\n\tDonne le produit de Kronecker. Les arguments peuvent \[EHat]tre des\n\tmatrices, des \[LeftGuillemet]ket\[RightGuillemet], des \[LeftGuillemet]unit\[RightGuillemet], des \[LeftGuillemet]state\[RightGuillemet], etc., pour\n\tautant que l'op\[EAcute]ration soit sens\[EAcute]e.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CircleTimes\[RightGuillemet], un x entour\[EAcute] d'un\n\tcercle, en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet]*\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet]. Notez que cet\n\top\[EAcute]rateur a une pr\[EAcute]s\[EAcute]ance moins forte que le produit \[LeftGuillemet]Dot\[RightGuillemet], not\[EAcute]\n\tavec un point \[LeftGuillemet].\[RightGuillemet].\n\n\tEssayez:\n\t\tkron[zp, xp]\n\t\tkron[wh, cnot]\n\t\tkron[zm, maxmix[2]]\n\t\tkron[mm, mm]\n\t\tkron[mm, wh]\n\n\tVoir aussi:\n\t\tDot, circuit, krondiv, kronexp"; Dot::usage = "Dot[x, y, ...]\nx.y. ...\n\tDonne le produit (composition, application) de ses arguments.\n\tLes arguments peuvent \[EHat]tre des matrices, des \[LeftGuillemet]ket\[RightGuillemet], des\n\t\[LeftGuillemet]unit\[RightGuillemet], des \[LeftGuillemet]state\[RightGuillemet], etc., pour autant que l'op\[EAcute]ration soit\n\tsens\[EAcute]e.\n\n\tNotez que si u est un \[LeftGuillemet]unit\[RightGuillemet] et r est un \[LeftGuillemet]state\[RightGuillemet], alors u.r\n\tdonne la matrice de densit\[EAcute] obtenue par l'application de u sur\n\tl'\[EAcute]tat r. On ne doit pas entrer u.r.dag[u].\n\n\tEssayez:\n\t\tdag[xp] . zp\n\t\tsigz . zm\n\t\tsigz . sigz\n\t\twh . state[zm]\n\t\tmmm . xp\n\t\twh . mm . wh\n\n\tVoir aussi:\n\t\tcircuit, dotexp, kron"; OverBar::usage = "OverBar[x]\n\tDonne le conjug\[EAcute] complexe de x. Synonyme de la fonction\n\tMathematica \[LeftGuillemet]Conjugate\[RightGuillemet].\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation 2D en tapant:\n\t\[LeftGuillemet]CTRL-&\[RightGuillemet] \[LeftGuillemet]_\[RightGuillemet].\n\n\tEssayez:\n\t\tOverBar[I]\n\n\tVoir aussi:\n\t\tdag"; OverTilde::usage = "bnot[s]\nOverTilde[s]\n\tDonne la n\[EAcute]gation d'une cha\[IHat]ne de bits, i.e. une liste de 0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation 2D en tapant:\n\t\[LeftGuillemet]CTRL-&\[RightGuillemet] \[LeftGuillemet]~\[RightGuillemet].\n\n\tEssayez:\n\t\tbnot[{0,1,0}]\n\n\tVoir aussi:\n\t\tband, bits, bor, bscal, bxor"; \[Placeholder]::usage = "Mathematica permet la saisie des expressions math\[EAcute]matiques en notation\nbidimensionnelle ou \[LeftGuillemet]notation 2D\[RightGuillemet]. Cette fonctionnalit\[EAcute] de\nMathematica est particuli\[EGrave]rement pratique pour la saisie des matrices,\ntapez:\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] pour cr\[EAcute]er des lignes,\n\t\[LeftGuillemet]CTRL-,\[RightGuillemet] pour cr\[EAcute]er des colonnes.\nMathematica fait appara\[IHat]tre des petites bo\[IHat]tes ou \\[Placeholder], pour\nla saisie des donn\[EAcute]es.\n\nNotamment, l'argument de la fonction \[LeftGuillemet]circuit\[RightGuillemet] de QuCalc est une\nmatrice, et elle peut donc \[EHat]tre saisie de cette fa\[CCedilla]on. Si une bo\[IHat]te\nest laiss\[EAcute]e vide, alors elle sera interpr\[EAcute]t\[EAcute]e comme la porte quantique\ntriviale, c'est-\[AGrave]-dire l'op\[EAcute]rateur identit\[EAcute].\n\nLes autres raccourcis utiles reconnus par QuCalc sont les suivants:\n\t\[LeftGuillemet]CTRL-&\[RightGuillemet] \[LeftGuillemet]_\[RightGuillemet] : conjugaison complexe,\n\t\[LeftGuillemet]CTRL-&\[RightGuillemet] \[LeftGuillemet]~\[RightGuillemet] : n\[EAcute]gation d'une cha\[IHat]ne de bits,\n\t\[LeftGuillemet]CTRL-^\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]d\[RightGuillemet] \[LeftGuillemet]g\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet] : conjugaison et transposition\n\td'une matrice,\n\t\[LeftGuillemet]CTRL-^\[RightGuillemet] : pour la saisie d'un exposant,\n\t\[LeftGuillemet]CTRL-_\[RightGuillemet] : pour la saisie d'un indice.\n\nVoir aussi:\n\tcircuit, OverBar, OverTilde, Power, Subscript, SuperDagger"; Power::usage = "dotexp[x, n]\nPower[x, n]\nx^n\n\tRetourne le r\[EAcute]sultat de x.x. ... .x (n fois). L'argument x\n\tpeut \[EHat]tre un \[LeftGuillemet]unit\[RightGuillemet], un \[LeftGuillemet]supop\[RightGuillemet], un \[LeftGuillemet]sqo\[RightGuillemet], etc., pour autant\n\tque l'op\[EAcute]ration est sens\[EAcute]e.\n\n\tEssayez:\n\t\tSimplify[rotx[t]^3]\n\n\tVoir aussi:\n\t\tDot, kronexp"; Subscript::usage = "Les arguments de la fonction Mathematica Subscript, qui correspond \[AGrave]\nla mise en indice, peuvent \[EHat]tre saisis en notation 2D en tapant\n\[LeftGuillemet]CTRL-_\[RightGuillemet].\n\nQuCalc surd\[EAcute]finit et utilise cette fonction \[AGrave] quelques endroits.\n\nVoir:\n\tket, regOper, regState" SuperDagger::usage = "dag[x]\nSuperDagger[x]\n\tDonne le conjug\[EAcute]-transpos\[EAcute] de x.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation 2D en tapant:\n\t\[LeftGuillemet]CTRL-^\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]d\[RightGuillemet] \[LeftGuillemet]g\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tdag[wh] == wh"; Vee::usage = "bor[s1, s2, ...]\nVee[s1, s2, ...]\n\tDonne le \[LeftGuillemet]ou\[RightGuillemet] bit \[AGrave] bit de cha\[IHat]nes de bits, i.e. de listes de\n\t0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]Vee\[RightGuillemet], en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]v\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tbor[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tband, bits, bnot, bscal, bxor"; Wedge::usage = "band[s1, s2, ...]\nWedge[s1, s2, ...]\n\tDonne le \[LeftGuillemet]et\[RightGuillemet] bit \[AGrave] bit de cha\[IHat]nes de bits, i.e. de listes de\n\t0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]Wedge\[RightGuillemet], en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]^\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tband[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tbits, bnot, bor, bscal, bxor"; anc::usage = "anc[nA, nB, nC]\n\tRetourne une structure de type \[LeftGuillemet]sqo\[RightGuillemet] repr\[EAcute]sentant l'op\[EAcute]ration\n\td'ajouter une ancille |0> de dimension nB entre des espaces\n\tde Hilbert de dimentions nA et nC.\n\n\tEssayez:\n\t\tr = anc[2,2,2] . ket[\"11\"]\n\t\teigen[r]\n\n\tVoir aussi:\n\t\tsqo, trout"; band::usage = "band[s1, s2, ...]\nWedge[s1, s2, ...]\n\tDonne le \[LeftGuillemet]et\[RightGuillemet] bit \[AGrave] bit de cha\[IHat]nes de bits, i.e. de listes de\n\t0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]Wedge\[RightGuillemet], en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]^\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tband[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tbits, bnot, bor, bscal, bxor"; bb84::usage = "bb84\n\tConstante de type \[LeftGuillemet]ens\[RightGuillemet] repr\[EAcute]sentant un m\[EAcute]lange statistique\n\t\[EAcute]quiprobable des 4 \[EAcute]tats correspondant aux qubits 0 et 1 dans\n\tles base canoniques et diagonales.\n\n\tEssayez:\n\t\tbb84\n\t\twh . bb84\n\t\tstate[bb84]\n\n\tVoir aussi:\n\t\tens, zp"; bits::usage = "bits[x, n]\n\tConvertit l'entier x en binaire, i.e. une cha\[IHat]ne de n 0 et 1.\n\n\tEssayez:\n\t\tket[bits[5,3]]\n\t\tket[bits[5,4]]\n\n\tVoir aussi:\n\t\tband, bnot, bor, bscal, bxor"; block::usage = "block[u, v]\n\tProduit en bloc des transformations unitaires u et v.\n\n\tEssayez:\n\t\tblock[wh, wh]\n\t\n\tVoir aussi:\n\t\tkron, unit"; bnot::usage = "bnot[s]\nOverTilde[s]\n\tDonne la n\[EAcute]gation d'une cha\[IHat]ne de bits, i.e. une liste de 0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation 2D en tapant:\n\t\[LeftGuillemet]CTRL-&\[RightGuillemet] \[LeftGuillemet]~\[RightGuillemet].\n\n\tEssayez:\n\t\tbnot[{0,1,0}]\n\n\tVoir aussi:\n\t\tband, bits, bor, bscal, bxor"; bor::usage = "bor[s1, s2, ...]\nVee[s1, s2, ...]\n\tDonne le \[LeftGuillemet]ou\[RightGuillemet] bit \[AGrave] bit de cha\[IHat]nes de bits, i.e. de listes de\n\t0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]Vee\[RightGuillemet], en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]v\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tbor[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tband, bits, bnot, bscal, bxor"; bscal::usage = "bscal[s1, s2]\nCircleDot[s1, s2]\n\tDonne le produit scalaire bool\[EAcute]en de s1 et s2, o\[UGrave] s1 et s2\n\tsont deux cha\[IHat]nes de bits, i.e. de deux listes de 0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CircleDot\[RightGuillemet], un point entour\[EAcute] d'un\n\tcercle, en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet].\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tbscal[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tband, bits, bnot, bor, bxor"; bxor::usage = "bxor[s1, s2, ...]\nCirclePlus[s1, s2, ...]\n\tDonne le \[LeftGuillemet]ou\[RightGuillemet] exclusif bit \[AGrave] bit de cha\[IHat]nes de bits, i.e. de\n\tlistes de 0 et 1.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CirclePlus\[RightGuillemet], un plus entour\[EAcute] d'un\n\tcercle, en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet]+\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tbxor[{0,1,1,1}, {0,0,1,1}]\n\n\tVoir aussi:\n\t\tband, bits, bnot, bor, bscal"; circuit::usage = "circuit[m]\n\tCette fonction effectue une s\[EAcute]rie de compositions et de\n\tproduits de Kronecker correspondant \[AGrave] la disposition des\n\t\[EAcute]l\[EAcute]ments de la matrice m. Les lignes de m repr\[EAcute]sentent des\n\tfils quantiques sur lesquelles circulent de gauche \[AGrave] droite\n\tdes qubits. Les colonnes de m repr\[EAcute]sentent des portes\n\tquantiques.\n\n\tPar exemple, circuit[{{wh,id[]}, {not,not}}] retourne une\n\tstructure de type \[LeftGuillemet]unit\[RightGuillemet] \[EAcute]quivalente \[AGrave] un circuit de deux\n\tportes sur deux fils quantiques. Le premier fil subit un\n\tWalsh-Hadamard suivi d'une n\[EAcute]gation. Le deuxi\[EGrave]me fil ne subit\n\trien \[AGrave] la premi\[EGrave]re porte et une n\[EAcute]gation \[AGrave] la deuxi\[EGrave]me porte.\n\n\tPour construire une porte agissant de fa~con coh\[EAcute]rente sur\n\tplusieurs qubits \[AGrave] la fois, on place la transformation voulue\n\tsur le dernier des fils vis\[EAcute]s. Les autres fils contiennent\n\tdes nombres entiers qui d\[EAcute]crivent une \[LeftGuillemet]liste cha\[IHat]n\[EAcute]e\[RightGuillemet] de fils,\n\tdu haut vers le bas. Par exemple,\n\t\tcircuit[{{id[]},{1},{3},{id[]},{id[]},{ctrl[ctrl[not]]}}]\n\test une porte de Toffoli (ctrl[ctrl[not]]) agissant sur les\n\t2e, 3e et 6e fils d'un circuit de 6 fils.\n\n\tCette fonction est particuli\[EGrave]rement utile lorsqu'elle est\n\tutilis\[EAcute]e avec la notation 2D de Mathematica pour saisir les\n\tmatrices (\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] pour ajouter des lignes et \[LeftGuillemet]CTRL-,\[RightGuillemet]\n\tpour ajouter des colonnes). Dans ce cas, le circuit appara\[IHat]t\n\texactement comme si on le dessinait au tableau. Notez aussi\n\tque le \[LeftGuillemet]Placeholder\[RightGuillemet] de Mathematica, le petit carr\[EAcute] qui\n\tappara\[IHat]t en notation 2D, compte pour la transformation\n\tidentit\[EAcute], il n'est donc pas n\[EAcute]cessaire de remplir toutes les\n\tcases du circuit.\n\n\tEssayez:\n\t\tcircuit[{{ 1, 1, 1 },\n\t\t {cnot, knot, cnot}}]\n\n\t\tcircuit[{{ 1, mm},\n\t\t {cnot, mm}}]\n\n\tVoir aussi:\n\t\tDot, Placeholder, ctrl, cycle, fgate, gate, kron,\n\t\tktrl, swap"; cnot::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; ctrl::usage = "ctrl[u]\nctrl[n, u]\nktrl[u]\n\tDiverses formes de portes contr\[OHat]l\[EAcute]es.\n\n\tctrl[u]: porte u contr\[OHat]l\[EAcute]e;\n\tctrl[n,u]: porte u contr\[OHat]l\[EAcute]e par n fils;\n\tktrl[u]: porte u cont\[OHat]l\[EAcute]e et invers\[EAcute]e.\n\n\tEssayez:\n\t\tctrl[not] == cnot\n\t\tctrl[2,not]\n\t\tktrl[wh]\n\n\tVoir aussi:\n\t\tcircuit, cnot, knot"; cycle::usage = "cycle[n,i,j]\n\tTransformation unitaire agissant sur n qubits qui accomplit\n\tune permutation circulaire des qubits i \[AGrave] j, du haut vers le\n\tbas, de 1 position.\n\n\tEssayez:\n\t\tc = cycle[3,1,3]\n\t\tc . ket[\"010\"] == ket[\"001\"]\n\t\tPower[c,2] == dag[c]\n\n\tVoir aussi:\n\t\tcircuit"; dag::usage = "dag[x]\nSuperDagger[x]\n\tDonne le conjug\[EAcute]-transpos\[EAcute] de x.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation 2D en tapant:\n\t\[LeftGuillemet]CTRL-^\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]d\[RightGuillemet] \[LeftGuillemet]g\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet].\n\n\tEssayez:\n\t\tdag[wh] == wh"; dotexp::usage = "dotexp[x, n]\nPower[x, n]\nx^n\n\tRetourne le r\[EAcute]sultat de x.x. ... .x (n fois). L'argument x\n\tpeut \[EHat]tre un \[LeftGuillemet]unit\[RightGuillemet], un \[LeftGuillemet]supop\[RightGuillemet], un \[LeftGuillemet]sqo\[RightGuillemet], etc., pour autant\n\tque l'op\[EAcute]ration est sens\[EAcute]e.\n\n\tEssayez:\n\t\tSimplify[rotx[t]^3]\n\n\tVoir aussi:\n\t\tDot, kronexp"; eigen::usage = "eigen[r]\neigenVal[r]\neigenVect[r]\n\tCalcul de valeurs et vecteurs propres de l'\[EAcute]tat r.\n\n\teigen[r]: retourne un ensemble statistique (structure de type\n\t\[LeftGuillemet]ens\[RightGuillemet]) constitu\[EAcute] de paires valeur-vecteur propre.\n\n\teigenVal[r]: retourne une matrice diagonale des valeurs\n\tpropres de l'\[EAcute]tat r, sous forme de \[LeftGuillemet]state\[RightGuillemet].\n\n\teigenVect[r]: retourne une matrice unitaire dont les\n\tcolonnes sont des vecteurs propres de r.\n\n\tEssayez:\n\t\teigen[maxmix[2]]\n\t\teigenVect[state[xp]]\n\t\teigenVal[state[xp]]\n\t\teigen[state[yp]] == yp\n\t\teigen[bb84]\n\t\teigen[state[bb84]]\n\n\tVoir aussi:\n\t\tens, schmidt, state, unit"; eigenVal::usage = "eigen[r]\neigenVal[r]\neigenVect[r]\n\tCalcul de valeurs et vecteurs propres de l'\[EAcute]tat r.\n\n\teigen[r]: retourne un ensemble statistique (structure de type\n\t\[LeftGuillemet]ens\[RightGuillemet]) constitu\[EAcute] de paires valeur-vecteur propre.\n\n\teigenVal[r]: retourne une matrice diagonale des valeurs\n\tpropres de l'\[EAcute]tat r, sous forme de \[LeftGuillemet]state\[RightGuillemet].\n\n\teigenVect[r]: retourne une matrice unitaire dont les\n\tcolonnes sont des vecteurs propres de r.\n\n\tEssayez:\n\t\teigen[maxmix[2]]\n\t\teigenVect[state[xp]]\n\t\teigenVal[state[xp]]\n\t\teigen[state[yp]] == yp\n\t\teigen[bb84]\n\t\teigen[state[bb84]]\n\n\tVoir aussi:\n\t\tens, schmidt, state, unit"; eigenVect::usage = "eigen[r]\neigenVal[r]\neigenVect[r]\n\tCalcul de valeurs et vecteurs propres de l'\[EAcute]tat r.\n\n\teigen[r]: retourne un ensemble statistique (structure de type\n\t\[LeftGuillemet]ens\[RightGuillemet]) constitu\[EAcute] de paires valeur-vecteur propre.\n\n\teigenVal[r]: retourne une matrice diagonale des valeurs\n\tpropres de l'\[EAcute]tat r, sous forme de \[LeftGuillemet]state\[RightGuillemet].\n\n\teigenVect[r]: retourne une matrice unitaire dont les\n\tcolonnes sont des vecteurs propres de r.\n\n\tEssayez:\n\t\teigen[maxmix[2]]\n\t\teigenVect[state[xp]]\n\t\teigenVal[state[xp]]\n\t\teigen[state[yp]] == yp\n\t\teigen[bb84]\n\t\teigen[state[bb84]]\n\n\tVoir aussi:\n\t\tens, schmidt, state, unit"; ens::usage = "ens[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant un ensemble statistique d'\[EAcute]tats.\n\n\tUn \[LeftGuillemet]ens\[RightGuillemet] valide contient une liste de paires {p,r} o\[UGrave] p est un\n\tnombre entre 0 et 1 (une probabilit\[EAcute]) et r est une donn\[EAcute]e de\n\ttype \[LeftGuillemet]ket\[RightGuillemet] ou de type \[LeftGuillemet]state\[RightGuillemet]. La somme des p doit donner 1.\n\n\tUn \[LeftGuillemet]ens\[RightGuillemet] contenant une liste triviale d'une seule paire {p,r}\n\to\[UGrave] p=1 est automatiquement converti au \[LeftGuillemet]state\[RightGuillemet] (ou au \[LeftGuillemet]ket\[RightGuillemet]) r.\n\n\tEssayez:\n\t\tbb84\n\t\tFullForm[bb84]\n\t\tmmm . xp\n\t\tFullForm[mmm . xp]\n\t\teigen[maxmix[2]]\n\t\tFullForm[eigen[maxmix[2]]]\n\n\tVoir aussi:\n\t\tbb84, eigen, ensQ, ket, state, sqo"; ensQ::usage = "ensQ[x]\nketQ[x]\nsqoQ[x]\nstateQ[x]\nsupopQ[x]\nunitQ[x]\n\tFonctions bool\[EAcute]ennes testant la validit\[EAcute] de x selon le type de\n\tdonn\[EAcute]e correspondant au nom de la fonction.\n\t\n\tEssayez:\n\t\tunitQ[wh]\n\t\tSimplify[unitQ[fourier[3]]]\n\t\tketQ[ket[zp + zm]]\n\n\tVoir aussi:\n\t\tens, ket, sqo, state, supop, unit"; entropy::usage = "entropy[r]\n\tCalcul (num\[EAcute]rique) de l'entropie de von Neumann de l'\[EAcute]tat r.\n\n\tEssayez:\n\t\tentropy[state[bb84]]\n\t\n\tVoir aussi:\n\t\tfidelity"; fgate::usage = "fgate[m, n, f]\n\tRetourne une transformation unitaire agissant sur m+n qubits\n\tqui est \[EAcute]quivalente \[AGrave] la fonction f sur des valeurs\n\tclassiques.\n\n\tLa fonction f est une \[LeftGuillemet]pure function\[RightGuillemet] Mathematica. Elle prend\n\ten argument m bits et doit retourner une liste de n bits.\n\tOn peut voir f comme une fonction (classique) de m bits vers n bits.\n\n\tSur un \[EAcute]tat pur de la base canonique |x,y>, fgate laisse les m\n\tpremiers qubits |x> inchang\[EAcute]s, et transforme les n derniers\n\tqubits |y> en |y XOR f(x)>, o\[UGrave] XOR repr\[EAcute]sente le ou exclusif\n\tde deux cha\[IHat]nes de n bits.\n\n\tEssayez:\n\t\tfgate[1,1,({#})&]\n\t\tfgate[1,2,({(#), (#)})&]\n\n\tVoir aussi:\n\t\tcircuit, gate"; fidelity::usage = "fidelity[r1, r2]\n\tCalcul (num\[EAcute]rique) de la fid\[EAcute]lit\[EAcute] de deux \[EAcute]tats (purs ou\n\tmixtes).\n\n\tEssayez:\n\t\tfidelity[zp, xp]\n\t\n\tVoir aussi:\n\t\tentropy"; fourier::usage = "fourier[m]\n\tTransform\[EAcute]e de Fourier de dimension m.\n\n\tEssayez:\n\t\tfourier[4]\n\n\tVoir aussi:\n\t\tcircuit"; gate::usage = "gate[n, b, f]\ngate[n, f]\n\tRetourne une transformation unitaire de dimension b^n (2^n si\n\tb est omis) qui est d\[EAcute]crite par la fonction f.\n\n\tLa fonction f est une \[LeftGuillemet]pure function\[RightGuillemet] Mathematica. Elle prend\n\ten argument n entiers entre 0 et b-1, et doit retourner un\n\t\[LeftGuillemet]ket\[RightGuillemet]. Pour des valeurs diff\[EAcute]rentes de ses arguments, f doit\n\tretourner des kets qui sont orthogonaux.\n\n\tEssayez:\n\t\tgate[2,(ket[{#1, bxor[#1,#2]}])&]\n\n\tVoir aussi:\n\t\tcircuit, fgate"; id::usage = "id[n]\nid[]\n\tLa transformation unitaire identit\[EAcute] sur n (1 si n est omis)\n\tqubits.\n\n\tEssayez:\n\t\tid[8]\n\n\tVoir aussi:\n\t\tcircuit"; ket::usage = "ket[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant un \[EAcute]tat pur.\n\n\tUn \[LeftGuillemet]ket\[RightGuillemet] valide contient une matrice de nombres de dimension n\n\tpar 1. Tout \[LeftGuillemet]ket\[RightGuillemet] valide doit \[EHat]tre de norme 1.\n\n\tNotez que pour entrer une matrice en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes.\n\n\tPour obtenir un \[LeftGuillemet]bra\[RightGuillemet], utilisez dag[ket[...]]. Il n'y a pas\n\tde donn\[EAcute]e de type \[LeftGuillemet]bra\[RightGuillemet].\n\n\tL'expression ket[0] (ou ket[1]) est convertie de fa\[CCedilla]on \[AGrave]\n\trepr\[EAcute]senter le bit 0 (ou 1) dans la base canonique d'un espace\n\tde Hilbert de dimension 2, i.e. un qubit. Pour obtenir un\n\tregistre de plusieurs qubits on peut concat\[EAcute]ner les bits dans\n\tune liste ou dans une cha\[IHat]ne de caract\[EGrave]res. Pour obtenir un\n\tregistre quantique dont la dimension est une puissance d'une\n\tbase autre que 2, on peut ajouter en indice la valeur de la\n\tbase, voir les exemples ci-dessous.\n\n\tNotez que la mise en indice \[LeftGuillemet]Subscript[x,y]\[RightGuillemet] peut \[EHat]tre entr\[EAcute]e\n\ten notation 2D en tapant: \[LeftGuillemet]x\[RightGuillemet] \[LeftGuillemet]CTRL-_\[RightGuillemet] \[LeftGuillemet]y\[RightGuillemet].\n\n\tEssayez:\n\t\tket[0]\n\t\tFullForm[ket[0]]\n\t\tFullForm[ket[0][[1]]]\n\t\tket[{0,1,0}]\n\t\tket[\"010\"]\n\t\tket[Subscript[2, 3]]\n\t\tket[Subscript[{0,2,0}, 3]]\n\t\tket[Subscript[\"020\", 3]]\n\t\t-zm\n\t\tket[(1/Sqrt[2])(zp+zm)]\n\n\tVoir aussi:\n\t\tketQ, phip, zp"; ketQ::usage = "ensQ[x]\nketQ[x]\nsqoQ[x]\nstateQ[x]\nsupopQ[x]\nunitQ[x]\n\tFonctions bool\[EAcute]ennes testant la validit\[EAcute] de x selon le type de\n\tdonn\[EAcute]e correspondant au nom de la fonction.\n\t\n\tEssayez:\n\t\tunitQ[wh]\n\t\tSimplify[unitQ[fourier[3]]]\n\t\tketQ[ket[zp + zm]]\n\n\tVoir aussi:\n\t\tens, ket, sqo, state, supop, unit"; knot::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; kron::usage = "kron[x, y, ...]\nCircleTimes[x, y, ...]\n\tDonne le produit de Kronecker. Les arguments peuvent \[EHat]tre des\n\tmatrices, des \[LeftGuillemet]ket\[RightGuillemet], des \[LeftGuillemet]unit\[RightGuillemet], des \[LeftGuillemet]state\[RightGuillemet], etc., pour\n\tautant que l'op\[EAcute]ration soit sens\[EAcute]e.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CircleTimes\[RightGuillemet], un x entour\[EAcute] d'un\n\tcercle, en tapant: \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet]*\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet]. Notez que cet\n\top\[EAcute]rateur a une pr\[EAcute]s\[EAcute]ance moins forte que le produit \[LeftGuillemet]Dot\[RightGuillemet], not\[EAcute]\n\tavec un point \[LeftGuillemet].\[RightGuillemet].\n\n\tEssayez:\n\t\tkron[zp, xp]\n\t\tkron[wh, cnot]\n\t\tkron[zm, maxmix[2]]\n\t\tkron[mm, mm]\n\t\tkron[mm, wh]\n\n\tVoir aussi:\n\t\tDot, circuit, krondiv, kronexp"; krondiv::usage = "krondiv[v, w]\n\t\[LeftGuillemet]Division de Kronecker\[RightGuillemet]. Retourne une matrice y de dimension\n\tN/n x 1, tel que v = kron[w, y], o\[UGrave] v est une matrice de\n\tdimension N x 1 et w est une matrice de dimension n x 1.\n\n\tLa fonction krondiv n'est implant\[EAcute]e que pour les matrices\n\tMathematica, pas pour les \[LeftGuillemet]ket\[RightGuillemet] ou autres types de donn\[EAcute]es de\n\tQuCalc.\n\n\tNotez que pour entrer une matrice colonne en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes.\n\n\tEssayez:\n\t\tkrondiv[{{4},{5},{8},{10},{12},{15}}, {{1},{2},{3}}]\n\n\tVoir aussi:\n\t\tkron, vec, unvec"; kronexp::usage = "kronexp[x, n]\n\tProduit de Kronecker it\[EAcute]r\[EAcute] n fois.\n\n\tEssayez:\n\t\tkronexp[wh, 3]\n\t\tkronexp[mm, 3]\n\t\tkronexp[zp, 3] == ket[\"000\"]\n\n\tVoir aussi:\n\t\tkron, dotexp"; ktrl::usage = "ctrl[u]\nctrl[n, u]\nktrl[u]\n\tDiverses formes de portes contr\[OHat]l\[EAcute]es.\n\n\tctrl[u]: porte u contr\[OHat]l\[EAcute]e;\n\tctrl[n,u]: porte u contr\[OHat]l\[EAcute]e par n fils;\n\tktrl[u]: porte u cont\[OHat]l\[EAcute]e et invers\[EAcute]e.\n\n\tEssayez:\n\t\tctrl[not] == cnot\n\t\tctrl[2,not]\n\t\tktrl[wh]\n\n\tVoir aussi:\n\t\tcircuit, cnot, knot"; lvNorm::usage = "lvProd[x, y]\nCenterDot[x, y]\nlvNorm[x]\n\tlvProd[x, y] retourne le produit de Liouville de x et y. Les\n\targuments peuvent \[EHat]tre deux \[LeftGuillemet]unit\[RightGuillemet] ou deux \[LeftGuillemet]state\[RightGuillemet]. Le\n\tproduit de Liouville de x et y est d\[EAcute]fini comme la trace du\n\tproduit matriciel de dag[x] et y.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CenterDot\[RightGuillemet] en tapant:\n\t\[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet].\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet]. Notez que cet op\[EAcute]rateur a une pr\[EAcute]s\[EAcute]ance\n\tmoins forte que le produit ordinaire \[LeftGuillemet]Dot\[RightGuillemet], et \[EAcute]galement moins\n\tforte que le produit de kronecker \[LeftGuillemet]kron\[RightGuillemet].\n\n\tlvNorm[x] retourne la norme de Liouville de x. L'argument\n\tpeut \[EHat]tre un \[LeftGuillemet]unit\[RightGuillemet] ou un \[LeftGuillemet]state\[RightGuillemet]. La norme de Liouville de x\n\test d\[EAcute]finie comme la racine carr\[EAcute]e du produit de Liouville de\n\tx avec lui-m\[EHat]me.\n\n\tEssayez:\n\t\tlvProd[sigx, sigz]\n\t\tlvNorm[maxmix[2]]\n\n\tVoir aussi:\n\t\tunit, state, Dot, kron, dag"; lvProd::usage = "lvProd[x, y]\nCenterDot[x, y]\nlvNorm[x]\n\tlvProd[x, y] retourne le produit de Liouville de x et y. Les\n\targuments peuvent \[EHat]tre deux \[LeftGuillemet]unit\[RightGuillemet] ou deux \[LeftGuillemet]state\[RightGuillemet]. Le\n\tproduit de Liouville de x et y est d\[EAcute]fini comme la trace du\n\tproduit matriciel de dag[x] et y.\n\n\tCette fonction peut \[EHat]tre entr\[EAcute]e en notation infixe avec\n\tl'op\[EAcute]rateur Mathematica \[LeftGuillemet]CenterDot\[RightGuillemet] en tapant:\n\t\[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet].\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet]. Notez que cet op\[EAcute]rateur a une pr\[EAcute]s\[EAcute]ance\n\tmoins forte que le produit ordinaire \[LeftGuillemet]Dot\[RightGuillemet], et \[EAcute]galement moins\n\tforte que le produit de kronecker \[LeftGuillemet]kron\[RightGuillemet].\n\n\tlvNorm[x] retourne la norme de Liouville de x. L'argument\n\tpeut \[EHat]tre un \[LeftGuillemet]unit\[RightGuillemet] ou un \[LeftGuillemet]state\[RightGuillemet]. La norme de Liouville de x\n\test d\[EAcute]finie comme la racine carr\[EAcute]e du produit de Liouville de\n\tx avec lui-m\[EHat]me.\n\n\tEssayez:\n\t\tlvProd[sigx, sigz]\n\t\tlvNorm[maxmix[2]]\n\n\tVoir aussi:\n\t\tunit, state, Dot, kron, dag"; maxmix::usage = "maxmix[n]\n\tRetourne l'\[EAcute]tat compl\[EGrave]tement m\[EAcute]lang\[EAcute] de dimension n.\n\n\tEssayez:\n\t\tmaxmix[3]\n\n\tVoir aussi:\n\t\tstate"; mm::usage = "mm\n\tConstante de type \[LeftGuillemet]supop\[RightGuillemet] repr\[EAcute]sentant une mesure dans la base\n\tcanonique sur 1 qubit.\n\n\tEssayez:\n\t\tmm\n\t\tmm . xp\n\t\tmm . zp\n\t\tkron[mm, mm]\n\t\tmm . mm == mm\n\t\twh . mm . wh\n\n\tVoir aussi:\n\t\tmmm, supop"; mmm::usage = "mmm\n\tConstante de type \[LeftGuillemet]sqo\[RightGuillemet] repr\[EAcute]sentant une mesure dans la base\n\tcanonique sur 1 qubit.\n\n\tEssayez:\n\t\tmmm\n\t\tmmm . xp\n\t\tmmm . zp\n\t\tkron[mmm, id[]]\n\t\tmmm . mmm == mm\n\n\tVoir aussi:\n\t\tmm, sqo"; not::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; phase::usage = "phase[t]\nrotx[t]\nroty[t]\nrotz[t]\n\tphase[t] est un changement de phase global d'un angle t sur 1\n\tqubit.\n\n\trotx[t], roty[t] et rotz[t] sont des rotations d'un angle t\n\tautour de l'axe correspondant au nom de la fonction dans la\n\tsph\[EGrave]re de Poincar\[EAcute].\n\n\tEssayez:\n\t\tphase[t]\n\t\trotx[t]\n\t\troty[t]\n\t\trotz[t]\n\n\tVoir aussi:\n\t\tunit, randomUnit"; phim::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; phip::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; psim::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; psip::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; randomUnit::usage = "randomUnit[]\n\tRetourne une transformation unitaire de dimension 2 al\[EAcute]atoire.\n\tLa distribution est bas\[EAcute]e sur des choix al\[EAcute]atoires d'angles\n\td'Euler dans la sph\[EGrave]re de Poincar\[EAcute].\n\n\tPlus pr\[EAcute]cis\[EAcute]ment, randomUnit[] est construit comme suit:\n\t\tphase[t1] . rotz[t2] . roty[t3] . rotz[t4]\n\to\[UGrave] t1, t2, t3 et t4 sont choisis uniform\[EAcute]ment et de fa\[CCedilla]on\n\tind\[EAcute]pendante entre 0 et 2 pi\n\n\tEssayez:\n\t\trandomUnit[] . zp\n\n\tVoir aussi:\n\t\tphase, unit"; regAnc::usage = "regAnc[l]\n\tLa liste l contient des noms de registres pr\[EAcute]alablement\n\td\[EAcute]clar\[EAcute]s par un appel \[AGrave] la fonction regSet. L'appel\n\tregAnc[l] retourne un \[LeftGuillemet]sqo\[RightGuillemet] correspondant \[AGrave] l'ajout d'une\n\tancille initialis\[EAcute]e \[AGrave] l'\[EAcute]tat \[LeftGuillemet]ket[0]\[RightGuillemet]. Les registres\n\tancillaires sont ceux donn\[EAcute]s par l et l'espace r\[EAcute]sultant est\n\ttel que d\[EAcute]fini par l'appel \[AGrave] regSet.\n\n\tEssayez:\n\t\tregSet[{1,2,3,4}]\n\t\tregAnc[{3,1}].ket[\"11\"] == state[ket[\"0101\"]]\n\n\tVoir aussi:\n\t\tanc, regOper, regSet, regState, regTrout, sqo"; regGet::usage = "regSet[l]\nregGet[]\n\tregSet[l] d\[EAcute]finit les \[EAcute]l\[EAcute]ments de la liste l comme les noms\n\tdes registres quantiques avec lesquelles les fonctions\n\tregOper, regState, regTrout et regAnc peuvent travailler. Les\n\t\[EAcute]l\[EAcute]ments de l peuvent \[EHat]tre des identificateurs, des\n\tentiers, des cha\[IHat]nes de caract\[EGrave]res, etc., mais pas des listes.\n\tChaque registre correspond \[AGrave] un qubit et donc \[AGrave] un espace de\n\tHilbert de dimension 2. Deux registres distincts ne peuvent\n\tpas porter le m\[EHat]me nom.\n\n\tregGet[] retourne la liste des noms de registres telle que\n\td\[EAcute]finie par le dernier appel \[AGrave] regSet.\n\n\tEssayez:\n\t\tregSet[{Alice, Bob}]\n\t\tregGet[]\n\t\tregSet[{z,y,x,1,2,3}]\n\t\tregGet[]\n\n\tVoir aussi:\n\t\tregAnc, regOper, regState, regTrout"; regOper::usage = "regOper[o,l]\n\tL'argument o est soit un \[LeftGuillemet]unit\[RightGuillemet], un \[LeftGuillemet]supop\[RightGuillemet] ou un \[LeftGuillemet]sqo\[RightGuillemet], de\n\tdimension carr\[EAcute]e, et l est une liste de registres\n\tpr\[EAcute]alablement d\[EAcute]clar\[EAcute]s par un appel \[AGrave] la fonction regSet. Le\n\tnombre de qubits sur lesquels o agit doit \[EHat]tre \[EAcute]gal au nombre\n\td'\[EAcute]l\[EAcute]ments de l. L'appel regOper[o,l] retourne l'op\[EAcute]rateur o\n\tagissant dans les registres donn\[EAcute]s. L'op\[EAcute]rateur identit\[EAcute] est\n\timplicitement utilis\[EAcute] pour les registres d\[EAcute]finis par le\n\tdernier appel \[AGrave] regSet mais qui n'apparaissent pas dans l.\n\n\tLes appels Subscript[o, r1,r2,...] ou Subscript[o, {r1,r2,...}] \n\tsont \[EAcute]quivalents \[AGrave] regOper[o, {r1,r2,...}]. Ces formes\n\tpeuvent \[EHat]tre saisies \[AGrave] l'aide de la notation 2D de Mathematica\n\ten tapant \[LeftGuillemet]CTRL-_\[RightGuillemet].\n\t\n\tEssayez:\n\t\tregSet[{a,b}]\n\t\tregOper[cnot, {a,b}]\n\t\tregOper[cnot, {b,a}]\n\t\tregSet[{a,z,b}]\n\t\tregOper[cnot, {a,b}]\n\t\tregOper[cnot, {b,a}]\n\n\tVoir aussi:\n\t\tregAnc, regSet, regState, regTrout, sqo, supop, unit"; regSet::usage = "regSet[l]\nregGet[]\n\tregSet[l] d\[EAcute]finit les \[EAcute]l\[EAcute]ments de la liste l comme les noms\n\tdes registres quantiques avec lesquelles les fonctions\n\tregOper, regState, regTrout et regAnc peuvent travailler. Les\n\t\[EAcute]l\[EAcute]ments de l peuvent \[EHat]tre des identificateurs, des\n\tentiers, des cha\[IHat]nes de caract\[EGrave]res, etc., mais pas des listes.\n\tChaque registre correspond \[AGrave] un qubit et donc \[AGrave] un espace de\n\tHilbert de dimension 2. Deux registres distincts ne peuvent\n\tpas porter le m\[EHat]me nom.\n\n\tregGet[] retourne la liste des noms de registres telle que\n\td\[EAcute]finie par le dernier appel \[AGrave] regSet.\n\n\tEssayez:\n\t\tregSet[{Alice, Bob}]\n\t\tregGet[]\n\t\tregSet[{z,y,x,1,2,3}]\n\t\tregGet[]\n\n\tVoir aussi:\n\t\tregAnc, regOper, regState, regTrout"; regState::usage = "regState[s,l]\n\tL'argument s est soit un \[LeftGuillemet]ket\[RightGuillemet], un \[LeftGuillemet]state\[RightGuillemet] ou un \[LeftGuillemet]ens\[RightGuillemet], et l\n\test la liste des registres pr\[EAcute]alablement d\[EAcute]clar\[EAcute]s par un appel\n\t\[AGrave] la fonction regSet. La liste l doit contenir tous les\n\tregistres d\[EAcute]clar\[EAcute]s par regSet, mais pas n\[EAcute]cessairement dans le\n\tm\[EHat]me ordre. Le nombre de qubits correspondant \[AGrave] l'\[EAcute]tat s doit\n\t\[EHat]tre \[EAcute]gal au nombre de registres. L'appel regState[s,l]\n\tretourne l'\[EAcute]tat s r\[EAcute]sidant dans les registres donn\[EAcute]s par l.\n\n\tLes appels\n\t\tkron[Subscript[s1, r1,r2,...], Subscript[s2, t1,t2,...]]\n\tou\n\t\tkron[Subscript[s1, {r1,r2,...}], Subscript[s2, {t1,t2,...}]]\n\tsont \[EAcute]quivalents \[AGrave]\n\t\tregState[kron[s1,s2], {r1,r2,...,t1,t2,...}].\n\tCes formes peuvent \[EHat]tre saisies \[AGrave] l'aide de la notation 2D de\n\tMathematica en tapant \[LeftGuillemet]CTRL-_\[RightGuillemet] pour produire les indices, et en\n\ttapant \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet]*\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet] pour obtenir le symbole du produit\n\tde Kronecker en notation infixe. Cette syntaxe est notamment\n\tpratique si on la combine \[AGrave] la forme semblable de la fonction\n\tregOper, comme illustr\[EAcute] ci-dessous.\n\t\n\tDans les exemples suivants, il faut taper \[LeftGuillemet]CTRL-_\[RightGuillemet] l\[AGrave] o\[UGrave] on a\n\t\[EAcute]crit \[LeftGuillemet]_\[RightGuillemet], et il faut taper \[LeftGuillemet]ESC\[RightGuillemet] \[LeftGuillemet]c\[RightGuillemet] \[LeftGuillemet]*\[RightGuillemet] \[LeftGuillemet]ESC\[RightGuillemet] l\[AGrave] o\[UGrave] on a\n\t\[EAcute]crit \[LeftGuillemet]*\[RightGuillemet], essayez:\n\t\tregSet[{Alice,Bob}]\n\t\twh_Alice . not_Bob . (zp_Alice * zm_Bob)\n\t\twh_Alice . not_Bob . (zm_Bob * zp_Alice)\n\t\tnot_Bob . wh_Alice . (zp_Alice * zm_Bob)\n\t\tnot_Bob . wh_Alice . (zm_Bob * zp_Alice)\n\n\tVoir aussi:\n\t\tens, ket, kron, regAnc, regOper, regSet, regTrout, state"; regTrout::usage = "regTrout[l]\n\tLa liste l contient des noms de registres pr\[EAcute]alablement\n\td\[EAcute]clar\[EAcute]s par un appel \[AGrave] la fonction regSet. L'appel\n\tregTrout[l] retourne un \[LeftGuillemet]sqo\[RightGuillemet] correspondant au \[LeftGuillemet]trace out\[RightGuillemet] des\n\tregistres donn\[EAcute]s, par rapport \[AGrave] l'espace ambiant d\[EAcute]fini par\n\tl'appel \[AGrave] regSet.\n\n\tEssayez:\n\t\tregSet[{1,2,3,4}]\n\t\tregTrout[{3,1}].ket[\"0101\"] == state[ket[\"11\"]]\n\n\tVoir aussi:\n\t\tregAnc, regOper, regSet, regState, sqo, trout"; rotx::usage = "phase[t]\nrotx[t]\nroty[t]\nrotz[t]\n\tphase[t] est un changement de phase global d'un angle t sur 1\n\tqubit.\n\n\trotx[t], roty[t] et rotz[t] sont des rotations d'un angle t\n\tautour de l'axe correspondant au nom de la fonction dans la\n\tsph\[EGrave]re de Poincar\[EAcute].\n\n\tEssayez:\n\t\tphase[t]\n\t\trotx[t]\n\t\troty[t]\n\t\trotz[t]\n\n\tVoir aussi:\n\t\tunit, randomUnit"; roty::usage = "phase[t]\nrotx[t]\nroty[t]\nrotz[t]\n\tphase[t] est un changement de phase global d'un angle t sur 1\n\tqubit.\n\n\trotx[t], roty[t] et rotz[t] sont des rotations d'un angle t\n\tautour de l'axe correspondant au nom de la fonction dans la\n\tsph\[EGrave]re de Poincar\[EAcute].\n\n\tEssayez:\n\t\tphase[t]\n\t\trotx[t]\n\t\troty[t]\n\t\trotz[t]\n\n\tVoir aussi:\n\t\tunit, randomUnit"; rotz::usage = "phase[t]\nrotx[t]\nroty[t]\nrotz[t]\n\tphase[t] est un changement de phase global d'un angle t sur 1\n\tqubit.\n\n\trotx[t], roty[t] et rotz[t] sont des rotations d'un angle t\n\tautour de l'axe correspondant au nom de la fonction dans la\n\tsph\[EGrave]re de Poincar\[EAcute].\n\n\tEssayez:\n\t\tphase[t]\n\t\trotx[t]\n\t\troty[t]\n\t\trotz[t]\n\n\tVoir aussi:\n\t\tunit, randomUnit"; schmidt::usage = "schmidt[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant une d\[EAcute]composition de Schmidt d'un\n\t\[EAcute]tat pur consid\[EAcute]r\[EAcute] comme un \[EAcute]tat bipartite.\n\n\tUn \[LeftGuillemet]schmidt\[RightGuillemet] valide contient une liste de triplets {q, k1, k2}\n\to\[UGrave] les q sont les nombres de Schmidt, la somme des q^2 doit\n\t\[EHat]tre \[EAcute]gale \[AGrave] 1, les k1 (les k2) sont des donn\[EAcute]es de type \[LeftGuillemet]ket\[RightGuillemet]\n\tet forment une base orthonormale de Schmidt de l'espace\n\td'Alice (de Bob).\n\n\tL'expression schmidt[n1, n2, k] o\[UGrave] k est un \[LeftGuillemet]ket\[RightGuillemet] de dimension\n\tn1*n2 est convertie de fa\[CCedilla]on \[AGrave] repr\[EAcute]senter une d\[EAcute]composition\n\tde Schmidt de l'\[EAcute]tat k avec n1 et n2 pour les dimensions des\n\tespaces d'Alice et Bob. Un quatri\[EGrave]me argument facultatif, de\n\ttype \[LeftGuillemet]pure function\[RightGuillemet] Mathematica, peut \[EHat]tre ajout\[EAcute] \[AGrave] l'appel.\n\tIl s'agit d'une fonction de simplification qui sera utilis\[EAcute]e \[AGrave]\n\tcertaines \[EAcute]tapes du calcul. L'appel schmidt[n1, n2, k] est\n\t\[EAcute]quivalent \[AGrave] schmidt[n1, n2, k, (Simplify[#])&].\n\n\tEssayez:\n\t\ts = schmidt[2, 2, phip]\n\t\tFullForm[s]\n\t\tFullForm[s[[1]]]\n\t\tket[s]\n\n\tVoir aussi:\n\t\tket, eigen"; sigx::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; sigy::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; sigz::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; sqo::usage = "sqo[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant un \[LeftGuillemet]selective quantum operation\[RightGuillemet]\n\t(SQO).\n\n\tMath\[EAcute]matiquement, un SQO est d\[EAcute]fini par une famille de\n\tmatrices carr\[EAcute]es ou rectangulaires A_{i,j}, 1<=i<=m,\n\t1<=j<=k_i, de dimensions s par r, telles que la somme\n\t\t\\sum A_{i,j}^\\dagger A_{i,j}\n\test \[EAcute]gale \[AGrave] la matrice identit\[EAcute] de dimension r par r. Un SQO\n\test une op\[EAcute]ration quantique g\[EAcute]n\[EAcute]rale qui comprend comme cas\n\tparticuliers la transformation unitaire, le superop\[EAcute]rateur, le\n\tPOVM (\[LeftGuillemet]Positive Operator Valued Measure\[RightGuillemet]), le \[LeftGuillemet]trace out\[RightGuillemet] et\n\tl'ajout d'une ancille. Appliqu\[EAcute] \[AGrave] un \[EAcute]tat mixte \\rho\n\tquelconque de dimension r, le SQO d\[EAcute]crit ci-dessus donne, avec\n\tprobabilit\[EAcute] p_i, l'\[EAcute]tat\n\t\t\\sigma_i = (1/p_i) B_i\n\tde dimension s, o\[UGrave]\n\t\tB_i = \\sum_{j} A_{i,j} \\rho A_{i,j}^\\dagger\n\t\tp_i = tr(B_i).\n\n\tIl est rare que vous aurez \[AGrave] construire un SQO de toute pi\[EGrave]ce\n\ten travaillant avec QuCalc, sauf par exemple dans le cas o\[UGrave]\n\tvous souhaitez mesurer un \[EAcute]tat selon des axes formant des\n\tangles de 60 degr\[EAcute]s entre eux. Pour conna\[IHat]tre les d\[EAcute]tails\n\td'implantation d'un \[LeftGuillemet]sqo\[RightGuillemet], analysez les exemples ci-dessous.\n\tEn g\[EAcute]n\[EAcute]ral, il pr\[EAcute]f\[EAcute]rable de combiner les \[LeftGuillemet]sqo\[RightGuillemet] d\[EAcute]j\[AGrave] d\[EAcute]finis\n\tpar QuCalc avec des transformations unitaires, etc.\n\n\tEssayez:\n\t\tmmm\n\t\tFullForm[mmm]\n\t\tq = kron[mmm, mm]\n\t\tFullForm[q]\n\t\tmmm . xp\n\n\tVoir aussi:\n\t\tanc, mmm, sqoQ, supop, trout"; sqoQ::usage = "ensQ[x]\nketQ[x]\nsqoQ[x]\nstateQ[x]\nsupopQ[x]\nunitQ[x]\n\tFonctions bool\[EAcute]ennes testant la validit\[EAcute] de x selon le type de\n\tdonn\[EAcute]e correspondant au nom de la fonction.\n\t\n\tEssayez:\n\t\tunitQ[wh]\n\t\tSimplify[unitQ[fourier[3]]]\n\t\tketQ[ket[zp + zm]]\n\n\tVoir aussi:\n\t\tens, ket, sqo, state, supop, unit"; state::usage = "state[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant un \[EAcute]tat mixte.\n\n\tUn \[LeftGuillemet]state\[RightGuillemet] valide contient une matrice carr\[EAcute]e de nombres.\n\tCette matrice doit \[EHat]tre hermitienne, positive et de trace 1.\n\n\tNotez que pour entrer une matrice en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes, et \[LeftGuillemet]CTRL-,\[RightGuillemet] cr\[EAcute]e des\n\tcolonnes.\n\n\tLes \[LeftGuillemet]state\[RightGuillemet] repr\[EAcute]sentant des \[EAcute]tats purs ne sont pas\n\tautomatiquement convertis en \[LeftGuillemet]ket\[RightGuillemet], utilisez \[LeftGuillemet]eigen\[RightGuillemet] pour\n\tcela.\n\n\tEssayez:\n\t\tr = state[phip]\n\t\tFullForm[r]\n\t\tFullForm[r[[1]]]\n\t\tstate[(1/2)(state[phip] + state[phim])]\n\n\tVoir aussi:\n\t\teigen, ket, maxmix, stateQ"; stateQ::usage = "ensQ[x]\nketQ[x]\nsqoQ[x]\nstateQ[x]\nsupopQ[x]\nunitQ[x]\n\tFonctions bool\[EAcute]ennes testant la validit\[EAcute] de x selon le type de\n\tdonn\[EAcute]e correspondant au nom de la fonction.\n\t\n\tEssayez:\n\t\tunitQ[wh]\n\t\tSimplify[unitQ[fourier[3]]]\n\t\tketQ[ket[zp + zm]]\n\n\tVoir aussi:\n\t\tens, ket, sqo, state, supop, unit"; supop::usage = "supop[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant un superop\[EAcute]rateur.\n\n\tUn \[LeftGuillemet]supop\[RightGuillemet] valide contient une liste de matrices carr\[EAcute]es A_j\n\ttelles que la somme\n\t\t\\sum_j A_j^\\dagger A_j\n\t\[EAcute]gale la matrice identit\[EAcute]. Appliqu\[EAcute] \[AGrave] un \[EAcute]tat mixte \\rho, le\n\t\[LeftGuillemet]supop\[RightGuillemet] d\[EAcute]crit ci-dessus donne l'\[EAcute]tat mixte\n\t\t\\sum_{j} A_j \\rho A_j^\\dagger\n\tpourvu que les dimensions des matrices soient compatibles.\n\n\tNotez que pour entrer une matrice en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes, et \[LeftGuillemet]CTRL-,\[RightGuillemet] cr\[EAcute]e des\n\tcolonnes.\n\n\tEssayez:\n\t\tmm\n\t\tFullForm[mm]\n\t\tmm . xp\n\n\tVoir aussi:\n\t\tmm, sqo, supopQ"; supopQ::usage = "ensQ[x]\nketQ[x]\nsqoQ[x]\nstateQ[x]\nsupopQ[x]\nunitQ[x]\n\tFonctions bool\[EAcute]ennes testant la validit\[EAcute] de x selon le type de\n\tdonn\[EAcute]e correspondant au nom de la fonction.\n\t\n\tEssayez:\n\t\tunitQ[wh]\n\t\tSimplify[unitQ[fourier[3]]]\n\t\tketQ[ket[zp + zm]]\n\n\tVoir aussi:\n\t\tens, ket, sqo, state, supop, unit"; swap::usage = "swap[n, i, j]\nswap[]\n\tswap[n, i, j] est une transformation unitaire agissant sur n\n\tqubits et est telle que les qubits i et j sont intervertis.\n\n\tswap[] est \[EAcute]quivalent \[AGrave] swap[2,1,2].\n\n\tEssayez:\n\t\tc = swap[4,1,3]\n\t\tc . ket[\"0110\"] == ket[\"1100\"]\n\t\tPower[c,2] == id[4]\n\n\tVoir aussi:\n\t\tcircuit"; trout::usage = "trout[nA, nB, nC]\n\tRetourne une structure de type \[LeftGuillemet]sqo\[RightGuillemet] repr\[EAcute]sentant le\n\t\[LeftGuillemet]trace out\[RightGuillemet] d'un espace de Hilbert de dimension nB entre des\n\tespaces de dimentions nA et nC.\n\n\tEssayez:\n\t\ttrout[2, 2, 1] . phip\n\t\ttrout[1, 2, 2] . phip\n\t\ttrout[2, 4, 2] . ket[\"0110\"] == state[ket[\"00\"]]\n\n\tVoir aussi:\n\t\tsqo, anc"; unit::usage = "unit[...]\n\tType de donn\[EAcute]e repr\[EAcute]sentant une transformation unitaire.\n\n\tUn \[LeftGuillemet]unit\[RightGuillemet] valide contient matrice carr\[EAcute]e unitaire.\n\n\tNotez que pour entrer une matrice en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes, et \[LeftGuillemet]CTRL-,\[RightGuillemet] cr\[EAcute]e des\n\tcolonnes.\n\n\tEssayez:\n\t\tFullForm[sigz]\n\t\tFullForm[sigz[[1]]]\n\t\tI wh\n\t\tunit[Exp[(I Pi)/4] wh]\n\t\tunit[(1/Sqrt[3])(sigx + sigy + sigz)]\n\n\tVoir aussi:\n\t\tcnot, fourier, id, knot, not, phase, randomUnit, rotx,\n\t\tsigx, unitQ, wh"; unitQ::usage = "ensQ[x]\nketQ[x]\nsqoQ[x]\nstateQ[x]\nsupopQ[x]\nunitQ[x]\n\tFonctions bool\[EAcute]ennes testant la validit\[EAcute] de x selon le type de\n\tdonn\[EAcute]e correspondant au nom de la fonction.\n\t\n\tEssayez:\n\t\tunitQ[wh]\n\t\tSimplify[unitQ[fourier[3]]]\n\t\tketQ[ket[zp + zm]]\n\n\tVoir aussi:\n\t\tens, ket, sqo, state, supop, unit"; unvec::usage = "vec[x]\nunvec[v, n]\n\tMise en vecteur d'une matrice x, les colonnes de la matrice,\n\tprises de gauche \[AGrave] droite, sont concat\[EAcute]n\[EAcute]es de haut en bas.\n\n\tunvec[v, n] remet un vecteur v en matrice de n lignes.\n\n\tCes fonctions ne sont implant\[EAcute]es que pour les matrices\n\tMathematica, pas pour les \[LeftGuillemet]ket\[RightGuillemet] ou autres types de donn\[EAcute]es de\n\tQuCalc.\n\n\tNotez que pour entrer une matrice en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes et \[LeftGuillemet]CTRL-,\[RightGuillemet] cr\[EAcute]e des\n\tcolonnes\n\n\tEssayez:\n\t\tv = vec[{{1,2,3},{4,5,6},{7,8,9},{10,11,12}}]\n\t\tFullForm[v]\n\t\tunvec[v, 2]\n\n\tVoir aussi:\n\t\tkrondiv"; vec::usage = "vec[x]\nunvec[v, n]\n\tMise en vecteur d'une matrice x, les colonnes de la matrice,\n\tprises de gauche \[AGrave] droite, sont concat\[EAcute]n\[EAcute]es de haut en bas.\n\n\tunvec[v, n] remet un vecteur v en matrice de n lignes.\n\n\tCes fonctions ne sont implant\[EAcute]es que pour les matrices\n\tMathematica, pas pour les \[LeftGuillemet]ket\[RightGuillemet] ou autres types de donn\[EAcute]es de\n\tQuCalc.\n\n\tNotez que pour entrer une matrice en notation 2D,\n\t\[LeftGuillemet]CTRL-RETURN\[RightGuillemet] permet de cr\[EAcute]er des lignes et \[LeftGuillemet]CTRL-,\[RightGuillemet] cr\[EAcute]e des\n\tcolonnes\n\n\tEssayez:\n\t\tv = vec[{{1,2,3},{4,5,6},{7,8,9},{10,11,12}}]\n\t\tFullForm[v]\n\t\tunvec[v, 2]\n\n\tVoir aussi:\n\t\tkrondiv"; wh::usage = "cnot\nknot\nnot\nsigx\nsigy\nsigz\nwh\n\tDiverses constantes de type \[LeftGuillemet]unit\[RightGuillemet].\n\n\tcnot: contr\[OHat]le-not;\n\tknot: contr\[OHat]le-not invers\[EAcute];\n\tnot: n\[EAcute]gation (sur 1 qubit);\n\tsigx, sigy, sigz: matrices de Pauli;\n\twh: transformation de Walsh-Hadamard.\n\n\tEssayez:\n\t\tnot == sigx\n\n\tVoir aussi:\n\t\tunit"; xm::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; xp::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; ym::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; yp::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; zm::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; zp::usage = "phim\nphip\npsim\npsip \nxm\nxp\nym\nyp\nzm\nzp\n\tDiverses constantes de type \[LeftGuillemet]ket\[RightGuillemet].\n\n\tphim, phip, psim, psip: \[EAcute]tats de Bell.\n\n\txm, xp, ym, yp, zm, zp: \[EAcute]tats purs situ\[EAcute]s aux p\[OHat]les et aux\n\tquatre points cardinaux de l'\[EAcute]quateur de la sph\[EGrave]re de\n\tPoincar\[EAcute].\n\n\tEssayez:\n\t\tcnot . kron[wh, id[]] . ket[\"00\"] == phip\n\n\tVoir aussi:\n\t\tket"; Begin["`Private`"] (*-------------------------------------------------------------------- Utile : kron (CircleTimes) Produit de Kronecker. vec Mise en vecteur d'une matrice, les colonnes de la matrice, prises de gauche à droite, sont concaténées de haut en bas. unvec[x, m] Remet un vecteur x en matrice de m lignes. krondiv[v,w] Trouve un vecteur x, de dim. N/n x 1, tel que v==kron[w,x], où v est un vecteur de dim. N x 1 et w est un vecteur de dim. n x 1. kronexp Produit de Kronecker n fois. dotexp Produit n fois. dag (SuperDagger) Conjuguée transposée. bits Convertit un entier en binaire, i.e. une liste de 0 et 1. bnot (OverTilde) Complémente une liste de 0 et 1. bscal (CircleDot) Produit scalaire de deux chaînes de bits, i.e. deux listes de 0 et 1. bxor (CirclePlus), band (Wedge) et bor (Vee) Somme modulo 2 ("ou exclusif") de deux chaînes de bits, i.e. deux listes de 0 et 1, "et" et "ou". nullListQ Teste si tous les éléments d'une liste sont nuls. squareMatrixQ[x] Teste si x est une matrice carrée. lvProd Produit de Liouville. lvNorm Norme de Liouville, --------------------------------------------------------------------*) kron[u_ /; MatrixQ[u], v_ /; MatrixQ[v]] := Module[ {w}, w = Outer[Times, u, v]; Partition[Flatten[Transpose[w, {1,3,2,4}]], Dimensions[w][[2]] Dimensions[w][[4]]] ]; SetAttributes[kron, OneIdentity]; kron[u_, v_, w__] := Fold[kron, u, {v, w}]; CircleTimes = kron; vec[x_ /; MatrixQ[x]] := List /@ Flatten[Transpose[x]]; unvec[x_ /; MatrixQ[x], m_Integer] := Transpose[Partition[Flatten[x], m]]; krondiv[v_ /; MatrixQ[v], w_ /; MatrixQ[w]] := Transpose[ LinearSolve[ w, Transpose[unvec[v, Dimensions[v][[1]]/Dimensions[w][[1]]]] ] ]; kronexp[x_, n_Integer /; n > 0] := Module[ {i, xx}, For[i=1; xx=x, i 0] := Module[ {i, xx}, For[i=1; xx=x, i 1) && (Length[Union[s]] == 1)] := sqo[{Map[(Times[Power[Length[s], Rational[1, 2]], (#)])&, s[[1]], {2}]}]; sqo[{sqol[s_ /; Dimensions[s][[2]] == Dimensions[s][[3]]]}] := supop[s]; sqo /: Dot[sqo[s1_], sqo[s2_]] := sqo[DeleteCases[Flatten[Table[Dot[s1[[k1]], s2[[k2]]], {k1,1,Length[s1]}, {k2,1,Length[s2]}], 1], sqol[{}], 1]]; sqo /: Dot[unit[u_], sqo[s_]] := sqo[DeleteCases[Flatten[Table[Dot[sqol[{u}], s[[k]]], {k,1,Length[s]}], 1], sqol[{}], 1]]; sqo /: Dot[sqo[s_], unit[u_]] := sqo[DeleteCases[Flatten[Table[Dot[s[[k]], sqol[{u}]], {k,1,Length[s]}], 1], sqol[{}], 1]]; sqo /: Dot[supop[s1_], sqo[s2_]] := sqo[DeleteCases[Flatten[Table[Dot[sqol[s1], s2[[k]]], {k,1,Length[s2]}], 1], sqol[{}], 1]]; sqo /: Dot[sqo[s1_], supop[s2_]] := sqo[DeleteCases[Flatten[Table[Dot[s1[[k]], sqol[s2]], {k,1,Length[s1]}], 1], sqol[{}], 1]]; sqo /: kron[sqo[s1_], sqo[s2_]] := sqo[Flatten[Table[kron[s1[[k1]], s2[[k2]]], {k1,1,Length[s1]}, {k2,1,Length[s2]}], 1]]; sqo /: kron[unit[u_], sqo[s_]] := sqo[Flatten[Table[kron[sqol[{u}], s[[k]]], {k,1,Length[s]}], 1]]; sqo /: kron[sqo[s_], unit[u_]] := sqo[Flatten[Table[kron[s[[k]], sqol[{u}]], {k,1,Length[s]}], 1]]; sqo /: kron[supop[s1_], sqo[s2_]] := sqo[Flatten[Table[kron[sqol[s1], s2[[k]]], {k,1,Length[s2]}], 1]]; sqo /: kron[sqo[s1_], supop[s2_]] := sqo[Flatten[Table[kron[s1[[k]], sqol[s2]], {k,1,Length[s1]}], 1]]; sqo /: Dot[sqo[s_], state[r_]] := ens[ Module[ {m, si, ri, pi}, m = Length[s]; DeleteCases[ Table[ si = s[[i, 1]]; ri = Sum[si[[j]] . r . dag[si[[j]]], {j,1,Length[si]}]; pi = Tr[ri]; If[pi != 0, {pi, state[(1/pi) ri]}, 0, {pi, state[(1/pi) ri]}], {i,1,m} ], 0, 1 ] ] ]; sqo /: Dot[s_sqo, k_ket] := s . state[k]; sqo /: Dot[s_sqo, e_ens] := Map[({(#)[[1]], s . ((#)[[2]])})&, e, {2}]; (* Mesure complète (dont on n'ignore pas le résultat) sur 1 fil, dans la base standard. *) mmm = sqo[{sqol[{{{1,0},{0,0}}}], sqol[{{{0,0},{0,1}}}]}]; (* "Trace Out" de l'espace B, parmi les espaces (A,B,C) *) trout[nA_, nB_, nC_] := sqo[{sqol[Table[kron[IdentityMatrix[nA], {Table[If[j == jj, 1, 0], {jj,1,nB}]}, IdentityMatrix[nC]], {j,1,nB}]]}]; (* Ajout de l'ancille |0> (de l'espace B) à un état (des espaces A et C) *) anc[nA_, nB_, nC_] := sqo[{sqol[{kron[IdentityMatrix[nA], Table[{If[ii==1,1,0]}, {ii,1,nB}], IdentityMatrix[nC]]}]}]; ens /: Format[ens[e_]] := e; state[ens[e_]] := state[Sum[e[[i,1]] state[e[[i,2]]], {i,1,Length[e]}]]; ens[{l1___List,{0,r_state},l2___List}] := ens[{l1,l2}]; ens[{{1,r_state}}] := r; ens[r_state] := r; ens[{{1,k_ket}}] := k; ens[k_ket] := k; ens[ens[e_]] := ens[e]; ens[{x___List, {p_, ens[e_List]}, y___List}] := ens[{x, Sequence @@ Map[({p * (#)[[1]], (#)[[2]]})&, e, {1}], y}]; ens[{x___List, {p1_, r_}, y___List, {p2_, r_}, z___List}] := ens[{x, {p1 + p2, r}, y, z}]; ensQ[ens[e_]] := (And @@ ((# >= 0)& /@ Transpose[e][[1]])) && ((Plus @@ Transpose[e][[1]]) == 1) && (And @@ ((stateQ[state[#]])& /@ Transpose[e][[2]])); bb84 = ens[{{1/4,zp}, {1/4,zm}, {1/4,xp}, {1/4,xm}}]; kron[e_ens, k_ket] := Map[({(#)[[1]], kron[(#)[[2]], k]})&, e, {2}]; kron[k_ket, e_ens] := Map[({(#)[[1]], kron[k, (#)[[2]]]})&, e, {2}]; kron[e_ens, r_state] := Map[({(#)[[1]], kron[(#)[[2]], r]})&, e, {2}]; kron[r_state, e_ens] := Map[({(#)[[1]], kron[r, (#)[[2]]]})&, e, {2}]; (*--------------------------------------------------------------------------------- schmidt[nA, nB, k] : Calcule une décomposition de schmidt du ket k dans l'espace Alice-Bob. nA : nombre de dimensions de l'espace d'Alice, nB : nombre de dimensions de l'espace de Bob. Retourne: schmidt[{{v_1,a_1,b_1}, {v_2,a_2,b_2}, ...}] où v_i : les valeurs propres des matrices marginales, a_i : les vecteurs de la base de schmidt côté Alice, b_i : les vecteurs de la base de schmidt côté Bob. ---------------------------------------------------------------------------------*) schmidt[nA_, nB_, k_ket] := schmidt[nA, nB, k, (Simplify[#])&]; schmidt[nA_, nB_, k_ket, s_Function] := schmidt[ Apply[ ( List[ s[Sqrt[#1]], #2, ket[ krondiv[ s[(1/Sqrt[#1]) kron[state[#2][[1]], IdentityMatrix[nB]] . k[[1]]], (#2)[[1]] ] ] ] )&, DeleteCases[ s[eigenList[s[trout[nA, nB, 1] . k]]], {0,_} ], 1 ] ]; schmidt /: Format[schmidt[s_]] := s; ket[schmidt[s_]] := ket[Plus @@ Apply[((#1) kron[(#2), (#3)])& , s, {1}]]; state[s_schmidt] := state[ket[s]]; (*--------------------------------------------------------------------------------- registers : liste privée des noms de registres définis. Un registre = 1 qubit = 2 dimensions. regSet : assignation de la variable "registers". regGet : retourne la variable "registers". regOper : retourne un unit/supop/sqo opérant sur les registres donnés. regState : retourne un ket/state/ens résidant dans les registres donnés. regTrout : retourne un sqo correspondant au "trace out" des registres donnés. regAnc : retourne un sqo correspondant à l'ajout d'un système ancillaire initialisé à ket[0] dans les registres donnés. ---------------------------------------------------------------------------------*) registers = {}; regSet[l_List /; Not[Or @@ (((MatchQ[(#), _List])&) /@ l)] && (Length[Union[l]] == Length[l]) ] := Module[{}, registers = l;]; regGet[] := registers; regOper[ op:(_unit|_supop|_sqo), l_List /; (Length[Union[l]] == Length[l]) && (Union[l,registers] == Union[registers]) ] := Module[{n, s, ii, i, o}, n = Length[registers]; s = registers; o = id[n]; For[ii=1, ii<=Length[l], ii++, i = Position[s, l[[ii]]][[1, 1]]; o = cycle[n, ii, i] . o; s = Join[s[[Range[1, ii-1]]], RotateRight[s[[Range[ii, i]]]], s[[Range[i+1, n]]]] ]; dag[o] . kron[op, id[n-Length[l]]] . o ]; Subscript[op:(_unit|_supop|_sqo), x_List] := regOper[op, x]; Subscript[op:(_unit|_supop|_sqo), x__] := regOper[op, {x}]; regState[ r:(_ket|_state|_ens), l_List /; (Length[Union[l]] == Length[l]) && (Union[l] == Union[registers]) ] := Module[{n, s, ii, i, o}, n = Length[registers]; s = registers; o = id[n]; For[ii=1, ii<=Length[l], ii++, i = Position[s, l[[ii]]][[1, 1]]; o = cycle[n, ii, i] . o; s = Join[s[[Range[1, ii-1]]], RotateRight[s[[Range[ii, i]]]], s[[Range[i+1, n]]]] ]; dag[o] . r ]; Subscript[r:(_ket|_state|_ens), x_List] := regState[r, x]; Subscript[r:(_ket|_state|_ens), x__] := regState[r, {x}]; kron[regState[r1:(_ket|_state|_ens), x1_List], regState[r2:(_ket|_state|_ens), x2_List]] := regState[kron[r1,r2], Join[x1, x2]]; regTrout[{}] := id[Length[registers]]; regTrout[l_List /; (Length[l] > 0) && (Length[Union[l]] == Length[l]) && (Union[l,registers] == Union[registers])] := Module[{n, s, ii, i, o}, s = registers; n = Length[s]; o = id[n]; For[ii=1, ii<=Length[l], ii++, i = Position[s, l[[ii]]][[1, 1]]; o = trout[2^(i-1), 2, 2^(n-i)] . o; s = DeleteCases[s, l[[ii]]]; n-- ]; o ]; regAnc[{}] := id[Length[registers]]; regAnc[l_List /; (Length[l] > 0) && (Length[Union[l]] == Length[l]) && (Union[l,registers] == Union[registers])] := Module[{n, ii, i, o}, s = Union[Flatten[((Position[registers, (#)])&) /@ l]]; n = Length[registers] - Length[s]; o = id[n]; For[ii=1, ii<=Length[s], ii++, i = s[[ii]]; o = anc[2^(i-1), 2, 2^(n-i+1)] . o; n++ ]; o ]; End[]; EndPackage[];