##// END OF EJS Templates
Merge pull request #1490 from minrk/raw...
Merge pull request #1490 from minrk/raw rename plaintext cell -> raw cell Raw cells should be *untransformed* when writing various output formats, as the point of them is to let users pass through IPython to their rendered document format (rst, latex, etc.). This is different from what is the logical meaning of 'plaintext', which would suggest that the contents should be preserved as unformatted plaintext (e.g. in a `<pre>` tag, or literal block). In the UI, these cells will be displayed as 'Raw Text'. WARNING: any existing v3 notebooks which use plaintext cells, when read in by versions after this merge, will silently rename those cells to 'raw'. But if such a notebook is uploaded into a pre-merge IPython, cells labeled as 'raw' will simply *not be displayed*.

File last commit:

r6035:3077781f
r6480:a0e0f391 merge
Show More
sympy_quantum_computing.ipynb
409 lines | 26.9 KiB | text/plain | TextLexer
/ docs / examples / notebooks / sympy_quantum_computing.ipynb

Basic Symbolic Quantum Mechanics with SymPy

We first load the IPython extensions that enable LaTeX-based mathematical printing of SymPy objects, and then import the quantum computing libraries from SymPy.

In [1]:
%load_ext sympyprinting
In [2]:
from sympy import sqrt, symbols, Rational
from sympy import expand, Eq, Symbol, simplify, exp, sin
from sympy.physics.quantum import *
from sympy.physics.quantum.qubit import *
from sympy.physics.quantum.gate import *
from sympy.physics.quantum.grover import *
from sympy.physics.quantum.qft import QFT, IQFT, Fourier
from sympy.physics.quantum.circuitplot import circuit_plot

Bras and Kets

Create symbolic states

In [3]:
phi, psi = Ket('phi'), Ket('psi')
alpha, beta = symbols('alpha beta', complex=True)

Create a superposition

In [4]:
state = alpha*psi + beta*phi; state
Out[4]:
$$\alpha {\left|\psi\right\rangle } + \beta {\left|\phi\right\rangle }$$

Dagger the superposition and multiply the original

In [5]:
ip = Dagger(state)*state; ip
Out[5]:
$$\left(\overline{\alpha} {\left\langle \psi\right|} + \overline{\beta} {\left\langle \phi\right|}\right) \left(\alpha {\left|\psi\right\rangle } + \beta {\left|\phi\right\rangle }\right)$$

Distribute

In [6]:
qapply(expand(ip))
Out[6]:
$$\alpha \overline{\alpha} \left\langle \psi \right. {\left|\psi\right\rangle } + \alpha \overline{\beta} \left\langle \phi \right. {\left|\psi\right\rangle } + \beta \overline{\alpha} \left\langle \psi \right. {\left|\phi\right\rangle } + \beta \overline{\beta} \left\langle \phi \right. {\left|\phi\right\rangle }$$

Operators

Create symbolic operators

In [7]:
A = Operator('A')
B = Operator('B')
C = Operator('C')

Test commutativity

In [8]:
A*B == B*A
Out[8]:
False

Distribute A+B squared

In [9]:
expand((A+B)**2)
Out[9]:
$$A B + \left(A\right)^{2} + B A + \left(B\right)^{2}$$

Create a commutator

In [10]:
comm = Commutator(A,B); comm
Out[10]:
$$\left[A,B\right]$$

Carry out the commutator

In [11]:
comm.doit()
Out[11]:
$$A B - B A$$

Create a more fancy commutator

In [12]:
comm = Commutator(A*B,B+C); comm
Out[12]:
$$\left[A B,B + C\right]$$

Expand the commutator

In [13]:
comm.expand(commutator=True)
Out[13]:
$$\left[A,B\right] B + \left[A,C\right] B + A \left[B,C\right]$$

Carry out and expand the commutators

In [14]:
_.doit().expand()
Out[14]:
$$A B C + A \left(B\right)^{2} - B A B - C A B$$

Take the dagger

In [15]:
Dagger(_)
Out[15]:
$$- B^{\dagger} A^{\dagger} B^{\dagger} - B^{\dagger} A^{\dagger} C^{\dagger} + \left(B^{\dagger}\right)^{2} A^{\dagger} + C^{\dagger} B^{\dagger} A^{\dagger}$$