logo

Expression of type ExprTuple

from the theory of proveit.physics.quantum.QPE

In [1]:
import proveit
# Automation is not needed when building an expression:
proveit.defaults.automation = False # This will speed things up.
proveit.defaults.inline_pngs = False # Makes files smaller.
%load_expr # Load the stored expression as 'stored_expr'
# import Expression classes needed to build the expression
from proveit import Conditional, ConditionalSet, ExprRange, ExprTuple, Variable, VertExprArray, t
from proveit.linear_algebra import MatrixExp, ScalarMult, VecAdd
from proveit.logic import Equals, NotEquals, Set
from proveit.numbers import Add, Exp, Interval, Mult, Neg, e, frac, i, one, pi, sqrt, two, zero
from proveit.physics.quantum import CONTROL, ket0, ket1, ket_plus
from proveit.physics.quantum.QPE import QPE1, _U, _ket_u, _phase, _s
from proveit.physics.quantum.circuits import Gate, Igate, Input, MultiQubitElem, Output, Qcircuit
In [2]:
# build up the expression from sub-expressions
sub_expr1 = Variable("_a", latex_format = r"{_{-}a}")
sub_expr2 = Variable("_b", latex_format = r"{_{-}b}")
sub_expr3 = Add(t, one)
sub_expr4 = Add(t, _s)
sub_expr5 = Add(sub_expr2, t)
sub_expr6 = Interval(sub_expr3, sub_expr4)
sub_expr7 = Add(Neg(t), one)
sub_expr8 = MultiQubitElem(element = Gate(operation = QPE1(_U, t), part = sub_expr1), targets = Interval(one, sub_expr4))
sub_expr9 = [ExprRange(sub_expr1, Input(state = ket_plus), one, t), ExprRange(sub_expr1, MultiQubitElem(element = Input(state = _ket_u, part = sub_expr1), targets = sub_expr6), one, _s)]
sub_expr10 = [ExprRange(sub_expr1, Output(state = ScalarMult(frac(one, sqrt(two)), VecAdd(ket0, ScalarMult(Exp(e, Mult(two, pi, i, Exp(two, Neg(sub_expr1)), _phase)), ket1)))), sub_expr7, zero).with_decreasing_order(), ExprRange(sub_expr1, MultiQubitElem(element = Output(state = _ket_u, part = sub_expr1), targets = sub_expr6), one, _s)]
expr = ExprTuple(Qcircuit(vert_expr_array = VertExprArray(sub_expr9, ExprRange(sub_expr2, [ExprRange(sub_expr1, ConditionalSet(Conditional(MultiQubitElem(element = CONTROL, targets = Set(sub_expr3)), Equals(sub_expr5, sub_expr1)), Conditional(Igate, NotEquals(sub_expr5, sub_expr1))), one, t).with_case_simplification(), ExprRange(sub_expr1, MultiQubitElem(element = Gate(operation = MatrixExp(_U, Exp(two, Neg(sub_expr2))), part = sub_expr1), targets = sub_expr6), one, _s)], sub_expr7, zero).with_decreasing_order(), sub_expr10)), Qcircuit(vert_expr_array = VertExprArray(sub_expr9, [ExprRange(sub_expr1, sub_expr8, one, t), ExprRange(sub_expr1, sub_expr8, sub_expr3, sub_expr4)], sub_expr10)))
expr:
In [3]:
# check that the built expression is the same as the stored expression
assert expr == stored_expr
assert expr._style_id == stored_expr._style_id
print("Passed sanity check: expr matches stored_expr")
Passed sanity check: expr matches stored_expr
In [4]:
# Show the LaTeX representation of the expression for convenience if you need it.
print(stored_expr.latex())
\left(\begin{array}{c} \Qcircuit@C=1em @R=.7em{
\qin{\lvert + \rangle} & \control{} \qw \qwx[1] & \qw & \gate{\cdots} \qwx[1] & \qw & \qout{\frac{1}{\sqrt{2}} \cdot \left(\lvert 0 \rangle + \left(\mathsf{e}^{2 \cdot \pi \cdot \mathsf{i} \cdot 2^{t - 1} \cdot \varphi} \cdot \lvert 1 \rangle\right)\right)} \\
\qin{\lvert + \rangle} & \qw \qwx[1] & \control{} \qw \qwx[1] & \gate{\cdots} \qwx[1] & \qw & \qout{\frac{1}{\sqrt{2}} \cdot \left(\lvert 0 \rangle + \left(\mathsf{e}^{2 \cdot \pi \cdot \mathsf{i} \cdot 2^{t - 2} \cdot \varphi} \cdot \lvert 1 \rangle\right)\right)} \\
\qin{\begin{array}{c}:\\ \left(t - 3\right) \times \\:\end{array}} & \gate{\vdots} \qwx[1] & \gate{\vdots} \qwx[1] & \gate{\ddots} \qwx[1] & \gate{\vdots} & \qout{\vdots} \\
\qin{\lvert + \rangle} & \qw \qwx[1] & \qw \qwx[1] & \gate{\cdots} \qwx[1] & \control{} \qw \qwx[1] & \qout{\frac{1}{\sqrt{2}} \cdot \left(\lvert 0 \rangle + \left(\mathsf{e}^{2 \cdot \pi \cdot \mathsf{i} \cdot 2^{0} \cdot \varphi} \cdot \lvert 1 \rangle\right)\right)} \\
\qin{\lvert u \rangle} & \gate{U^{2^{t - 1}}} & \gate{U^{2^{t - 2}}} & \gate{\cdots} & \gate{U^{2^{0}}} & \qout{\lvert u \rangle}
} \end{array}, \begin{array}{c} \Qcircuit@C=1em @R=.7em{
\qin{\lvert + \rangle} & \multigate{4}{\textrm{QPE}_1\left(U, t\right)} & \qout{\frac{1}{\sqrt{2}} \cdot \left(\lvert 0 \rangle + \left(\mathsf{e}^{2 \cdot \pi \cdot \mathsf{i} \cdot 2^{t - 1} \cdot \varphi} \cdot \lvert 1 \rangle\right)\right)} \\
\qin{\lvert + \rangle} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \qout{\frac{1}{\sqrt{2}} \cdot \left(\lvert 0 \rangle + \left(\mathsf{e}^{2 \cdot \pi \cdot \mathsf{i} \cdot 2^{t - 2} \cdot \varphi} \cdot \lvert 1 \rangle\right)\right)} \\
\qin{\begin{array}{c}:\\ \left(t - 3\right) \times \\:\end{array}} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \qout{\vdots} \\
\qin{\lvert + \rangle} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \qout{\frac{1}{\sqrt{2}} \cdot \left(\lvert 0 \rangle + \left(\mathsf{e}^{2 \cdot \pi \cdot \mathsf{i} \cdot 2^{0} \cdot \varphi} \cdot \lvert 1 \rangle\right)\right)} \\
\qin{\lvert u \rangle} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \qout{\lvert u \rangle}
} \end{array}\right)
In [5]:
stored_expr.style_options()
namedescriptiondefaultcurrent valuerelated methods
wrap_positionsposition(s) at which wrapping is to occur; 'n' is after the nth comma.()()('with_wrapping_at',)
justificationif any wrap positions are set, justify to the 'left', 'center', or 'right'leftleft('with_justification',)
In [6]:
# display the expression information
stored_expr.expr_info()
 core typesub-expressionsexpression
