logo

Expression of type Implies

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, Variable, VertExprArray, t
from proveit.linear_algebra import MatrixExp, ScalarMult, VecAdd
from proveit.logic import Equals, Implies, 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, QcircuitEquiv
In [2]:
# build up the expression from sub-expressions
sub_expr1 = Variable("_b", latex_format = r"{_{-}b}")
sub_expr2 = Variable("_a", latex_format = r"{_{-}a}")
sub_expr3 = Add(t, one)
sub_expr4 = Add(sub_expr1, t)
sub_expr5 = Add(t, _s)
sub_expr6 = Interval(sub_expr3, sub_expr5)
sub_expr7 = Add(Neg(t), one)
sub_expr8 = MultiQubitElem(element = Gate(operation = QPE1(_U, t), part = sub_expr2), targets = Interval(one, sub_expr5))
sub_expr9 = [ExprRange(sub_expr2, sub_expr8, one, t), ExprRange(sub_expr2, sub_expr8, sub_expr3, sub_expr5)]
sub_expr10 = [ExprRange(sub_expr2, Input(state = ket_plus), one, t), ExprRange(sub_expr2, MultiQubitElem(element = Input(state = _ket_u, part = sub_expr2), targets = sub_expr6), one, _s)]
sub_expr11 = ExprRange(sub_expr1, [ExprRange(sub_expr2, ConditionalSet(Conditional(MultiQubitElem(element = CONTROL, targets = Set(sub_expr3)), Equals(sub_expr4, sub_expr2)), Conditional(Igate, NotEquals(sub_expr4, sub_expr2))), one, t).with_case_simplification(), ExprRange(sub_expr2, MultiQubitElem(element = Gate(operation = MatrixExp(_U, Exp(two, Neg(sub_expr1))), part = sub_expr2), targets = sub_expr6), one, _s)], sub_expr7, zero).with_decreasing_order()
sub_expr12 = [ExprRange(sub_expr2, Output(state = ScalarMult(frac(one, sqrt(two)), VecAdd(ket0, ScalarMult(Exp(e, Mult(two, pi, i, Exp(two, Neg(sub_expr2)), _phase)), ket1)))), sub_expr7, zero).with_decreasing_order(), ExprRange(sub_expr2, MultiQubitElem(element = Output(state = _ket_u, part = sub_expr2), targets = sub_expr6), one, _s)]
expr = Implies(QcircuitEquiv(Qcircuit(vert_expr_array = VertExprArray(sub_expr11)), Qcircuit(vert_expr_array = VertExprArray(sub_expr9))), QcircuitEquiv(Qcircuit(vert_expr_array = VertExprArray(sub_expr10, sub_expr11, sub_expr12)), Qcircuit(vert_expr_array = VertExprArray(sub_expr10, sub_expr9, sub_expr12))).with_wrapping_at(1)).with_wrapping_at(2)
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())
\begin{array}{c} \begin{array}{l} \left(\left(\begin{array}{c} \Qcircuit@C=1em @R=.7em{
& \control{} \qw \qwx[1] & \qw & \gate{\cdots} \qwx[1] & \qw & \qw \\
& \qw \qwx[1] & \control{} \qw \qwx[1] & \gate{\cdots} \qwx[1] & \qw & \qw \\
& \gate{\vdots} \qwx[1] & \gate{\vdots} \qwx[1] & \gate{\ddots} \qwx[1] & \gate{\vdots} & \qw \\
& \qw \qwx[1] & \qw \qwx[1] & \gate{\cdots} \qwx[1] & \control{} \qw \qwx[1] & \qw \\
& \gate{U^{2^{t - 1}}} & \gate{U^{2^{t - 2}}} & \gate{\cdots} & \gate{U^{2^{0}}} & { /^{s} } \qw
} \end{array}\right) \cong \left(\begin{array}{c} \Qcircuit@C=1em @R=.7em{
& \multigate{1}{\textrm{QPE}_1\left(U, t\right)} & { /^{t} } \qw \\
& \ghost{\textrm{QPE}_1\left(U, t\right)} & { /^{s} } \qw
} \end{array}\right)\right) \Rightarrow  \\ \left(\begin{array}{c} \begin{array}{l} \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}\right) \\  \cong \left(\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) \end{array} \end{array}\right) \end{array} \end{array}
In [5]:
stored_expr.style_options()
namedescriptiondefaultcurrent valuerelated methods
operation'infix' or 'function' style formattinginfixinfix
wrap_positionsposition(s) at which wrapping is to occur; '2 n - 1' is after the nth operand, '2 n' is after the nth operation.()(2)('with_wrapping_at', 'with_wrap_before_operator', 'with_wrap_after_operator', 'without_wrapping', 'wrap_positions')
justificationif any wrap positions are set, justify to the 'left', 'center', or 'right'centercenter('with_justification',)
directionDirection of the relation (normal or reversed)normalnormal('with_direction_reversed', 'is_reversed')
In [6]:
# display the expression information
stored_expr.expr_info()
 core typesub-expressionsexpression
