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 ExprRange, Variable, VertExprArray, t
from proveit.linear_algebra import ScalarMult, TensorProd, VecAdd
from proveit.logic import Implies
from proveit.numbers import Add, Exp, Interval, Mult, Neg, e, frac, i, one, pi, sqrt, two, zero
from proveit.physics.quantum import ket0, ket1, ket_plus
from proveit.physics.quantum.QPE import QPE1, _U, _ket_u, _phase, _psi_t_ket, _s
from proveit.physics.quantum.circuits import Gate, Input, MultiQubitElem, Output, Qcircuit, QcircuitEquiv
In [2]:
# build up the expression from sub-expressions
sub_expr1 = Variable("_a", latex_format = r"{_{-}a}")
sub_expr2 = Add(t, one)
sub_expr3 = Add(t, _s)
sub_expr4 = Interval(sub_expr2, sub_expr3)
sub_expr5 = Interval(one, sub_expr3)
sub_expr6 = MultiQubitElem(element = Gate(operation = QPE1(_U, t), part = sub_expr1), targets = sub_expr5)
sub_expr7 = MultiQubitElem(element = Output(state = TensorProd(_psi_t_ket, _ket_u), part = sub_expr1), targets = sub_expr5)
sub_expr8 = [ExprRange(sub_expr1, Input(state = ket_plus), one, t), ExprRange(sub_expr1, MultiQubitElem(element = Input(state = _ket_u, part = sub_expr1), targets = sub_expr4), one, _s)]
sub_expr9 = [ExprRange(sub_expr1, sub_expr6, one, t), ExprRange(sub_expr1, sub_expr6, sub_expr2, sub_expr3)]
sub_expr10 = [ExprRange(sub_expr1, sub_expr7, one, t), ExprRange(sub_expr1, sub_expr7, sub_expr2, sub_expr3).with_wrapping_at(2,6)]
sub_expr11 = [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)))), Add(Neg(t), one), zero).with_decreasing_order(), ExprRange(sub_expr1, MultiQubitElem(element = Output(state = _ket_u, part = sub_expr1), targets = sub_expr4), one, _s)]
expr = Implies(QcircuitEquiv(Qcircuit(vert_expr_array = VertExprArray(sub_expr11)), Qcircuit(vert_expr_array = VertExprArray(sub_expr10))), QcircuitEquiv(Qcircuit(vert_expr_array = VertExprArray(sub_expr8, sub_expr9, sub_expr11)), Qcircuit(vert_expr_array = VertExprArray(sub_expr8, sub_expr9, sub_expr10))).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{
& \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)} \\
& \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)} \\
& \qout{\vdots} \\
& \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)} \\
& \qout{\lvert u \rangle}
} \end{array}\right) \cong \left(\begin{array}{c} \Qcircuit@C=1em @R=.7em{
& \multiqout{1}{\lvert \psi_{t} \rangle {\otimes} \lvert u \rangle} \\
& \ghostqout{\lvert \psi_{t} \rangle {\otimes} \lvert u \rangle}
} \end{array}\right)\right) \Rightarrow  \\ \left(\begin{array}{c} \begin{array}{l} \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) \\  \cong \left(\begin{array}{c} \Qcircuit@C=1em @R=.7em{
\qin{\lvert + \rangle} & \multigate{4}{\textrm{QPE}_1\left(U, t\right)} & \multiqout{4}{\lvert \psi_{t} \rangle {\otimes} \lvert u \rangle} \\
\qin{\lvert + \rangle} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \ghostqout{\lvert \psi_{t} \rangle {\otimes} \lvert u \rangle} \\
\qin{\begin{array}{c}:\\ \left(t - 3\right) \times \\:\end{array}} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \ghostqout{\lvert \psi_{t} \rangle {\otimes} \lvert u \rangle} \\
\qin{\lvert + \rangle} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \ghostqout{\lvert \psi_{t} \rangle {\otimes} \lvert u \rangle} \\
\qin{\lvert u \rangle} & \ghost{\textrm{QPE}_1\left(U, t\right)} & \ghostqout{\lvert \psi_{t} \rangle {\otimes} \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
operand: 17
9Operationoperator: 15
operand: 20
10Operationoperator: 15
operands: 14
11Operationoperator: 15
operands: 16
12ExprTuple17
13ExprTuple20
14ExprTuple18, 19, 17
15Literal
16ExprTuple18, 19, 20
17ExprTuple21, 22
18ExprTuple23, 24
19ExprTuple25, 26
20ExprTuple27, 28
21ExprRangelambda_map: 29
start_index: 30
end_index: 101
22ExprRangelambda_map: 31
start_index: 112
end_index: 93
23ExprRangelambda_map: 32
start_index: 112
end_index: 104
24ExprRangelambda_map: 33
start_index: 112
end_index: 93
25ExprRangelambda_map: 34
start_index: 112
end_index: 104
26ExprRangelambda_map: 34
start_index: 73
end_index: 76
27ExprRangelambda_map: 35
start_index: 112
end_index: 104
28ExprRangelambda_map: 35
start_index: 73
end_index: 76
29Lambdaparameter: 125
body: 36
30Operationoperator: 85
operands: 37
31Lambdaparameter: 125
body: 38
32Lambdaparameter: 125
body: 39
33Lambdaparameter: 125
body: 40
34Lambdaparameter: 125
body: 41
35Lambdaparameter: 125
body: 42
36Operationoperator: 66
operands: 43
37ExprTuple44, 112
38Operationoperator: 49
operands: 45
39Operationoperator: 61
operands: 46
40Operationoperator: 49
operands: 47
41Operationoperator: 49
operands: 48
42Operationoperator: 49
operands: 50
43NamedExprsstate: 51
44Operationoperator: 123
operand: 104
45NamedExprselement: 52
targets: 55
46NamedExprsstate: 53
47NamedExprselement: 54
targets: 55
48NamedExprselement: 56
targets: 58
49Literal
50NamedExprselement: 57
targets: 58
51Operationoperator: 96
operands: 59
52Operationoperator: 66
operands: 62
53Operationoperator: 108
operand: 72
54Operationoperator: 61
operands: 62
55Operationoperator: 68
operands: 63
56Operationoperator: 64
operands: 65
57Operationoperator: 66
operands: 67
58Operationoperator: 68
operands: 69
59ExprTuple70, 71
60ExprTuple72
61Literal
62NamedExprsstate: 92
part: 125
63ExprTuple73, 76
64Literal
65NamedExprsoperation: 74
part: 125
66Literal
67NamedExprsstate: 75
part: 125
68Literal
69ExprTuple112, 76
70Operationoperator: 105
operands: 77
71Operationoperator: 78
operands: 79
72Literal
73Operationoperator: 85
operands: 80
74Operationoperator: 81
operands: 82
75Operationoperator: 83
operands: 84
76Operationoperator: 85
operands: 86
77ExprTuple112, 87
78Literal
79ExprTuple88, 89
80ExprTuple104, 112
81Literal
82ExprTuple90, 104
83Literal
84ExprTuple91, 92
85Literal
86ExprTuple104, 93
87Operationoperator: 119
operands: 94
88Operationoperator: 108
operand: 101
89Operationoperator: 96
operands: 97
90Literal
91Operationoperator: 98
operand: 104
92Literal
93Literal
94ExprTuple121, 100
95ExprTuple101
96Literal
97ExprTuple102, 103
98Literal
99ExprTuple104
100Operationoperator: 105
operands: 106
101Literal
102Operationoperator: 119
operands: 107
103Operationoperator: 108
operand: 112
104Variable
105Literal
106ExprTuple112, 121
107ExprTuple110, 111
108Literal
109ExprTuple112
110Literal
111Operationoperator: 113
operands: 114
112Literal
113Literal
114ExprTuple121, 115, 116, 117, 118
115Literal
116Literal
117Operationoperator: 119
operands: 120
118Literal
119Literal
120ExprTuple121, 122
121Literal
122Operationoperator: 123
operand: 125
123Literal
124ExprTuple125
125Variable