0ExprTuple1, 2
1Operationoperator: 4
operands: 3
2Operationoperator: 4
operands: 5
3ExprTuple7, 6, 9
4Literal
5ExprTuple7, 8, 9
6ExprRangelambda_map: 10
start_index: 22
end_index: 110
7ExprTuple11, 12
8ExprTuple13, 14
9ExprTuple15, 16
10Lambdaparameter: 130
body: 17
11ExprRangelambda_map: 18
start_index: 126
end_index: 125
12ExprRangelambda_map: 19
start_index: 126
end_index: 108
13ExprRangelambda_map: 20
start_index: 126
end_index: 125
14ExprRangelambda_map: 20
start_index: 113
end_index: 88
15ExprRangelambda_map: 21
start_index: 22
end_index: 110
16ExprRangelambda_map: 23
start_index: 126
end_index: 108
17ExprTuple24, 25
18Lambdaparameter: 141
body: 26
19Lambdaparameter: 141
body: 27
20Lambdaparameter: 141
body: 28
21Lambdaparameter: 141
body: 29
22Operationoperator: 120
operands: 30
23Lambdaparameter: 141
body: 31
24ExprRangelambda_map: 32
start_index: 126
end_index: 125
25ExprRangelambda_map: 33
start_index: 126
end_index: 108
26Operationoperator: 53
operands: 34
27Operationoperator: 80
operands: 35
28Operationoperator: 80
operands: 36
29Operationoperator: 57
operands: 37
30ExprTuple38, 126
31Operationoperator: 80
operands: 39
32Lambdaparameter: 141
body: 40
33Lambdaparameter: 141
body: 41
34NamedExprsstate: 42
35NamedExprselement: 43
targets: 62
36NamedExprselement: 44
targets: 45
37NamedExprsstate: 46
38Operationoperator: 139
operand: 125
39NamedExprselement: 48
targets: 62
40Operationoperator: 49
operands: 50
41Operationoperator: 80
operands: 51
42Operationoperator: 118
operand: 63
43Operationoperator: 53
operands: 58
44Operationoperator: 83
operands: 54
45Operationoperator: 73
operands: 55
46Operationoperator: 101
operands: 56
47ExprTuple125
48Operationoperator: 57
operands: 58
49Literal
50ExprTuple59, 60
51NamedExprselement: 61
targets: 62
52ExprTuple63
53Literal
54NamedExprsoperation: 64
part: 141
55ExprTuple126, 88
56ExprTuple65, 66
57Literal
58NamedExprsstate: 67
part: 141
59Conditionalvalue: 68
condition: 69
60Conditionalvalue: 70
condition: 71
61Operationoperator: 83
operands: 72
62Operationoperator: 73
operands: 74
63Literal
64Operationoperator: 75
operands: 76
65Operationoperator: 115
operands: 77
66Operationoperator: 78
operands: 79
67Literal
68Operationoperator: 80
operands: 81
69Operationoperator: 82
operands: 86
70Operationoperator: 83
operands: 84
71Operationoperator: 85
operands: 86
72NamedExprsoperation: 87
part: 141
73Literal
74ExprTuple113, 88
75Literal
76ExprTuple106, 125
77ExprTuple126, 89
78Literal
79ExprTuple90, 91
80Literal
81NamedExprselement: 92
targets: 93
82Literal
83Literal
84NamedExprsoperation: 94
85Literal
86ExprTuple95, 141
87Operationoperator: 96
operands: 97
88Operationoperator: 120
operands: 98
89Operationoperator: 135
operands: 99
90Operationoperator: 118
operand: 110
91Operationoperator: 101
operands: 102
92Literal
93Operationoperator: 103
operand: 113
94Literal
95Operationoperator: 120
operands: 105
96Literal
97ExprTuple106, 107
98ExprTuple125, 108
99ExprTuple137, 109
100ExprTuple110
101Literal
102ExprTuple111, 112
103Literal
104ExprTuple113
105ExprTuple130, 125
106Literal
107Operationoperator: 135
operands: 114
108Literal
109Operationoperator: 115
operands: 116
110Literal
111Operationoperator: 135
operands: 117
112Operationoperator: 118
operand: 126
113Operationoperator: 120
operands: 121
114ExprTuple137, 122
115Literal
116ExprTuple126, 137
117ExprTuple123, 124
118Literal
119ExprTuple126
120Literal
121ExprTuple125, 126
122Operationoperator: 139
operand: 130
123Literal
124Operationoperator: 128
operands: 129
125Variable
126Literal
127ExprTuple130
128Literal
129ExprTuple137, 131, 132, 133, 134
130Variable
131Literal
132Literal
133Operationoperator: 135
operands: 136
134Literal
135Literal
136ExprTuple137, 138
137Literal
138Operationoperator: 139
operand: 141
139Literal
140ExprTuple141
141Variable