0Operationoperator: 1
operands: 2
1Literal
2ExprTuple3, 4
3Operationoperator: 6
operands: 5
4Operationoperator: 6
operands: 7
5ExprTuple8, 9
6Literal
7ExprTuple10, 11
8Operationoperator: 15
operands: 12
9Operationoperator: 15
operand: 19
10Operationoperator: 15
operands: 14
11Operationoperator: 15
operands: 16
12ExprTuple17
13ExprTuple19
14ExprTuple18, 17, 20
15Literal
16ExprTuple18, 19, 20
17ExprRangelambda_map: 21
start_index: 33
end_index: 121
18ExprTuple22, 23
19ExprTuple24, 25
20ExprTuple26, 27
21Lambdaparameter: 141
body: 28
22ExprRangelambda_map: 29
start_index: 137
end_index: 136
23ExprRangelambda_map: 30
start_index: 137
end_index: 119
24ExprRangelambda_map: 31
start_index: 137
end_index: 136
25ExprRangelambda_map: 31
start_index: 124
end_index: 99
26ExprRangelambda_map: 32
start_index: 33
end_index: 121
27ExprRangelambda_map: 34
start_index: 137
end_index: 119
28ExprTuple35, 36
29Lambdaparameter: 152
body: 37
30Lambdaparameter: 152
body: 38
31Lambdaparameter: 152
body: 39
32Lambdaparameter: 152
body: 40
33Operationoperator: 131
operands: 41
34Lambdaparameter: 152
body: 42
35ExprRangelambda_map: 43
start_index: 137
end_index: 136
36ExprRangelambda_map: 44
start_index: 137
end_index: 119
37Operationoperator: 64
operands: 45
38Operationoperator: 91
operands: 46
39Operationoperator: 91
operands: 47
40Operationoperator: 68
operands: 48
41ExprTuple49, 137
42Operationoperator: 91
operands: 50
43Lambdaparameter: 152
body: 51
44Lambdaparameter: 152
body: 52
45NamedExprsstate: 53
46NamedExprselement: 54
targets: 73
47NamedExprselement: 55
targets: 56
48NamedExprsstate: 57
49Operationoperator: 150
operand: 136
50NamedExprselement: 59
targets: 73
51Operationoperator: 60
operands: 61
52Operationoperator: 91
operands: 62
53Operationoperator: 129
operand: 74
54Operationoperator: 64
operands: 69
55Operationoperator: 94
operands: 65
56Operationoperator: 84
operands: 66
57Operationoperator: 112
operands: 67
58ExprTuple136
59Operationoperator: 68
operands: 69
60Literal
61ExprTuple70, 71
62NamedExprselement: 72
targets: 73
63ExprTuple74
64Literal
65NamedExprsoperation: 75
part: 152
66ExprTuple137, 99
67ExprTuple76, 77
68Literal
69NamedExprsstate: 78
part: 152
70Conditionalvalue: 79
condition: 80
71Conditionalvalue: 81
condition: 82
72Operationoperator: 94
operands: 83
73Operationoperator: 84
operands: 85
74Literal
75Operationoperator: 86
operands: 87
76Operationoperator: 126
operands: 88
77Operationoperator: 89
operands: 90
78Literal
79Operationoperator: 91
operands: 92
80Operationoperator: 93
operands: 97
81Operationoperator: 94
operands: 95
82Operationoperator: 96
operands: 97
83NamedExprsoperation: 98
part: 152
84Literal
85ExprTuple124, 99
86Literal
87ExprTuple117, 136
88ExprTuple137, 100
89Literal
90ExprTuple101, 102
91Literal
92NamedExprselement: 103
targets: 104
93Literal
94Literal
95NamedExprsoperation: 105
96Literal
97ExprTuple106, 152
98Operationoperator: 107
operands: 108
99Operationoperator: 131
operands: 109
100Operationoperator: 146
operands: 110
101Operationoperator: 129
operand: 121
102Operationoperator: 112
operands: 113
103Literal
104Operationoperator: 114
operand: 124
105Literal
106Operationoperator: 131
operands: 116
107Literal
108ExprTuple117, 118
109ExprTuple136, 119
110ExprTuple148, 120
111ExprTuple121
112Literal
113ExprTuple122, 123
114Literal
115ExprTuple124
116ExprTuple141, 136
117Literal
118Operationoperator: 146
operands: 125
119Literal
120Operationoperator: 126
operands: 127
121Literal
122Operationoperator: 146
operands: 128
123Operationoperator: 129
operand: 137
124Operationoperator: 131
operands: 132
125ExprTuple148, 133
126Literal
127ExprTuple137, 148
128ExprTuple134, 135
129Literal
130ExprTuple137
131Literal
132ExprTuple136, 137
133Operationoperator: 150
operand: 141
134Literal
135Operationoperator: 139
operands: 140
136Variable
137Literal
138ExprTuple141
139Literal
140ExprTuple148, 142, 143, 144, 145
141Variable
142Literal
143Literal
144Operationoperator: 146
operands: 147
145Literal
146Literal
147ExprTuple148, 149
148Literal
149Operationoperator: 150
operand: 152
150Literal
151ExprTuple152
152Variable