From 15c46907b5fe2b47b15160ded65cb3e3df6c2ab5 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 3 Oct 2024 09:02:46 +0200 Subject: [PATCH 01/32] add dummy files --- .../thumbnail_large_kak_theorem.png | Bin 0 -> 38835 bytes .../OGthumbnail_kak_theorem.png | Bin 0 -> 36336 bytes .../thumbnail_kak_theorem.png | Bin 0 -> 25382 bytes .../tutorial_kak_theorem.metadata.json | 39 ++++++++++++++++++ demonstrations/tutorial_kak_theorem.py | 25 +++++++++++ 5 files changed, 64 insertions(+) create mode 100644 _static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_kak_theorem.png create mode 100644 _static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png create mode 100644 _static/demo_thumbnails/regular_demo_thumbnails/thumbnail_kak_theorem.png create mode 100644 demonstrations/tutorial_kak_theorem.metadata.json create mode 100644 demonstrations/tutorial_kak_theorem.py diff --git a/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_kak_theorem.png b/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_kak_theorem.png new file mode 100644 index 0000000000000000000000000000000000000000..3a755c347dd84350a7dda6554f8cc9a7f119a384 GIT binary patch literal 38835 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 literal 0 HcmV?d00001 diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json new file mode 100644 index 0000000000..ae224f0a23 --- /dev/null +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -0,0 +1,39 @@ +{ + "title": "The KAK theorem", + "authors": [ + { + "username": "dwierichs" + } + ], + "dateOfPublication": "2024-12-05T00:00:00+00:00", + "dateOfLastModification": "2024-12-05T00:00:00+00:00", + "categories": [ + "Quantum Computing", + "Algorithms" + ], + "tags": [], + "previewImages": [ + { + "type": "thumbnail", + "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_kak_theorem.png" + }, + { + "type": "large_thumbnail", + "uri": "/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_kak_theorem.png" + } + ], + "seoDescription": "Learn about the KAK theorem and how it powers circuit decompositions.", + "doi": "", + "canonicalURL": "/qml/demos/tutorial_kak_theorem", + "references": [ + ], + "basedOnPapers": [], + "referencedByPapers": [], + "relatedContent": [ + { + "type": "demonstration", + "id": "tutorial_liealgebra", + "weight": 1.0 + } + ] +} diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py new file mode 100644 index 0000000000..42abcbf953 --- /dev/null +++ b/demonstrations/tutorial_kak_theorem.py @@ -0,0 +1,25 @@ +r"""The KAK theorem +------------------- + +.. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png + :align: center + :width: 60% + :target: javascript:void(0) +""" + +import pennylane as qml + +###################################################################### +###################################################################### +# +# References +# ---------- +# +# .. [#ref1] +# +# Author1, Author2 +# "Title" +# `arXiv:quant-ph/9807006 `__, 1998. +# +# About the author +# ---------------- From 537225987bf42c10040fc378355551ca1c6c9334 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 3 Oct 2024 14:35:39 +0200 Subject: [PATCH 02/32] some text and structure ideas --- demonstrations/tutorial_kak_theorem.py | 128 ++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 5 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 42abcbf953..1beac02f7c 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -1,10 +1,128 @@ r"""The KAK theorem -------------------- +=================== + +The KAK theorem is a beautiful mathematical result from Lie theory, with +particular relevance for quantum computing research. It can be seen as a +generalization of the singular value decomposition, and therefore falls +under the large umbrella of matrix factorizations. This allows us to +use it for quantum circuit decompositions. However, it can also +be understood from a more abstract point of view, as we will see. + +In this demo, we will discuss so-called symmetric spaces, which arise from +subgroups of Lie groups. For this, we will focus on the algebraic level +and introduce Cartan involutions/decompositions, horizontal +and vertical subspaces, as well as horizontal Cartan subalgebras. +With these tools in our hands, we will then learn about the KAK theorem +itself. +We conclude with a famous application of the theorem to circuit decomposition +by Khaneja and Glaser [#khaneja_glaser]_, which provides a circuit +template for arbitrary unitaries on any number of qubits, and proved for +the first time that single and two-qubit gates are sufficient to implement them. + +While this demo is of more mathematical nature than others, we will include +hands-on examples throughout. .. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png :align: center :width: 60% :target: javascript:void(0) + +.. note:: + + In the following we will assume a basic understanding of vector spaces, + linear maps, and Lie algebras. For the former two, we recommend a look + at your favourite linear algebra material, for the latter see our + :doc:`introduction to (dynamical) Lie algebras `. + + +The stage +--------- + +Intro + + + + +The actors +---------- + +(Semi-)simple Lie algebras +~~~~~~~~~~~~~~~~~~~~~~~~~~ + Brief! + +Subalgebras +~~~~~~~~~~~ + +Cartan involution +~~~~~~~~~~~~~~~~~ + +Symmetric space +~~~~~~~~~~~~~~~ + + + + +The props +--------- + +Exponential map +~~~~~~~~~~~~~~~ + +Adjoint representation +~~~~~~~~~~~~~~~~~~~~~~ + + + + +The plot +-------- + +Cartan involutions create subalgebras +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Subalgebras create Cartan involutions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +What happens in horizontal space... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +So many Cartan subalgebras +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Finale: KAK theorem +~~~~~~~~~~~~~~~~~~~ + + +The sequel, but quantum +----------------------- + +A recursive decomposition +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The recursion step in detail +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Local unitaries are universal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +Conclusion +---------- + +In this demo we learned about the KAK theorem and how it uses a Cartan +decomposition of a Lie algebra to decompose its Lie group. +A famous immediate application of this result is the circuit decomposition, or +parametrization, for arbitrary qubit numbers by Khaneja and Glaser. It also allowed +us to prove universality of single and two-qubit unitaries for quantum computation. + +If you are interested in other applications of Lie theory in the field of +quantum computing, you are in luck! It has been a handy tool throughout the last +decades, e.g., for the simulation and compression of quantum circuits, +in quantum optimal control, and for trainability analyses. For Lie algebraic +classical simulation of quantum circuits, check the +:doc:`g-sim ` and +:doc:`(g+P)-sim ` demos, and stay posted for +a brand new demo on compiling Hamiltonian simulation circuits with the KAK theorem! """ import pennylane as qml @@ -15,11 +133,11 @@ # References # ---------- # -# .. [#ref1] +# .. [#khaneja_glaser] # -# Author1, Author2 -# "Title" -# `arXiv:quant-ph/9807006 `__, 1998. +# Navin Khaneja, Steffen Glaser +# "Cartan decomposition of SU(2^n), constructive controllability of spin systems and universal quantum computing" +# `arXiv:quant-ph/0010100 `__, 2000 # # About the author # ---------------- From 7b21c93114d86436f61dbe4303fcccb3c62d79a5 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 14 Oct 2024 14:10:23 +0200 Subject: [PATCH 03/32] outline --- demonstrations/tutorial_kak_theorem.py | 120 ++++++++++++++++--------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 1beac02f7c..fefbeb5a59 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -35,75 +35,100 @@ :doc:`introduction to (dynamical) Lie algebras `. -The stage ---------- - -Intro - +Introduction +------------ +Basic mathematical objects +-------------------------- - -The actors ----------- +Introduce the mathematical objects that will play together to yield +the KAK theorem. (Semi-)simple Lie algebras ~~~~~~~~~~~~~~~~~~~~~~~~~~ - Brief! - -Subalgebras -~~~~~~~~~~~ - -Cartan involution -~~~~~~~~~~~~~~~~~ - -Symmetric space -~~~~~~~~~~~~~~~ - +- Introduce the notion of a Lie algebra very briefly, refer to existing demo(s). +- Focus on vector space notion being clear. +- [optional] Briefly say what a simple/semisimple Lie algebra is. +- [optional] In particular mention that the adjoint representation is faithful for semisimple algebras. +Group and algebra interaction +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The props ---------- +- Exponential map +- adjoint action of group on algebra +- adjoint action of algebra on algebra -> adjoint representation +- adjoint identity (-> g-sim demo) -Exponential map -~~~~~~~~~~~~~~~ +Subalgebras and Cartan pairs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Adjoint representation -~~~~~~~~~~~~~~~~~~~~~~ +- Introduce the notion of a subalgebra. +- Explain that there can be vector subspaces that are not subalgebras. +- Define Cartan pairs via commutation relations +Cartan subalgebras +~~~~~~~~~~~~~~~~~~ +- Define Cartan subalgebras of :math:`m`. +- Dimension of Cartan subalgebras +- Transition between Cartan subalgebras via :math:`K` +Involutions +~~~~~~~~~~~ -The plot --------- +- Explain linear maps on (matrix) algebras (-> homomorphism) +- Define involutions. +- Involutions define Cartan pairs (:math:`k = +1 | m = -1` eigenspaces) +- Cartan pairs define involutions :math:`\theta = \Pi_{\mathfrak{k}} - \Pi_{\mathfrak{m}}` -Cartan involutions create subalgebras -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +KAK theorem +~~~~~~~~~~~ -Subalgebras create Cartan involutions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- KP decomposition +- KAK decomposition +- [optional] implication: KaK on algebra level -What happens in horizontal space... -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -So many Cartan subalgebras -~~~~~~~~~~~~~~~~~~~~~~~~~~ +Two-qubit KAK decomposition +--------------------------- -Finale: KAK theorem -~~~~~~~~~~~~~~~~~~~ +- Algebra/subalgebra :math:`\mathfrak{g} =\mathfrak{su}(4) | \mathfrak{k} =\mathfrak{su}(2) \oplus \mathfrak{su}(2)` +- Involution: EvenOdd +- CSA: :math:`\mathfrak{a} = \langle\{XX, YY, ZZ\}\rangle_{i\mathbb{R}}` +- KAK decomposition :math:`U= (A\otimes B) \exp(i(\eta_x XX+\eta_y YY +\eta_z ZZ)) (C\otimes D)`. +- [optional] Mention Cartan coordinates +Khaneja-Glaser decomposition +---------------------------- -The sequel, but quantum ------------------------ +- Important first recursive decomposition showing universality of single- and two-qubit operations +- Used for practical decompositions, replaced by other, similar decompositions by now A recursive decomposition ~~~~~~~~~~~~~~~~~~~~~~~~~ +- Show recursion on qubit count +- display resulting decomposition structure +- Mention that a two-qubit interaction is enough to get the CSA elements +- Universality + The recursion step in detail ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Local unitaries are universal -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- Two substeps in each recursion step: + - Algebra/subalgebra :math:`\mathfrak{g}=\mathfrak{su}(2^n) | \mathfrak{k} = \mathfrak{su}(2^{n-1}) \oplus \mathfrak{su}(2^{n-1})` + - Involution TBD + - CSA TBD + - Algebra/subalgebra :math:`\mathfrak{g}=\mathfrak{su}(2^{n-1}) \oplus \mathfrak{su}(2^{n-1}) | \mathfrak{k} = \mathfrak{su}(2^{n-1})` + - Involution TBD + - CSA TBD + +Overview of resulting decomposition +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Count blocks +- [optional] CNOT count Conclusion @@ -115,19 +140,26 @@ parametrization, for arbitrary qubit numbers by Khaneja and Glaser. It also allowed us to prove universality of single and two-qubit unitaries for quantum computation. -If you are interested in other applications of Lie theory in the field of +If you are interested in other applications of Lie theory in the field of quantum computing, you are in luck! It has been a handy tool throughout the last -decades, e.g., for the simulation and compression of quantum circuits, +decades, e.g., for the simulation and compression of quantum circuits, # TODO: REFS in quantum optimal control, and for trainability analyses. For Lie algebraic classical simulation of quantum circuits, check the :doc:`g-sim ` and :doc:`(g+P)-sim ` demos, and stay posted for a brand new demo on compiling Hamiltonian simulation circuits with the KAK theorem! + + +The props +--------- + +Adjoint representation +~~~~~~~~~~~~~~~~~~~~~~ + """ import pennylane as qml -###################################################################### ###################################################################### # # References From 8fee71b3203042b140f23a349cc3101f1394f90d Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 17 Oct 2024 21:56:39 +0200 Subject: [PATCH 04/32] draft --- demonstrations/tutorial_kak_theorem.py | 419 ++++++++++++++++++++----- 1 file changed, 340 insertions(+), 79 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index fefbeb5a59..05c33c2570 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -10,17 +10,15 @@ In this demo, we will discuss so-called symmetric spaces, which arise from subgroups of Lie groups. For this, we will focus on the algebraic level -and introduce Cartan involutions/decompositions, horizontal -and vertical subspaces, as well as horizontal Cartan subalgebras. +and introduce Cartan decompositions, horizontal +and vertical subspaces, as well as (horizontal) Cartan subalgebras. With these tools in our hands, we will then learn about the KAK theorem itself. -We conclude with a famous application of the theorem to circuit decomposition -by Khaneja and Glaser [#khaneja_glaser]_, which provides a circuit -template for arbitrary unitaries on any number of qubits, and proved for -the first time that single and two-qubit gates are sufficient to implement them. -While this demo is of more mathematical nature than others, we will include -hands-on examples throughout. +As an application, we will get to know a handy decomposition of arbitrary +two-qubit unitaries into rotation gates. We will use this example throughout +to accompany the mathematical derivation in code. + .. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png :align: center @@ -47,9 +45,82 @@ (Semi-)simple Lie algebras ~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Introduce the notion of a Lie algebra very briefly, refer to existing demo(s). -- Focus on vector space notion being clear. -- [optional] Briefly say what a simple/semisimple Lie algebra is. +As mentioned above, we will assume a basic understanding of the mathematical objects +we will use. To warm up, however, let us briefly talk about Lie algebras (for details +see our :doc:`intro to (dynamical) Lie algebras `). + +A *Lie algebra* :math:`\mathfrak{g}` is a vector space with an additional operation +between two vectors, called the *Lie bracket*, that yields a vector again. +For our purposes, the vectors will always be matrices and the Lie bracket is the matrix +commutator. + +Our working example in this demo will be the *special unitary* algebra :math:`\mathfrak{su}(4)`. +It consists of traceless complex-valued skew-Hermitian :math:`4\times 4` matrices, i.e., + +.. math:: + + \mathfrak{u}(4) = \left\{x \in \mathbb{C}^{(4\times 4)} | x^\dagger = -x , \text{tr}[x]=0\right\}. + +.. note:: + + :math:`\mathfrak{su}(4)` is a *real* Lie algebra, i.e., it is a vector space over the + real numbers :math:`\mathbb{R}`. This means that scalar-vector multiplication is + only valid between vectors (complex-valued matrices) and real scalars. + + There is a simple reason to see this; Multiplying a skew-Hermitian matrix + :math:`x\in\mathfrak{u}(4)` by a complex number :math:`c\in\mathbb{C}` will yield + :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x`, so that + the result might no longer be in the algebra! If we keep it to real scalars + :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c`, so that + :math:`(cx)^\dagger=-cx` and we're fine. + +Let us set up :math:`\mathfrak{su}(4)` in code. For this, we create a basis for traceless +Hermitian :math:`4\times 4` matrices, which is given by the Pauli basis on two qubits. +Note that the algebra itself consists of *skew-*Hermitian matrices, but we will work +with the Hermitian counterparts as inputs. +We can check that :math:`\mathfrak{su}(4)` is closed under commutators, by +computing all nested commutators, the so-called *Lie closure*, and observing +that the closure is not larger than :math:`\mathfrak{su}(4)` itself. +""" +from itertools import product, combinations +import pennylane as qml +import numpy as np + +su4 = [op for op in qml.pauli.pauli_group(2)][1:] +print(f"su(4) is {len(su4)}-dimensional") + +all_skew_hermitian = all(qml.equal(qml.adjoint(op).simplify(), op) for op in su4) +print(f"The operators are all Hermitian: {all_skew_hermitian}") + +su4_lie_closed = qml.pauli.dla.lie_closure(su4) +print(f"The Lie closure of su(4) is {len(su4_lie_closed)}-dimensional.") + +traces = [op.pauli_rep.trace() for op in su4] +print(f"All operators are traceless: {np.allclose(traces, 0.)}") + +r""" +We find that :math:`\mathfrak{su}(4)` indeed is closed, and that it is a 15-dimensional +space. We also picked a correct representation with traceless operators. + +.. note:: + + Our main result for this demo will be the KAK theorem, which applies to + so-called *semisimple* Lie algebras. We will not go into detail about this notion, but + it often is sufficient to think of them as the algebras that are composed from + three types of *simple* building blocks, namely + (1) special orthogonal algebras :math:`\mathfrak{so}(n)`, (2) unitary symplectic algebras + :math:`\mathfrak{sp}(n)`, and (3) special unitary algebras :math:`\mathfrak{su}(n)`. + In particular, the unitary :math:`\mathfrak{u}(4)` is not *quite* semisimple; + it contains a *center*, which is a non-simple component. This is why we here will be + studying the *special* unitary algebra :math:`\mathfrak{su}(4)`. + Fortunately, the center of :math:`\mathfrak{u}(4)` is encoded in the trace of + the operators and generates global phases when used in a quantum gate. As we + usually can discard global phases anyways, :math:`\mathfrak{su}(4)` is indeed the + algebra we care about. + +""" + +""" - [optional] In particular mention that the adjoint representation is faithful for semisimple algebras. Group and algebra interaction @@ -60,107 +131,297 @@ - adjoint action of algebra on algebra -> adjoint representation - adjoint identity (-> g-sim demo) -Subalgebras and Cartan pairs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Subalgebras and Cartan decomposition +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A *subalgebra* :math:`\mathfrak{k}` of a Lie algebra :math:`\mathfrak{g}` is a +vector subspace that is closed under the Lie bracket. Overall, this means that +:math:`\mathfrak{k}` is closed under addition, scalar multiplication, and the Lie bracket. +The latter often is simply written as :math:`[\mathfrak{k}, \mathfrak{k}]\subset \mathfrak{k}`. + +The algebras we are interested in come with an inner product between its elements. +For our purposes, it is sufficient to assume that it is + +.. math:: -- Introduce the notion of a subalgebra. -- Explain that there can be vector subspaces that are not subalgebras. -- Define Cartan pairs via commutation relations + \langle x, y\rangle = \text{tr}[x^\dagger y]. +Given a subalgebra :math:`\mathfrak{k}\subset \mathfrak{g}`, the inner product allows +us to define an orthogonal complement + +.. math:: + + \mathfrak{m} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \forall y\mathfrak{k}\}. + +In this context, :math:`\mathfrak{k}` is commonly called the *vertical space*, +:math:`\mathfrak{m}` accordingly is the *horizontal space*. +The KAK theorem will apply to scenarios in which these spaces satisfy additional +commutation relations, which do not hold for all subalgebras: + +.. math:: + + [\mathfrak{k}, \mathfrak{m}] \subset \mathfrak{m} \qquad &\text{(Reductive property)}\\ + [\mathfrak{m}, \mathfrak{m}] \subset \mathfrak{k} \qquad &\text{(Symmetric property)}. + +The first property tells us that :math:`\mathfrak{m}` is left intact by the adjoint action of +:math:`\mathfrak{k}` and that :math:`\mathfrak{m}` behaves like the "opposite" of a subalgebra, i.e., +all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. +Due to the adjoint identity from above, this also holds for group elements acting on +algebra elements: + +.. math:: + + K x K^\dagger = \exp(y) x \exp(-y) \in \mathfrak{m} &\forall x\in\mathfrak{m}, y\in\mathfrak{k},\\ + \exp(z) x \exp(-z) \in \mathfrak{k} &\forall x,z\in\mathfrak{m}. + +.. note:: + + If the reductive property holds, the quotient space :math:`G/K` of the groups + of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. + If both properties hold, :math:`(\mathfrak{k}, \mathfrak{m})` is called a + *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{m}` a *Cartan decomposition*. + :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* + and the quotient :math:`G/K` is a *symmetric space*. + Symmetric spaces are relevant for a wide range of applications in physics + and have been studied a lot throughout the last hundred years. + +.. warning:: + + Depending on context and field, there are sometimes additional requirements + for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{m}` to be called a Cartan decomposition. + +For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{su}(2)\oplus\mathfrak{su}(2)` +of :math:`\mathfrak{su}(4)`, consisting of one copy of single-qubit operations acting +on either of the two qubits. Concretely, + +.. math:: + + \mathfrak{k} = \text{span}_{i\mathbb{R}}\left\{X_0, Y_0, Z_0, X_1, Y_1, Z_1\right\}. + +Let us define it in code, and check whether it gives rise to a Cartan decomposition. +""" + +def inner_product(op1, op2): + mat1 = qml.matrix(op1, wire_order=[0, 1]) + mat2 = qml.matrix(op2, wire_order=[0, 1]) + return qml.math.trace(mat1.conj().T @ mat2) + +# Subalgebra +k = [qml.X(0), qml.Y(0), qml.Z(0), qml.X(1), qml.Y(1), qml.Z(1)] +# Check Lie closure of k +k_lie_closed = qml.pauli.dla.lie_closure(k) +print(f"The Lie closure of k is as large as k itself: {len(k_lie_closed)==len(k)}.") + +# Orthogonal complement of k +m = [op for op in su4 if np.allclose([inner_product(op, k_op) for k_op in k], 0)] +print( + f"k has dimension {len(k)}, m has dimension {len(m)}, which combine to " + f"the dimension {len(su4)} of su(4): {len(k)+len(m)==len(su4)}" +) + +# Check reductive property +k_m_commutators = [k_op.pauli_rep.commutator(m_op.pauli_rep) for k_op, m_op in product(k, m)] +k_m_coms_in_m = [np.allclose([inner_product(com, k_op) for k_op in k], 0) for com in k_m_commutators] +print(f"All commutators in [k, m] are in m (orthogonal to k): {all(k_m_coms_in_m)}.") +if all(k_m_coms_in_m): + print("SU(4)/(SU(2)xSU(2)) is a reductive homogeneous space.") + +# Check symmetric property +m_m_commutators = [op1.pauli_rep.commutator(op2.pauli_rep) for op1, op2 in combinations(m, r=2)] +m_m_coms_in_k = [np.allclose([inner_product(com, m_op) for m_op in m], 0) for com in m_m_commutators] +print(f"All commutators in [m, m] are in k (orthogonal to m): {all(m_m_coms_in_k)}.") +if all(m_m_coms_in_k): + print("SU(4)/(SU(2)xSU(2)) is a symmetric space.") + +r""" Cartan subalgebras ~~~~~~~~~~~~~~~~~~ -- Define Cartan subalgebras of :math:`m`. -- Dimension of Cartan subalgebras -- Transition between Cartan subalgebras via :math:`K` +The symmetric property of a Cartan decomposition tells us that :math:`\mathfrak{m}` is very +far from being a subalgebra. This also gives us information about potential subalgebras +*within* :math:`\mathfrak{m}`. Assume we have a subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. Then the commutator +between any two elements :math:`x, y\in\mathfrak{h}` must satisfy + +.. math:: + + [x, y] \in \mathfrak{h} \subset \mathfrak{m} \Rightarrow [x, y]\in\mathfrak{m} & \text{(subalgebra property)} \\ + [x, y] \in [\mathfrak{h}, \mathfrak{h}] \subset [\mathfrak{m}, \mathfrak{m}]\subset \mathfrak{k} \Rightarrow [x, y]\in\mathfrak{k} & \text{(symmetric property)}. + +That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and :math:`\mathfrak{m}`, +which only have the zero vector in common. This tells us that *all* commutators in :math:`\mathfrak{h}` +vanish, making it an *Abelian* subalgebra. + +Such an Abelian subalgebra is a (horizontal) *Cartan subalgebra (CSA)* if it is *maximal*, +i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{m}`. + +.. warning:: + + Depending on context and field, there are inequivalent notions of Cartan subalgebras. + In particular, there is a common notion of Cartan subalgebras that are not contained + in a horizontal space. Throughout this demo, we always mean a *horizontal* + maximal Abelian subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. + +How many different CSAs are there? Given a CSA :math:`\mathfrak{h}`, we can pick a vertical element +:math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to +all elements of the CSA, using the adjoint action we studied above. +This will yield a valid CSA again. First, :math:`K\mathfrak{h} K^\dagger` remains in :math:`\mathfrak{m}` +due to the reductive property, as we discussed when introducing the Cartan decomposition. +Second the adjoint action will not change the Abelian property because + +.. math:: + + [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 \ \forall x_{1, 2}\in\mathfrak{h}. + +Finally, we are guaranteed that :math:`K\mathfrak{h} K^\dagger` remains maximal. + +.. note:: + + The reason that :math:`K\mathfrak{h} K^\dagger is maximal if :math:`\mathfrak{h}` was, is + that we assume :math:`\mathfrak{g}` to be a semisimple Lie algebra, for which the + adjoint representation is faithful. This in turn implies that linearly + independent elements of :math:`\mathfrak{g}` will not be mapped to linearly dependent + elements by the adjoint action of :math:`K`. + +For most :math:`y\in\mathfrak{k}`, this will yield a *different* CSA, so that we find a whole +continuum of subalgebras. +It turns out that *all* of them can be found by starting with *any* +:math:`\mathfrak{h}` and applying all :math:`\exp(y)\in K` to them. + +*This fact is what powers the KAK theorem.* Involutions ~~~~~~~~~~~ -- Explain linear maps on (matrix) algebras (-> homomorphism) -- Define involutions. -- Involutions define Cartan pairs (:math:`k = +1 | m = -1` eigenspaces) -- Cartan pairs define involutions :math:`\theta = \Pi_{\mathfrak{k}} - \Pi_{\mathfrak{m}}` +In practice, there often is a more convenient way to a Cartan decomposition +than by specifying the subalgebra :math:`\mathfrak{k}` or its horizontal counterpart +:math:`\mathfrak{m}` manually. It goes as follows. -KAK theorem -~~~~~~~~~~~ +We will look at a map :math:`\theta` from the total Lie algebra :math:`\mathfrak{g}` +to itself. We demand that :math:`\theta` has the following properties, for +:math:`x, y\in\mathfrak{g}` and :math:`c\in\mathbb{R}`. -- KP decomposition -- KAK decomposition -- [optional] implication: KaK on algebra level +#. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y)` +#. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)]`, and +#. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x`. +Put compactly, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}`. +As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1`, with associated +eigenspaces :math:`\mathfrak{g}_\pm`. Let's see what happens when we compute commutators between +elements :math:`x_\pm\in\mathfrak{g}_\pm`: -Two-qubit KAK decomposition ---------------------------- +.. math:: -- Algebra/subalgebra :math:`\mathfrak{g} =\mathfrak{su}(4) | \mathfrak{k} =\mathfrak{su}(2) \oplus \mathfrak{su}(2)` -- Involution: EvenOdd -- CSA: :math:`\mathfrak{a} = \langle\{XX, YY, ZZ\}\rangle_{i\mathbb{R}}` -- KAK decomposition :math:`U= (A\otimes B) \exp(i(\eta_x XX+\eta_y YY +\eta_z ZZ)) (C\otimes D)`. -- [optional] Mention Cartan coordinates + \theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ + \theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ + \theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. -Khaneja-Glaser decomposition ----------------------------- +Or, in other words, :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, +and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+`. +So an involution is enough to find us a Cartan decomposition, with :math:`\mathfrak{k}=\mathfrak{g}_+` +and :math:`\mathfrak{m}=\mathfrak{g}_-`. -- Important first recursive decomposition showing universality of single- and two-qubit operations -- Used for practical decompositions, replaced by other, similar decompositions by now +🤯 -A recursive decomposition -~~~~~~~~~~~~~~~~~~~~~~~~~ +We might want to call such a :math:`\theta` a *Cartan involution*. -- Show recursion on qubit count -- display resulting decomposition structure -- Mention that a two-qubit interaction is enough to get the CSA elements -- Universality +.. note:: -The recursion step in detail -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Some people do so, some people again require more properties for such an + involution to be called Cartan involution. + For our purposes, let's go with the more general definition and call all + involutions with the properties above Cartan involution. -- Two substeps in each recursion step: - - Algebra/subalgebra :math:`\mathfrak{g}=\mathfrak{su}(2^n) | \mathfrak{k} = \mathfrak{su}(2^{n-1}) \oplus \mathfrak{su}(2^{n-1})` - - Involution TBD - - CSA TBD - - Algebra/subalgebra :math:`\mathfrak{g}=\mathfrak{su}(2^{n-1}) \oplus \mathfrak{su}(2^{n-1}) | \mathfrak{k} = \mathfrak{su}(2^{n-1})` - - Involution TBD - - CSA TBD +Conversely, if we have a Cartan decomposition based on a subalgebra :math:`\mathfrak{k}`, +we can define the map -Overview of resulting decomposition -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. math:: -- Count blocks -- [optional] CNOT count + \theta_{\mathfrak{k}}(x) = \Pi_{\mathfrak{k}}(x)-\Pi_{\mathfrak{m}}(x), +where :math:`\Pi` are the projectors onto the two vector subspaces. +Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. +It is also compatible with the commutator due to the commutation relations +between :math:`\mathfrak{k}` and :math:`\mathfrak{m}` (see box). -Conclusion ----------- +.. note:: -In this demo we learned about the KAK theorem and how it uses a Cartan -decomposition of a Lie algebra to decompose its Lie group. -A famous immediate application of this result is the circuit decomposition, or -parametrization, for arbitrary qubit numbers by Khaneja and Glaser. It also allowed -us to prove universality of single and two-qubit unitaries for quantum computation. + To see that :math:`\theta_{\mathfrak{k}}` is compatible with the commutator, we compute + the action of the projectors on it: -If you are interested in other applications of Lie theory in the field of -quantum computing, you are in luck! It has been a handy tool throughout the last -decades, e.g., for the simulation and compression of quantum circuits, # TODO: REFS -in quantum optimal control, and for trainability analyses. For Lie algebraic -classical simulation of quantum circuits, check the -:doc:`g-sim ` and -:doc:`(g+P)-sim ` demos, and stay posted for -a brand new demo on compiling Hamiltonian simulation circuits with the KAK theorem! + .. math:: + \Pi_{\mathfrak{k}}([x, y]) + &= \Pi_{\mathfrak{k}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ + &= \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{k}}) + \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{m}}) + \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{m}}) + \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{k}})\\ + &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]\\ + \Pi_{\mathfrak{m}}([x, y]) + &= \Pi_{\mathfrak{m}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ + &= \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{k}}) + \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{m}}) + \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{m}}) + \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{k}})\\ + &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)] -The props ---------- + Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{m}}` and the + commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{m}`. -Adjoint representation -~~~~~~~~~~~~~~~~~~~~~~ + We can put thes pieces together to get -""" + .. math:: -import pennylane as qml + \theta_{\mathfrak{k}} ([x, y]) + &=[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)] + - [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] - [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]\\ + &=[\theta_{\mathfrak{k}} (x),\theta_{\mathfrak{k}} (y)]. + +Finally, :math:`\theta_{\mathfrak{k}}` is an involution because + +.. math:: + + \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{m}})^2 = \Pi_{\mathfrak{k}}+\Pi_{\mathfrak{m}} = \mathbb{I}_{\mathfrak{g}}, + +where we used the projector's properties. + +This shows us that we can easily switch between a Cartan involution and a Cartan +decomposition, in either direction! + +KAK theorem +~~~~~~~~~~~ + +- KP decomposition +- KAK decomposition +- [optional] implication: KaK on algebra level + + +Two-qubit KAK decomposition +--------------------------- + +- Algebra/subalgebra :math:`\mathfrak{g} =\mathfrak{su}(4) | \mathfrak{k} =\mathfrak{su}(2) \oplus \mathfrak{su}(2)` +- Involution: EvenOdd +- CSA: :math:`\mathfrak{a} = \langle\{XX, YY, ZZ\}\rangle_{i\mathbb{R}}` +- KAK decomposition :math:`U= (A\otimes B) \exp(i(\eta_x XX+\eta_y YY +\eta_z ZZ)) (C\otimes D)`. +- [optional] Mention Cartan coordinates ###################################################################### +# Conclusion +# ---------- +# +# In this demo we learned about the KAK theorem and how it uses a Cartan +# decomposition of a Lie algebra to decompose its Lie group. +# This allows us to break down arbitrary quantum gates from that group, +# as we implemented in code for the group of two-qubit gates :math:`SU(4)`. +# +# If you are interested in other applications of Lie theory in the field of +# quantum computing, you are in luck! It has been a handy tool throughout the last +# decades, e.g., for the simulation and compression of quantum circuits, # TODO: REFS +# in quantum optimal control, and for trainability analyses. For Lie algebraic +# classical simulation of quantum circuits, check the +# :doc:`g-sim ` and +# :doc:`(g+P)-sim ` demos, and stay posted for +# a brand new demo on compiling Hamiltonian simulation circuits with the KAK theorem! # # References # ---------- From 497a8efd403e809ff28066083cb51345d5597c72 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 17 Oct 2024 22:16:18 +0200 Subject: [PATCH 05/32] polish --- demonstrations/tutorial_kak_theorem.py | 572 +++++++++++++------------ 1 file changed, 296 insertions(+), 276 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 05c33c2570..6504b53db6 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -82,6 +82,7 @@ computing all nested commutators, the so-called *Lie closure*, and observing that the closure is not larger than :math:`\mathfrak{su}(4)` itself. """ + from itertools import product, combinations import pennylane as qml import numpy as np @@ -98,114 +99,112 @@ traces = [op.pauli_rep.trace() for op in su4] print(f"All operators are traceless: {np.allclose(traces, 0.)}") -r""" -We find that :math:`\mathfrak{su}(4)` indeed is closed, and that it is a 15-dimensional -space. We also picked a correct representation with traceless operators. - -.. note:: - - Our main result for this demo will be the KAK theorem, which applies to - so-called *semisimple* Lie algebras. We will not go into detail about this notion, but - it often is sufficient to think of them as the algebras that are composed from - three types of *simple* building blocks, namely - (1) special orthogonal algebras :math:`\mathfrak{so}(n)`, (2) unitary symplectic algebras - :math:`\mathfrak{sp}(n)`, and (3) special unitary algebras :math:`\mathfrak{su}(n)`. - In particular, the unitary :math:`\mathfrak{u}(4)` is not *quite* semisimple; - it contains a *center*, which is a non-simple component. This is why we here will be - studying the *special* unitary algebra :math:`\mathfrak{su}(4)`. - Fortunately, the center of :math:`\mathfrak{u}(4)` is encoded in the trace of - the operators and generates global phases when used in a quantum gate. As we - usually can discard global phases anyways, :math:`\mathfrak{su}(4)` is indeed the - algebra we care about. - -""" - -""" -- [optional] In particular mention that the adjoint representation is faithful for semisimple algebras. - -Group and algebra interaction -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- Exponential map -- adjoint action of group on algebra -- adjoint action of algebra on algebra -> adjoint representation -- adjoint identity (-> g-sim demo) - -Subalgebras and Cartan decomposition -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A *subalgebra* :math:`\mathfrak{k}` of a Lie algebra :math:`\mathfrak{g}` is a -vector subspace that is closed under the Lie bracket. Overall, this means that -:math:`\mathfrak{k}` is closed under addition, scalar multiplication, and the Lie bracket. -The latter often is simply written as :math:`[\mathfrak{k}, \mathfrak{k}]\subset \mathfrak{k}`. - -The algebras we are interested in come with an inner product between its elements. -For our purposes, it is sufficient to assume that it is - -.. math:: - - \langle x, y\rangle = \text{tr}[x^\dagger y]. - -Given a subalgebra :math:`\mathfrak{k}\subset \mathfrak{g}`, the inner product allows -us to define an orthogonal complement - -.. math:: - - \mathfrak{m} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \forall y\mathfrak{k}\}. - -In this context, :math:`\mathfrak{k}` is commonly called the *vertical space*, -:math:`\mathfrak{m}` accordingly is the *horizontal space*. -The KAK theorem will apply to scenarios in which these spaces satisfy additional -commutation relations, which do not hold for all subalgebras: - -.. math:: - - [\mathfrak{k}, \mathfrak{m}] \subset \mathfrak{m} \qquad &\text{(Reductive property)}\\ - [\mathfrak{m}, \mathfrak{m}] \subset \mathfrak{k} \qquad &\text{(Symmetric property)}. - -The first property tells us that :math:`\mathfrak{m}` is left intact by the adjoint action of -:math:`\mathfrak{k}` and that :math:`\mathfrak{m}` behaves like the "opposite" of a subalgebra, i.e., -all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. -Due to the adjoint identity from above, this also holds for group elements acting on -algebra elements: - -.. math:: - - K x K^\dagger = \exp(y) x \exp(-y) \in \mathfrak{m} &\forall x\in\mathfrak{m}, y\in\mathfrak{k},\\ - \exp(z) x \exp(-z) \in \mathfrak{k} &\forall x,z\in\mathfrak{m}. - -.. note:: - - If the reductive property holds, the quotient space :math:`G/K` of the groups - of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. - If both properties hold, :math:`(\mathfrak{k}, \mathfrak{m})` is called a - *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{m}` a *Cartan decomposition*. - :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* - and the quotient :math:`G/K` is a *symmetric space*. - Symmetric spaces are relevant for a wide range of applications in physics - and have been studied a lot throughout the last hundred years. - -.. warning:: - - Depending on context and field, there are sometimes additional requirements - for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{m}` to be called a Cartan decomposition. - -For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{su}(2)\oplus\mathfrak{su}(2)` -of :math:`\mathfrak{su}(4)`, consisting of one copy of single-qubit operations acting -on either of the two qubits. Concretely, - -.. math:: - - \mathfrak{k} = \text{span}_{i\mathbb{R}}\left\{X_0, Y_0, Z_0, X_1, Y_1, Z_1\right\}. +###################################################################### +# We find that :math:`\mathfrak{su}(4)` indeed is closed, and that it is a 15-dimensional +# space. We also picked a correct representation with traceless operators. +# +# .. note:: +# +# Our main result for this demo will be the KAK theorem, which applies to +# so-called *semisimple* Lie algebras. We will not go into detail about this notion, but +# it often is sufficient to think of them as the algebras that are composed from +# three types of *simple* building blocks, namely +# (1) special orthogonal algebras :math:`\mathfrak{so}(n)`, (2) unitary symplectic algebras +# :math:`\mathfrak{sp}(n)`, and (3) special unitary algebras :math:`\mathfrak{su}(n)`. +# In particular, the unitary :math:`\mathfrak{u}(4)` is not *quite* semisimple; +# it contains a *center*, which is a non-simple component. This is why we here will be +# studying the *special* unitary algebra :math:`\mathfrak{su}(4)`. +# Fortunately, the center of :math:`\mathfrak{u}(4)` is encoded in the trace of +# the operators and generates global phases when used in a quantum gate. As we +# usually can discard global phases anyways, :math:`\mathfrak{su}(4)` is indeed the +# algebra we care about. +# +# - [optional] In particular mention that the adjoint representation is faithful for semisimple algebras. +# +# Group and algebra interaction +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# - Exponential map +# - adjoint action of group on algebra +# - adjoint action of algebra on algebra -> adjoint representation +# - adjoint identity (-> g-sim demo) +# +# Subalgebras and Cartan decomposition +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# A *subalgebra* :math:`\mathfrak{k}` of a Lie algebra :math:`\mathfrak{g}` is a +# vector subspace that is closed under the Lie bracket. Overall, this means that +# :math:`\mathfrak{k}` is closed under addition, scalar multiplication, and the Lie bracket. +# The latter often is simply written as :math:`[\mathfrak{k}, \mathfrak{k}]\subset \mathfrak{k}`. +# +# The algebras we are interested in come with an inner product between its elements. +# For our purposes, it is sufficient to assume that it is +# +# .. math:: +# +# \langle x, y\rangle = \text{tr}[x^\dagger y]. +# +# Given a subalgebra :math:`\mathfrak{k}\subset \mathfrak{g}`, the inner product allows +# us to define an orthogonal complement +# +# .. math:: +# +# \mathfrak{m} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \forall y\mathfrak{k}\}. +# +# In this context, :math:`\mathfrak{k}` is commonly called the *vertical space*, +# :math:`\mathfrak{m}` accordingly is the *horizontal space*. +# The KAK theorem will apply to scenarios in which these spaces satisfy additional +# commutation relations, which do not hold for all subalgebras: +# +# .. math:: +# +# [\mathfrak{k}, \mathfrak{m}] \subset& \mathfrak{m} \qquad \text{(Reductive property)}\\ +# [\mathfrak{m}, \mathfrak{m}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. +# +# The first property tells us that :math:`\mathfrak{m}` is left intact by the adjoint action of +# :math:`\mathfrak{k}` and that :math:`\mathfrak{m}` behaves like the "opposite" of a subalgebra, i.e., +# all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. +# Due to the adjoint identity from above, the first property also holds for group elements acting on +# algebra elements: +# +# .. math:: +# +# K x K^\dagger = \exp(y) x \exp(-y) \in \mathfrak{m} \quad \forall\ x\in\mathfrak{m}, y\in\mathfrak{k}, +# +# .. note:: +# +# If the reductive property holds, the quotient space :math:`G/K` of the groups +# of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. +# If both properties hold, :math:`(\mathfrak{k}, \mathfrak{m})` is called a +# *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{m}` a *Cartan decomposition*. +# :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* +# and the quotient :math:`G/K` is a *symmetric space*. +# Symmetric spaces are relevant for a wide range of applications in physics +# and have been studied a lot throughout the last hundred years. +# +# .. warning:: +# +# Depending on context and field, there are sometimes additional requirements +# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{m}` to be called a Cartan decomposition. +# +# For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{su}(2)\oplus\mathfrak{su}(2)` +# of :math:`\mathfrak{su}(4)`, consisting of independent single-qubit operations acting +# on either of the two qubits. Concretely, +# +# .. math:: +# +# \mathfrak{k} = \text{span}_{i\mathbb{R}}\left\{X_0, Y_0, Z_0, X_1, Y_1, Z_1\right\}. +# +# Let us define it in code, and check whether it gives rise to a Cartan decomposition. +# -Let us define it in code, and check whether it gives rise to a Cartan decomposition. -""" def inner_product(op1, op2): mat1 = qml.matrix(op1, wire_order=[0, 1]) mat2 = qml.matrix(op2, wire_order=[0, 1]) return qml.math.trace(mat1.conj().T @ mat2) + # Subalgebra k = [qml.X(0), qml.Y(0), qml.Z(0), qml.X(1), qml.Y(1), qml.Z(1)] # Check Lie closure of k @@ -220,190 +219,211 @@ def inner_product(op1, op2): ) # Check reductive property -k_m_commutators = [k_op.pauli_rep.commutator(m_op.pauli_rep) for k_op, m_op in product(k, m)] -k_m_coms_in_m = [np.allclose([inner_product(com, k_op) for k_op in k], 0) for com in k_m_commutators] +k_m_commutators = [ + k_op.pauli_rep.commutator(m_op.pauli_rep) for k_op, m_op in product(k, m) +] +k_m_coms_in_m = [ + np.allclose([inner_product(com, k_op) for k_op in k], 0) + for com in k_m_commutators +] print(f"All commutators in [k, m] are in m (orthogonal to k): {all(k_m_coms_in_m)}.") if all(k_m_coms_in_m): print("SU(4)/(SU(2)xSU(2)) is a reductive homogeneous space.") # Check symmetric property -m_m_commutators = [op1.pauli_rep.commutator(op2.pauli_rep) for op1, op2 in combinations(m, r=2)] -m_m_coms_in_k = [np.allclose([inner_product(com, m_op) for m_op in m], 0) for com in m_m_commutators] +m_m_commutators = [ + op1.pauli_rep.commutator(op2.pauli_rep) for op1, op2 in combinations(m, r=2) +] +m_m_coms_in_k = [ + np.allclose([inner_product(com, m_op) for m_op in m], 0) + for com in m_m_commutators +] print(f"All commutators in [m, m] are in k (orthogonal to m): {all(m_m_coms_in_k)}.") if all(m_m_coms_in_k): print("SU(4)/(SU(2)xSU(2)) is a symmetric space.") -r""" -Cartan subalgebras -~~~~~~~~~~~~~~~~~~ - -The symmetric property of a Cartan decomposition tells us that :math:`\mathfrak{m}` is very -far from being a subalgebra. This also gives us information about potential subalgebras -*within* :math:`\mathfrak{m}`. Assume we have a subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. Then the commutator -between any two elements :math:`x, y\in\mathfrak{h}` must satisfy - -.. math:: - - [x, y] \in \mathfrak{h} \subset \mathfrak{m} \Rightarrow [x, y]\in\mathfrak{m} & \text{(subalgebra property)} \\ - [x, y] \in [\mathfrak{h}, \mathfrak{h}] \subset [\mathfrak{m}, \mathfrak{m}]\subset \mathfrak{k} \Rightarrow [x, y]\in\mathfrak{k} & \text{(symmetric property)}. - -That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and :math:`\mathfrak{m}`, -which only have the zero vector in common. This tells us that *all* commutators in :math:`\mathfrak{h}` -vanish, making it an *Abelian* subalgebra. - -Such an Abelian subalgebra is a (horizontal) *Cartan subalgebra (CSA)* if it is *maximal*, -i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{m}`. - -.. warning:: - - Depending on context and field, there are inequivalent notions of Cartan subalgebras. - In particular, there is a common notion of Cartan subalgebras that are not contained - in a horizontal space. Throughout this demo, we always mean a *horizontal* - maximal Abelian subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. - -How many different CSAs are there? Given a CSA :math:`\mathfrak{h}`, we can pick a vertical element -:math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to -all elements of the CSA, using the adjoint action we studied above. -This will yield a valid CSA again. First, :math:`K\mathfrak{h} K^\dagger` remains in :math:`\mathfrak{m}` -due to the reductive property, as we discussed when introducing the Cartan decomposition. -Second the adjoint action will not change the Abelian property because - -.. math:: - - [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 \ \forall x_{1, 2}\in\mathfrak{h}. - -Finally, we are guaranteed that :math:`K\mathfrak{h} K^\dagger` remains maximal. - -.. note:: - - The reason that :math:`K\mathfrak{h} K^\dagger is maximal if :math:`\mathfrak{h}` was, is - that we assume :math:`\mathfrak{g}` to be a semisimple Lie algebra, for which the - adjoint representation is faithful. This in turn implies that linearly - independent elements of :math:`\mathfrak{g}` will not be mapped to linearly dependent - elements by the adjoint action of :math:`K`. - -For most :math:`y\in\mathfrak{k}`, this will yield a *different* CSA, so that we find a whole -continuum of subalgebras. -It turns out that *all* of them can be found by starting with *any* -:math:`\mathfrak{h}` and applying all :math:`\exp(y)\in K` to them. - -*This fact is what powers the KAK theorem.* - -Involutions -~~~~~~~~~~~ - -In practice, there often is a more convenient way to a Cartan decomposition -than by specifying the subalgebra :math:`\mathfrak{k}` or its horizontal counterpart -:math:`\mathfrak{m}` manually. It goes as follows. - -We will look at a map :math:`\theta` from the total Lie algebra :math:`\mathfrak{g}` -to itself. We demand that :math:`\theta` has the following properties, for -:math:`x, y\in\mathfrak{g}` and :math:`c\in\mathbb{R}`. - -#. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y)` -#. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)]`, and -#. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x`. - -Put compactly, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}`. -As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1`, with associated -eigenspaces :math:`\mathfrak{g}_\pm`. Let's see what happens when we compute commutators between -elements :math:`x_\pm\in\mathfrak{g}_\pm`: - -.. math:: - - \theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ - \theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ - \theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. - -Or, in other words, :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, -and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+`. -So an involution is enough to find us a Cartan decomposition, with :math:`\mathfrak{k}=\mathfrak{g}_+` -and :math:`\mathfrak{m}=\mathfrak{g}_-`. - -🤯 - -We might want to call such a :math:`\theta` a *Cartan involution*. - -.. note:: - - Some people do so, some people again require more properties for such an - involution to be called Cartan involution. - For our purposes, let's go with the more general definition and call all - involutions with the properties above Cartan involution. - -Conversely, if we have a Cartan decomposition based on a subalgebra :math:`\mathfrak{k}`, -we can define the map - -.. math:: - - \theta_{\mathfrak{k}}(x) = \Pi_{\mathfrak{k}}(x)-\Pi_{\mathfrak{m}}(x), - -where :math:`\Pi` are the projectors onto the two vector subspaces. -Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. -It is also compatible with the commutator due to the commutation relations -between :math:`\mathfrak{k}` and :math:`\mathfrak{m}` (see box). - -.. note:: - - To see that :math:`\theta_{\mathfrak{k}}` is compatible with the commutator, we compute - the action of the projectors on it: - - .. math:: - - \Pi_{\mathfrak{k}}([x, y]) - &= \Pi_{\mathfrak{k}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ - &= \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{k}}) - \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{m}}) - \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{m}}) - \Pi_{\mathfrak{k}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{k}})\\ - &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]\\ - \Pi_{\mathfrak{m}}([x, y]) - &= \Pi_{\mathfrak{m}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ - &= \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{k}}) - \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{m}}) - \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}{\in \mathfrak{m}}) - \Pi_{\mathfrak{m}}(\underset{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}}{\in \mathfrak{k}})\\ - &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)] - - Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{m}}` and the - commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{m}`. - - We can put thes pieces together to get - - .. math:: - - \theta_{\mathfrak{k}} ([x, y]) - &=[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)] - - [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] - [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]\\ - &=[\theta_{\mathfrak{k}} (x),\theta_{\mathfrak{k}} (y)]. - -Finally, :math:`\theta_{\mathfrak{k}}` is an involution because - -.. math:: - - \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{m}})^2 = \Pi_{\mathfrak{k}}+\Pi_{\mathfrak{m}} = \mathbb{I}_{\mathfrak{g}}, - -where we used the projector's properties. - -This shows us that we can easily switch between a Cartan involution and a Cartan -decomposition, in either direction! - -KAK theorem -~~~~~~~~~~~ - -- KP decomposition -- KAK decomposition -- [optional] implication: KaK on algebra level - - -Two-qubit KAK decomposition ---------------------------- - -- Algebra/subalgebra :math:`\mathfrak{g} =\mathfrak{su}(4) | \mathfrak{k} =\mathfrak{su}(2) \oplus \mathfrak{su}(2)` -- Involution: EvenOdd -- CSA: :math:`\mathfrak{a} = \langle\{XX, YY, ZZ\}\rangle_{i\mathbb{R}}` -- KAK decomposition :math:`U= (A\otimes B) \exp(i(\eta_x XX+\eta_y YY +\eta_z ZZ)) (C\otimes D)`. -- [optional] Mention Cartan coordinates +###################################################################### +# Cartan subalgebras +# ~~~~~~~~~~~~~~~~~~ +# +# The symmetric property of a Cartan decomposition (:math:`[\mathfrak{m}, \mathfrak{m}]\subset\mathfrak{k}`) +# tells us that :math:`\mathfrak{m}` is very +# far from being a subalgebra. This also gives us information about potential subalgebras +# *within* :math:`\ \mathfrak{m}`. Assume we have a subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. Then the commutator +# between any two elements :math:`x, y\in\mathfrak{h}` must satisfy +# +# .. math:: +# +# [x, y] \in \mathfrak{h} \subset \mathfrak{m} &\Rightarrow [x, y]\in\mathfrak{m} \text{(subalgebra property)} \\ +# [x, y] \in [\mathfrak{h}, \mathfrak{h}] \subset [\mathfrak{m}, \mathfrak{m}]\subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. +# +# That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and :math:`\mathfrak{m}`, +# which only have the zero vector in common. This tells us that *all* commutators in :math:`\mathfrak{h}` +# vanish, making it an *Abelian* subalgebra: +# +# .. math:: +# +# [\mathfrak{h}, \mathfrak{h}] = \{0\}. +# +# Such an Abelian subalgebra is a (horizontal) *Cartan subalgebra (CSA)* if it is *maximal*, +# i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{m}`. +# +# .. warning:: +# +# Depending on context and field, there are inequivalent notions of Cartan subalgebras. +# In particular, there is a common notion of Cartan subalgebras which are not contained +# in a horizontal space. Throughout this demo, we always mean a *horizontal* +# maximal Abelian subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. +# +# How many different CSAs are there? Given a CSA :math:`\mathfrak{h}`, we can pick a vertical element +# :math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to +# all elements of the CSA, using the adjoint action we studied above. +# This will yield a valid CSA again. First, :math:`K\mathfrak{h} K^\dagger` remains in :math:`\mathfrak{m}` +# due to the reductive property, as we discussed when introducing the Cartan decomposition. +# Second the adjoint action will not change the Abelian property because +# +# .. math:: +# +# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 \quad \forall\ x_{1, 2}\in\mathfrak{h}. +# +# Finally, we are guaranteed that :math:`K\mathfrak{h} K^\dagger` remains maximal. +# +# .. note:: +# +# The reason that :math:`K\mathfrak{h} K^\dagger` is maximal if :math:`\mathfrak{h}` was, is +# that we assume :math:`\mathfrak{g}` to be a semisimple Lie algebra, for which the +# adjoint representation is faithful. This in turn implies that linearly +# independent elements of :math:`\mathfrak{g}` will not be mapped to linearly dependent +# elements by the adjoint action of :math:`K`. +# +# For most :math:`y\in\mathfrak{k}`, applying :math:`K=exp(y)` in this way will yield a +# *different* CSA, so that we find a whole continuum of them. +# It turns out that they *all* can be found by starting with *any* +# :math:`\mathfrak{h}` and applying all of :math:`\exp(\mathfrak{k})` to it. +# +# TODO: BETTER HIGHLIGHT +# *This fact is what powers the KAK theorem.* +# +# Involutions +# ~~~~~~~~~~~ +# +# In practice, there often is a more convenient way to a Cartan decomposition +# than by specifying the subalgebra :math:`\mathfrak{k}` or its horizontal counterpart +# :math:`\mathfrak{m}` manually. It goes as follows. +# +# We will look at a map :math:`\theta` from the total Lie algebra :math:`\mathfrak{g}` +# to itself. We demand that :math:`\theta` has the following properties, for +# :math:`x, y\in\mathfrak{g}` and :math:`c\in\mathbb{R}`. +# +# #. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y)` +# #. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)]`, and +# #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x`. +# +# Put compactly, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}`. +# As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1`, with associated +# eigenspaces :math:`\mathfrak{g}_\pm`. Let's see what happens when we compute commutators between +# elements :math:`x_\pm\in\mathfrak{g}_\pm`: +# +# .. math:: +# +# \theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ +# \theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ +# \theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. +# +# Or, in other words, :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, +# and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+`. +# So an involution is enough to find us a Cartan decomposition, with :math:`\mathfrak{k}=\mathfrak{g}_+` +# and :math:`\mathfrak{m}=\mathfrak{g}_-`. +# +# 🤯 +# +# We might want to call such a :math:`\theta` a *Cartan involution*. +# +# .. warning:: +# +# Some people do so, some people again require more properties for such an +# involution to be called Cartan involution. +# For our purposes, let's go with the more general definition and call all +# involutions with the properties above Cartan involution. +# +# Conversely, if we have a Cartan decomposition based on a subalgebra :math:`\mathfrak{k}`, +# we can define the map +# +# .. math:: +# +# \theta_{\mathfrak{k}}(x) = \Pi_{\mathfrak{k}}(x)-\Pi_{\mathfrak{m}}(x), +# +# where :math:`\Pi` are the projectors onto the two vector subspaces. +# Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. +# It is also compatible with the commutator due to the commutation relations +# between :math:`\mathfrak{k}` and :math:`\mathfrak{m}` (see box). +# +# .. note:: +# +# To see that :math:`\theta_{\mathfrak{k}}` is compatible with the commutator, we compute +# the action of the projectors on it: +# +# .. math:: +# +# \Pi_{\mathfrak{k}}([x, y]) +# &= \Pi_{\mathfrak{k}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ +# &= \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}) +# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}})\\ +# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]\\ +# \Pi_{\mathfrak{m}}([x, y]) +# &= \Pi_{\mathfrak{m}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ +# &= \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}) +# \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}})\\ +# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)] +# +# Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{m}}` and the +# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{m}`. +# +# We can put thes pieces together to get +# +# .. math:: +# +# \theta_{\mathfrak{k}} ([x, y]) +# &=\Pi_{\mathfrak{k}}([x, y]) - \Pi_{\mathfrak{m}}([x, y])\\ +# &=[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)] +# - [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] - [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]\\ +# &=[\Pi_{\mathfrak{k}}(x) -\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)-\Pi_{\mathfrak{m}}(y)]\\ +# &=[\theta_{\mathfrak{k}} (x),\theta_{\mathfrak{k}} (y)]. +# +# Finally, :math:`\theta_{\mathfrak{k}}` is an involution because +# +# .. math:: +# +# \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{m}})^2 +# = \Pi_{\mathfrak{k}}^2-\Pi_{\mathfrak{k}}\Pi_{\mathfrak{m}}-\Pi_{\mathfrak{m}}\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{m}}^2 +# =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{m}} +# = \mathbb{I}_{\mathfrak{g}}, +# +# where we used the projector's properties. +# +# This shows us that we can easily switch between a Cartan involution and a Cartan +# decomposition, in either direction! +# +# KAK theorem +# ~~~~~~~~~~~ +# +# - KP decomposition +# - KAK decomposition +# - [optional] implication: KaK on algebra level +# +# +# Two-qubit KAK decomposition +# --------------------------- +# +# - Algebra/subalgebra :math:`\mathfrak{g} =\mathfrak{su}(4) | \mathfrak{k} =\mathfrak{su}(2) \oplus \mathfrak{su}(2)` +# - Involution: EvenOdd +# - CSA: :math:`\mathfrak{a} = \langle\{XX, YY, ZZ\}\rangle_{i\mathbb{R}}` +# - KAK decomposition :math:`U= (A\otimes B) \exp(i(\eta_x XX+\eta_y YY +\eta_z ZZ)) (C\otimes D)`. +# - [optional] Mention Cartan coordinates ###################################################################### # Conclusion From edf6fa47335b55e7fce880ada5a4fd81303bc5ff Mon Sep 17 00:00:00 2001 From: dwierichs Date: Fri, 18 Oct 2024 16:21:20 +0200 Subject: [PATCH 06/32] mooooore --- demonstrations/tutorial_kak_theorem.py | 552 +++++++++++++++++++------ 1 file changed, 420 insertions(+), 132 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 6504b53db6..e75cd86a78 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -25,7 +25,8 @@ :width: 60% :target: javascript:void(0) -.. note:: +.. admonition:: Prerequisites + :class: note In the following we will assume a basic understanding of vector spaces, linear maps, and Lie algebras. For the former two, we recommend a look @@ -54,56 +55,63 @@ For our purposes, the vectors will always be matrices and the Lie bracket is the matrix commutator. -Our working example in this demo will be the *special unitary* algebra :math:`\mathfrak{su}(4)`. -It consists of traceless complex-valued skew-Hermitian :math:`4\times 4` matrices, i.e., +**Example** + +Our working example in this demo will be the *special unitary* algebra :math:`\mathfrak{su}(2)`. +It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, i.e., .. math:: - \mathfrak{u}(4) = \left\{x \in \mathbb{C}^{(4\times 4)} | x^\dagger = -x , \text{tr}[x]=0\right\}. + \mathfrak{su}(2) = \left\{x \in \mathbb{C}^{(2\times 2)} \large| x^\dagger = -x , \text{tr}[x]=0\right\}. + +We will look at a slightly more complex example at the end of the demo. -.. note:: +.. admonition:: Mathematical detail + :class: note - :math:`\mathfrak{su}(4)` is a *real* Lie algebra, i.e., it is a vector space over the + :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the real numbers :math:`\mathbb{R}`. This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. There is a simple reason to see this; Multiplying a skew-Hermitian matrix - :math:`x\in\mathfrak{u}(4)` by a complex number :math:`c\in\mathbb{C}` will yield + :math:`x\in\mathfrak{su}(n)` by a complex number :math:`c\in\mathbb{C}` will yield :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x`, so that the result might no longer be in the algebra! If we keep it to real scalars :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c`, so that :math:`(cx)^\dagger=-cx` and we're fine. -Let us set up :math:`\mathfrak{su}(4)` in code. For this, we create a basis for traceless -Hermitian :math:`4\times 4` matrices, which is given by the Pauli basis on two qubits. -Note that the algebra itself consists of *skew-*Hermitian matrices, but we will work +Let us set up :math:`\mathfrak{su}(2)` in code. For this, we create a basis for traceless +Hermitian :math:`2\times 2` matrices, which is given by the Pauli operators. +Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work with the Hermitian counterparts as inputs. -We can check that :math:`\mathfrak{su}(4)` is closed under commutators, by +We can check that :math:`\mathfrak{su}(2)` is closed under commutators, by computing all nested commutators, the so-called *Lie closure*, and observing -that the closure is not larger than :math:`\mathfrak{su}(4)` itself. +that the closure is not larger than :math:`\mathfrak{su}(2)` itself. +Of course we could also check the closure manually for this small example. """ from itertools import product, combinations import pennylane as qml import numpy as np -su4 = [op for op in qml.pauli.pauli_group(2)][1:] -print(f"su(4) is {len(su4)}-dimensional") +su2 = [qml.X(0), qml.Y(0), qml.Z(0)] +print(f"su(2) is {len(su2)}-dimensional") -all_skew_hermitian = all(qml.equal(qml.adjoint(op).simplify(), op) for op in su4) -print(f"The operators are all Hermitian: {all_skew_hermitian}") +all_hermitian = all(qml.equal(qml.adjoint(op).simplify(), op) for op in su2) +print(f"The operators are all Hermitian: {all_hermitian}") -su4_lie_closed = qml.pauli.dla.lie_closure(su4) -print(f"The Lie closure of su(4) is {len(su4_lie_closed)}-dimensional.") +su2_lie_closed = qml.pauli.dla.lie_closure(su2) +print(f"The Lie closure of su(2) is {len(su2_lie_closed)}-dimensional.") -traces = [op.pauli_rep.trace() for op in su4] +traces = [op.pauli_rep.trace() for op in su2] print(f"All operators are traceless: {np.allclose(traces, 0.)}") ###################################################################### -# We find that :math:`\mathfrak{su}(4)` indeed is closed, and that it is a 15-dimensional +# We find that :math:`\mathfrak{su}(2)` indeed is closed, and that it is a 3-dimensional # space. We also picked a correct representation with traceless operators. # -# .. note:: +# .. admonition:: Mathematical detail +# :class: note # # Our main result for this demo will be the KAK theorem, which applies to # so-called *semisimple* Lie algebras. We will not go into detail about this notion, but @@ -111,23 +119,73 @@ # three types of *simple* building blocks, namely # (1) special orthogonal algebras :math:`\mathfrak{so}(n)`, (2) unitary symplectic algebras # :math:`\mathfrak{sp}(n)`, and (3) special unitary algebras :math:`\mathfrak{su}(n)`. -# In particular, the unitary :math:`\mathfrak{u}(4)` is not *quite* semisimple; -# it contains a *center*, which is a non-simple component. This is why we here will be -# studying the *special* unitary algebra :math:`\mathfrak{su}(4)`. -# Fortunately, the center of :math:`\mathfrak{u}(4)` is encoded in the trace of -# the operators and generates global phases when used in a quantum gate. As we -# usually can discard global phases anyways, :math:`\mathfrak{su}(4)` is indeed the -# algebra we care about. -# -# - [optional] In particular mention that the adjoint representation is faithful for semisimple algebras. +# In particular, our example here is of the latter type, so it is not only semisimple, +# but even simple. # # Group and algebra interaction # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # -# - Exponential map -# - adjoint action of group on algebra -# - adjoint action of algebra on algebra -> adjoint representation -# - adjoint identity (-> g-sim demo) +# The topic of Lie groups and Lie algebras is a large field of study and there are many +# things we could talk about in this section. For the sake of brevity, however, we will +# only list a few important properties that are needed further below. For more details +# and proofs, refer to your favourite Lie theory book, which might be #TODO +# +# The Lie group :math:`\mathcal{G}` associated to a Lie algebra :math:`\mathfrak{g}` is given +# by the exponential map applied to the algebra: +# +# .. math:: +# +# \exp : \mathfrak{g} \to \exp(\mathfrak{g})=\mathcal{G}, \ x\mapsto \exp(x) +# +# We will only consider Lie groups arising from Lie algebras here, which we denote by +# :math:`\exp(\mathfrak{g})` for an algebra :math:`\mathfrak{g}`. +# As we usually think about the unitary algebras :math:`\mathfrak{u}` and their +# subalgebras, the correspondence is well-known to quantum practitioners: Exponentiate +# a skew-Hermitian matrix to obtain a unitary operation, i.e., a quantum gate. +# +# We will make use of a particular interaction between the algebra :math:`\mathfrak{g}` and +# its group :math:`\mathcal{G}`, called the *adjoint action* of :math:`\mathcal{G}` on :math:`\mathfrak{g}`. +# It is given by +# +# .. math:: +# +# \text{Ad}: \mathcal{G} \times \mathfrak{g} \to \mathfrak{g}, +# \ (\exp(x),y)\mapsto \text{Ad}_{\exp(x)}(y) = \exp(x) y\exp(-x). +# +# Similarly, we can interpret the Lie bracket as a map of :math:`\mathfrak{g}` acting on itself, +# which is called the *adjoint representation* of :math:`\mathfrak{g}` on itself: +# +# .. math:: +# +# \text{ad}: \mathfrak{g} \times \mathfrak{g} \to \mathfrak{g}, +# \ (x, y) \mapsto \text{ad}_x(y) = [x, y]. +# +# The adjoint group action and adjoint algebra representation do not only carry a very +# similar name, they are intimately related: +# +# .. math:: +# +# \text{Ad}_{\exp(x)}(y) = \exp(\text{ad}_x) (y), +# +# where we applied the exponential map to :math:`\text{ad}_x` via its series representation. +# We will refer to this relationship as *adjoint identity*. +# We talk about Ad and ad in more detail in the box below, and refer to our tutorial on +# :doc:`g-sim: Lie algebraic classical simulations ` for +# further discussion. +# +# .. admonition:: Derivation: Adjoint representations +# :class: note +# +# TODO +# An important operation in :math:`\mathcal{G}` is the *adjoint action* on itself, +# given by +# +# .. math:: +# +# \text{Ad}: \mathcal{G} \times \mathcal{G} \to \mathcal{G}, +# \ (\exp(x),\exp(y))\mapsto \text{Ad}_{\exp(x)}(\exp(y)) = \exp(x) \exp(y)\exp(-x). +# +# Consider a curve through :math:`\mathcal{G}` given by # # Subalgebras and Cartan decomposition # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -137,74 +195,135 @@ # :math:`\mathfrak{k}` is closed under addition, scalar multiplication, and the Lie bracket. # The latter often is simply written as :math:`[\mathfrak{k}, \mathfrak{k}]\subset \mathfrak{k}`. # -# The algebras we are interested in come with an inner product between its elements. +# The algebras we are interested in come with an *inner product* between its elements. # For our purposes, it is sufficient to assume that it is # # .. math:: # # \langle x, y\rangle = \text{tr}[x^\dagger y]. # +# Let's implement the inner product and an orthogonality check based on it: +# + + +def inner_product(op1, op2): + """Compute the trace inner product between two operators.""" + # Use two wires to reuse it in the second example on two qubits later on + return qml.math.trace(qml.matrix(qml.adjoint(op1) @ op2, wire_order=[0, 1])) + + +def is_orthogonal(op, basis): + """Check whether an operator is orthogonal to a space given by some basis.""" + return np.allclose([inner_product(op, basis_op) for basis_op in basis], 0) + + +###################################################################### # Given a subalgebra :math:`\mathfrak{k}\subset \mathfrak{g}`, the inner product allows # us to define an orthogonal complement # # .. math:: # -# \mathfrak{m} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \forall y\mathfrak{k}\}. +# \mathfrak{p} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \forall y\mathfrak{k}\}. # # In this context, :math:`\mathfrak{k}` is commonly called the *vertical space*, -# :math:`\mathfrak{m}` accordingly is the *horizontal space*. +# :math:`\mathfrak{p}` accordingly is the *horizontal space*. # The KAK theorem will apply to scenarios in which these spaces satisfy additional # commutation relations, which do not hold for all subalgebras: # # .. math:: # -# [\mathfrak{k}, \mathfrak{m}] \subset& \mathfrak{m} \qquad \text{(Reductive property)}\\ -# [\mathfrak{m}, \mathfrak{m}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. +# [\mathfrak{k}, \mathfrak{p}] \subset& \mathfrak{p} \qquad \text{(Reductive property)}\\ +# [\mathfrak{p}, \mathfrak{p}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. # -# The first property tells us that :math:`\mathfrak{m}` is left intact by the adjoint action of -# :math:`\mathfrak{k}` and that :math:`\mathfrak{m}` behaves like the "opposite" of a subalgebra, i.e., +# The first property tells us that :math:`\mathfrak{p}` is left intact by the adjoint action of +# :math:`\mathfrak{k}` and that :math:`\mathfrak{p}` behaves like the "opposite" of a subalgebra, i.e., # all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. # Due to the adjoint identity from above, the first property also holds for group elements acting on -# algebra elements: +# algebra elements; For all :math:`x\in\mathfrak{p}` and :math:`y\in\mathfrak{k}`, we have # # .. math:: # -# K x K^\dagger = \exp(y) x \exp(-y) \in \mathfrak{m} \quad \forall\ x\in\mathfrak{m}, y\in\mathfrak{k}, -# -# .. note:: +# K x K^\dagger +# = \exp(y) x \exp(-y) +# = \exp(\text{ad}_y) (x) +# = \sum_{n=0}^\infty \frac{1}{n!} \underset{\in\mathfrak{p}}{\underbrace{(\text{ad}_y)^n (x)}} +# \in \mathfrak{p}. # -# If the reductive property holds, the quotient space :math:`G/K` of the groups -# of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. -# If both properties hold, :math:`(\mathfrak{k}, \mathfrak{m})` is called a -# *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{m}` a *Cartan decomposition*. -# :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* -# and the quotient :math:`G/K` is a *symmetric space*. -# Symmetric spaces are relevant for a wide range of applications in physics -# and have been studied a lot throughout the last hundred years. +# If the reductive property holds, the quotient space :math:`G/K` of the groups +# of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. +# If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is called a +# *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a *Cartan decomposition*. +# :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* +# and the quotient :math:`G/K` is a *symmetric space*. +# Symmetric spaces are relevant for a wide range of applications in physics +# and have been studied a lot throughout the last hundred years. # -# .. warning:: +# .. admonition:: Nomenclature +# :class: warning # # Depending on context and field, there are sometimes additional requirements -# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{m}` to be called a Cartan decomposition. +# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{p}` to be called a Cartan decomposition. # -# For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{su}(2)\oplus\mathfrak{su}(2)` -# of :math:`\mathfrak{su}(4)`, consisting of independent single-qubit operations acting -# on either of the two qubits. Concretely, +# **Example** +# +# For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{u}(1)` +# of :math:`\mathfrak{su}(2)` generating Pauli-Z rotations: # # .. math:: # -# \mathfrak{k} = \text{span}_{i\mathbb{R}}\left\{X_0, Y_0, Z_0, X_1, Y_1, Z_1\right\}. +# \mathfrak{k} = \mathbb{R} iZ. # # Let us define it in code, and check whether it gives rise to a Cartan decomposition. +# As we want to look at another example later, we wrap everything in a function. # -def inner_product(op1, op2): - mat1 = qml.matrix(op1, wire_order=[0, 1]) - mat2 = qml.matrix(op2, wire_order=[0, 1]) - return qml.math.trace(mat1.conj().T @ mat2) +def check_cartan_decomposition(g, k, space_name): + """Given an algebra g and an operator subspace k, verify that k is a subalgebra + and gives rise to a Cartan decomposition.""" + # Check Lie closure of k + k_lie_closed = qml.pauli.dla.lie_closure(k) + print( + f"The Lie closure of k is as large as k itself: {len(k_lie_closed)==len(k)}." + ) + + # Orthogonal complement of k, assuming that everything is given in the same basis. + p = [g_op for g_op in g if is_orthogonal(g_op, k)] + print( + f"k has dimension {len(k)}, p has dimension {len(p)}, which combine to " + f"the dimension {len(su2)} of su(2): {len(k)+len(p)==len(su2)}" + ) + + # Check reductive property + k_p_commutators = [qml.commutator(k_op, p_op) for k_op, p_op in product(k, p)] + k_p_coms_in_p = [is_orthogonal(com, k) for com in k_p_commutators] + + print( + f"All commutators in [k, p] are in p (orthogonal to k): {all(k_p_coms_in_p)}." + ) + if all(k_p_coms_in_p): + print(f"{space_name} is a reductive homogeneous space.") + # Check symmetric property + p_p_commutators = [ + qml.commutator(p_op, p_op) for p_op, p_op in combinations(p, r=2) + ] + p_p_coms_in_k = [is_orthogonal(com, p) for com in p_p_commutators] + print( + f"All commutators in [p, p] are in k (orthogonal to p): {all(p_p_coms_in_k)}." + ) + if all(p_p_coms_in_k): + print(f"{space_name} is a symmetric space.") + + return p + + +u1 = [qml.Z(0)] +space_name = "SU(2)/U(1)" +p = check_cartan_decomposition(su2, u1, space_name) + +""" # Subalgebra k = [qml.X(0), qml.Y(0), qml.Z(0), qml.X(1), qml.Y(1), qml.Z(1)] # Check Lie closure of k @@ -212,104 +331,137 @@ def inner_product(op1, op2): print(f"The Lie closure of k is as large as k itself: {len(k_lie_closed)==len(k)}.") # Orthogonal complement of k -m = [op for op in su4 if np.allclose([inner_product(op, k_op) for k_op in k], 0)] +p = [op for op in su4 if np.allclose([inner_product(op, k_op) for k_op in k], 0)] print( - f"k has dimension {len(k)}, m has dimension {len(m)}, which combine to " - f"the dimension {len(su4)} of su(4): {len(k)+len(m)==len(su4)}" + f"k has dimension {len(k)}, p has dimension {len(p)}, which combine to " + f"the dimension {len(su4)} of su(4): {len(k)+len(p)==len(su4)}" ) # Check reductive property -k_m_commutators = [ - k_op.pauli_rep.commutator(m_op.pauli_rep) for k_op, m_op in product(k, m) +k_p_commutators = [ + k_op.pauli_rep.commutator(p_op.pauli_rep) for k_op, p_op in product(k, p) ] -k_m_coms_in_m = [ +k_p_coms_in_p = [ np.allclose([inner_product(com, k_op) for k_op in k], 0) - for com in k_m_commutators + for com in k_p_commutators ] -print(f"All commutators in [k, m] are in m (orthogonal to k): {all(k_m_coms_in_m)}.") -if all(k_m_coms_in_m): +print(f"All commutators in [k, p] are in p (orthogonal to k): {all(k_p_coms_in_p)}.") +if all(k_p_coms_in_p): print("SU(4)/(SU(2)xSU(2)) is a reductive homogeneous space.") # Check symmetric property -m_m_commutators = [ - op1.pauli_rep.commutator(op2.pauli_rep) for op1, op2 in combinations(m, r=2) +p_p_commutators = [ + op1.pauli_rep.commutator(op2.pauli_rep) for op1, op2 in combinations(p, r=2) ] -m_m_coms_in_k = [ - np.allclose([inner_product(com, m_op) for m_op in m], 0) - for com in m_m_commutators +p_p_coms_in_k = [ + np.allclose([inner_product(com, p_op) for p_op in p], 0) + for com in p_p_commutators ] -print(f"All commutators in [m, m] are in k (orthogonal to m): {all(m_m_coms_in_k)}.") -if all(m_m_coms_in_k): +print(f"All commutators in [p, p] are in k (orthogonal to p): {all(p_p_coms_in_k)}.") +if all(p_p_coms_in_k): print("SU(4)/(SU(2)xSU(2)) is a symmetric space.") +""" ###################################################################### # Cartan subalgebras # ~~~~~~~~~~~~~~~~~~ # -# The symmetric property of a Cartan decomposition (:math:`[\mathfrak{m}, \mathfrak{m}]\subset\mathfrak{k}`) -# tells us that :math:`\mathfrak{m}` is very +# The symmetric property of a Cartan decomposition (:math:`[\mathfrak{p}, \mathfrak{p}]\subset\mathfrak{k}`) +# tells us that :math:`\mathfrak{p}` is very # far from being a subalgebra. This also gives us information about potential subalgebras -# *within* :math:`\ \mathfrak{m}`. Assume we have a subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. Then the commutator -# between any two elements :math:`x, y\in\mathfrak{h}` must satisfy +# *within* :math:`\ \mathfrak{p}`. Assume we have a subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. Then the commutator +# between any two elements :math:`x, y\in\mathfrak{a}` must satisfy # # .. math:: # -# [x, y] \in \mathfrak{h} \subset \mathfrak{m} &\Rightarrow [x, y]\in\mathfrak{m} \text{(subalgebra property)} \\ -# [x, y] \in [\mathfrak{h}, \mathfrak{h}] \subset [\mathfrak{m}, \mathfrak{m}]\subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. +# [x, y] \in \mathfrak{a} \subset \mathfrak{p} &\Rightarrow [x, y]\in\mathfrak{p} \text{(subalgebra property)} \\ +# [x, y] \in [\mathfrak{a}, \mathfrak{a}] \subset [\mathfrak{p}, \mathfrak{p}]\subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. # -# That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and :math:`\mathfrak{m}`, -# which only have the zero vector in common. This tells us that *all* commutators in :math:`\mathfrak{h}` +# That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and :math:`\mathfrak{p}`, +# which only have the zero vector in common. This tells us that *all* commutators in :math:`\mathfrak{a}` # vanish, making it an *Abelian* subalgebra: # # .. math:: # -# [\mathfrak{h}, \mathfrak{h}] = \{0\}. +# [\mathfrak{a}, \mathfrak{a}] = \{0\}. # # Such an Abelian subalgebra is a (horizontal) *Cartan subalgebra (CSA)* if it is *maximal*, -# i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{m}`. +# i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{p}`. # -# .. warning:: +# .. admonition:: Nomenclature +# :class: warning # # Depending on context and field, there are inequivalent notions of Cartan subalgebras. # In particular, there is a common notion of Cartan subalgebras which are not contained # in a horizontal space. Throughout this demo, we always mean a *horizontal* -# maximal Abelian subalgebra :math:`\mathfrak{h}\subset\mathfrak{m}`. +# maximal Abelian subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. # -# How many different CSAs are there? Given a CSA :math:`\mathfrak{h}`, we can pick a vertical element +# How many different CSAs are there? Given a CSA :math:`\mathfrak{a}`, we can pick a vertical element # :math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to # all elements of the CSA, using the adjoint action we studied above. -# This will yield a valid CSA again. First, :math:`K\mathfrak{h} K^\dagger` remains in :math:`\mathfrak{m}` +# This will yield a valid CSA again. First, :math:`K\mathfrak{a} K^\dagger` remains in :math:`\mathfrak{p}` # due to the reductive property, as we discussed when introducing the Cartan decomposition. # Second the adjoint action will not change the Abelian property because # # .. math:: # -# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 \quad \forall\ x_{1, 2}\in\mathfrak{h}. +# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 \quad \forall\ x_{1, 2}\in\mathfrak{a}. # -# Finally, we are guaranteed that :math:`K\mathfrak{h} K^\dagger` remains maximal. +# Finally, we are guaranteed that :math:`K\mathfrak{a} K^\dagger` remains maximal. # -# .. note:: +# .. admonition:: Mathematical detail +# :class: note # -# The reason that :math:`K\mathfrak{h} K^\dagger` is maximal if :math:`\mathfrak{h}` was, is +# The reason that :math:`K\mathfrak{a} K^\dagger` is maximal if :math:`\mathfrak{a}` was, is # that we assume :math:`\mathfrak{g}` to be a semisimple Lie algebra, for which the # adjoint representation is faithful. This in turn implies that linearly # independent elements of :math:`\mathfrak{g}` will not be mapped to linearly dependent # elements by the adjoint action of :math:`K`. # -# For most :math:`y\in\mathfrak{k}`, applying :math:`K=exp(y)` in this way will yield a +# For most :math:`y\in\mathfrak{k}`, applying :math:`K=\exp(y)` in this way will yield a # *different* CSA, so that we find a whole continuum of them. # It turns out that they *all* can be found by starting with *any* -# :math:`\mathfrak{h}` and applying all of :math:`\exp(\mathfrak{k})` to it. +# :math:`\mathfrak{a}` and applying all of :math:`\exp(\mathfrak{k})` to it. +# +# *This is what powers the KAK theorem.* # -# TODO: BETTER HIGHLIGHT -# *This fact is what powers the KAK theorem.* +# **Example** # +# For our example, we established the decomposition :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` +# with the two-dimensional horizontal space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}`. +# Starting with the subspace :math:`\mathfrak{a}=\mathbb{R} iY`, we see that we immediately +# reach a maximal Abelian subalgebra, i.e., a CSA, +# because :math:`[Y, X]\neq 0`. Applying a rotation :math:`\exp(i\eta Z)` to this CSA gives us a new CSA via +# +# .. math:: +# +# \mathfrak{a}'=\exp(i\eta Z) (\mathbb{R} iY) \exp(-i\eta Z) = \mathbb{R} (\cos(2\eta) iY + \sin(2\eta) iX). +# +# The vertical group element :math:`\exp(i\eta Z)` simply rotates the CSA within :math:`\mathfrak{p}!` +# Let us not forget to define the CSA in code. + +# CSA generator: iY +a = p[1] + +# Rotate CSA by applying vertical group element +eta = 0.6 +# The factor -2 compensates the convention -1/2 in the RZ gate +# TODO +# a_prime = qml.simplify(qml.prod(qml.RZ(-2 * eta, 0), a, qml.RZ(2 * eta, 0))) +# a_prime = qml.RZ(-2 * eta, 0).pauli_rep @ a.pauli_rep +# print(f"The rotated CSA a' is generated by {a_prime}") + +a_prime_expected = np.cos(2 * eta) * a + np.sin(2 * eta) * p[0] +# a_primes_equal = qml.equal(a_prime_expected, a_prime) +# print(f"This matches the expected rotated CSA from theory: {a_primes_equal}") + +###################################################################### # Involutions # ~~~~~~~~~~~ # # In practice, there often is a more convenient way to a Cartan decomposition # than by specifying the subalgebra :math:`\mathfrak{k}` or its horizontal counterpart -# :math:`\mathfrak{m}` manually. It goes as follows. +# :math:`\mathfrak{p}` manually. It goes as follows. # # We will look at a map :math:`\theta` from the total Lie algebra :math:`\mathfrak{g}` # to itself. We demand that :math:`\theta` has the following properties, for @@ -333,13 +485,14 @@ def inner_product(op1, op2): # Or, in other words, :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, # and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+`. # So an involution is enough to find us a Cartan decomposition, with :math:`\mathfrak{k}=\mathfrak{g}_+` -# and :math:`\mathfrak{m}=\mathfrak{g}_-`. +# and :math:`\mathfrak{p}=\mathfrak{g}_-`. # # 🤯 # # We might want to call such a :math:`\theta` a *Cartan involution*. # -# .. warning:: +# .. admonition:: Nomenclature +# :class: warning # # Some people do so, some people again require more properties for such an # involution to be called Cartan involution. @@ -351,14 +504,15 @@ def inner_product(op1, op2): # # .. math:: # -# \theta_{\mathfrak{k}}(x) = \Pi_{\mathfrak{k}}(x)-\Pi_{\mathfrak{m}}(x), +# \theta_{\mathfrak{k}}(x) = \Pi_{\mathfrak{k}}(x)-\Pi_{\mathfrak{p}}(x), # # where :math:`\Pi` are the projectors onto the two vector subspaces. # Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. # It is also compatible with the commutator due to the commutation relations -# between :math:`\mathfrak{k}` and :math:`\mathfrak{m}` (see box). +# between :math:`\mathfrak{k}` and :math:`\mathfrak{p}` (see box). # -# .. note:: +# .. admonition:: Mathematical detail +# :class: note # # To see that :math:`\theta_{\mathfrak{k}}` is compatible with the commutator, we compute # the action of the projectors on it: @@ -366,41 +520,41 @@ def inner_product(op1, op2): # .. math:: # # \Pi_{\mathfrak{k}}([x, y]) -# &= \Pi_{\mathfrak{k}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ +# &= \Pi_{\mathfrak{k}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{p}}(y) \\ # &= \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}) -# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}})\\ -# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]\\ -# \Pi_{\mathfrak{m}}([x, y]) -# &= \Pi_{\mathfrak{m}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{m}}(y) \\ -# &= \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)]}}) -# \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{m}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{m}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)]}})\\ -# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)] -# -# Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{m}}` and the -# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{m}`. +# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)]}}) +# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]}})\\ +# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]\\ +# \Pi_{\mathfrak{p}}([x, y]) +# &= \Pi_{\mathfrak{p}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{p}}(y) \\ +# &= \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)]}}) +# \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]}}) +# \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]}})\\ +# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)] +# +# Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{p}}` and the +# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{p}`. # # We can put thes pieces together to get # # .. math:: # # \theta_{\mathfrak{k}} ([x, y]) -# &=\Pi_{\mathfrak{k}}([x, y]) - \Pi_{\mathfrak{m}}([x, y])\\ -# &=[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{m}}(y)] -# - [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{m}}(y)] - [\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)]\\ -# &=[\Pi_{\mathfrak{k}}(x) -\Pi_{\mathfrak{m}}(x), \Pi_{\mathfrak{k}}(y)-\Pi_{\mathfrak{m}}(y)]\\ +# &=\Pi_{\mathfrak{k}}([x, y]) - \Pi_{\mathfrak{p}}([x, y])\\ +# &=[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)] +# - [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)] - [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]\\ +# &=[\Pi_{\mathfrak{k}}(x) -\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)-\Pi_{\mathfrak{p}}(y)]\\ # &=[\theta_{\mathfrak{k}} (x),\theta_{\mathfrak{k}} (y)]. # # Finally, :math:`\theta_{\mathfrak{k}}` is an involution because # # .. math:: # -# \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{m}})^2 -# = \Pi_{\mathfrak{k}}^2-\Pi_{\mathfrak{k}}\Pi_{\mathfrak{m}}-\Pi_{\mathfrak{m}}\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{m}}^2 -# =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{m}} +# \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}})^2 +# = \Pi_{\mathfrak{k}}^2-\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}}-\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{p}}^2 +# =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}} # = \mathbb{I}_{\mathfrak{g}}, # # where we used the projector's properties. @@ -408,13 +562,147 @@ def inner_product(op1, op2): # This shows us that we can easily switch between a Cartan involution and a Cartan # decomposition, in either direction! # +# **Example** +# +# In our example, an involution that reproduces our choice :math:`\mathfrak{k}=\mathbb{R} iZ` is +# :math:`\theta_Z(x) = Z x Z` (Convince yourself that it is an involution that respects commutators). + + +def theta_Z(x): + return qml.simplify(qml.Z(0) @ x @ qml.Z(0)) + + +theta_of_u1 = [theta_Z(x) for x in u1] +u1_is_su2_plus = all( + qml.equal(x, theta_of_x) for x, theta_of_x in zip(u1, theta_of_u1) +) +print(f"U(1) is the +1 eigenspace: {u1_is_su2_plus}") + +theta_of_p = [theta_Z(x) for x in p] +p_is_su2_minus = all( + qml.equal(-x, theta_of_x) for x, theta_of_x in zip(p, theta_of_p) +) +print(f"p is the -1 eigenspace: {p_is_su2_minus}") + +###################################################################### +# +# We can easily get a new subalgebra by modifying the involution, say, to :math:`\theta_Y(x) = Y x Y`, +# expecting that :math:`k_Y=\mathbb{R} iY` becomes the new subalgebra. + + +def theta_Y(x): + return qml.simplify(qml.Y(0) @ x @ qml.Y(0)) + + +eigvals = [] +for x in su2: + if qml.equal(theta_Y(x), x): + eigvals.append(1) + elif qml.equal(theta_Y(x), -x): + eigvals.append(-1) + else: + raise ValueError("Operator not purely in either eigenspace.") + +print( + f"Under the involution theta_Y, the operators\n{su2}\nhave the eigenvalues\n{eigvals}" +) + +###################################################################### +# This worked! a new involution gave us a new subalgebra and Cartan decomposition. +# +# .. adminition:: Mathematical detail +# :class: note +# +# You might already see that the two different decompositions created by :math:`\theta_Z` +# and :math:`\theta_Y` are very similar. There is a whole field of study +# characterizing---and even fully classifying---the possible Cartan decompositions +# of semisimple Lie algebras. We will not go into detail here, but this classification +# plays a big role when talking about decompositions without getting stuck on details +# like the choice of basis or the representation of the algebra. +# # KAK theorem # ~~~~~~~~~~~ # -# - KP decomposition -# - KAK decomposition -# - [optional] implication: KaK on algebra level +# Now that we covered all prerequisites, we are ready for our main result. It consists of two steps +# that are good to know my themselves, so we will look at both of them in sequence. We will not conduct +# formal proofs but leave those to the literature references. +# In the following, let :math:`\mathfrak{g}` be a compact real semisimple Lie algebra and :math:`\mathfrak{k}` +# a subalgebra such that :math:`\mathfrak{g}=\mathfrak{k}\oplus \mathfrak{p}` is a Cartan decomposition. +# +# The first step is a decomposition of the Lie group :math:`\mathcal{G}=\exp(\mathfrak{g})` into the Lie subgroup +# :math:`\mathcal{K}=\exp(\mathfrak{k})` and the exponential of the horizontal space, :math:`\mathcal{P}=\exp(\mathfrak{p})`, +# *which is not a group*. The decomposition is a simple product within :math:`\mathcal{G}`: +# +# .. math:: +# +# \mathcal{G} = \mathcal{K}\mathcal{P}, \text{ or }\ \forall\ G\in\mathcal{G} \exists K\in\mathcal{K}, x\in\mathcal{m}: G = K \exp(x) +# +# This "KP" decomposition can be seen as the "group version" of +# :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}`. +# +# The second step is the further decomposition of the space :math:`\mathcal{P}=\exp(\mathfrak{p})`. +# We start by fixing a Cartan subalgebra (CSA) :math:`\mathfrak{a}\subset\mathfrak{p}`. +# Given a horizontal vector :math:`x\in\mathfrak{p}`, we can construct a second CSA +# :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x`. Now, recall that for any two +# CSAs there is a subalgebra element :math:`y\in\mathfrak{k}` such that the adjoint action of +# :math:`\exp(y)` maps one CSA to the other. In particular, there is a :math:`y\in\mathfrak{k}` +# so that +# .. math:: +# +# \exp(y)\mathfrak{a}_x\exp(-y)=\mathfrak{a}\quad\Rightarrow\quad x\in(\exp(-y) \mathfrak{a}\exp(y). +# +# Generalizing this statement across all horizontal elements :math:`x\in\mathfrak{p}`, we find +# +# .. math:: +# +# \mathfrak{p} \subset \{\exp(-y) \mathfrak{a} \exp(y) | y\in\mathfrak{k}\}. +# +# As we discussed, the converse inclusion also must hold for a reductive space, so that we may even replace +# :math:`\subset` by an equality. +# Now we can use :math:`\exp(\text{Ad}_{\exp(-y)} x)=\text{Ad}_{\exp(-y)}\exp(x)` to move this statement +# to the group level, +# +# .. math:: +# +# \mathcal{P} +# = \{\exp(\exp(-y) \mathfrak{a} \exp(y)) | y\in\mathfrak{k}\} +# = \{K^{-1} \mathcal{A} K | K\in\mathcal{K}\}, +# +# where we abbreviated :math:`\mathcal{A} = \exp(\mathfrak{a})`. +# +# Chaining the two steps together and combining the left factor :math:`K^{-1}` with the group +# :math:`\mathcal{K}` in the "KP" decomposition, we obtain the *KAK theorem* +# +# .. math:: +# +# \mathcal{G} &= \mathcal{K} \mathcal{A} \mathcal{K} \quad\textbf{(KAK Theorem).} +# +# It teaches us that any group element can be decomposed into two factors from the Lie subgroup and +# the exponential of a CSA element, i.e., of commuting elements from the horizontal subspace +# :math:`\mathfrak{p}`. This may already hint at the usefulness of the KAK theorem for matrix +# factorizations in general, and for quantum circuit decompositions in particular. +# +# **Example** +# +# Applying what we just learned to our example on :math:`\mathfrak{su}(2)`, we can state that +# any single-qubit gate can be implemented by running a gate from +# :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\}`, a CSA gate +# :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\}`, and another gate from :math:`\mathcal{K}`. +# We rediscovered a standard decomposition of an arbitrary :class:`~.pennylane.Rot` gate! + +print(qml.Rot(0.5, 0.2, -1.6, wires=0).decomposition()) + +###################################################################### +# Other choices for involutions or---equivalently---subalgebras :math:`\mathfrak{k}` will +# lead to other decompositions of ``Rot``. For example, using :math:`\theta_Y` from above +# together with the CSA :math:`\mathfrak{a_Y}=\mathbb{R} iX`, we find the decomposition +# +# .. math:: +# +# \text{Rot}(\phi, \theta, \omega) = R_Y(\eta_1) R_X(\vartheta) R_Y(\eta_2). # +# And that's it for our main discussion. We conclude this demo by applying the +# KAK theorem to the group of arbitrary two-qubit gates. # # Two-qubit KAK decomposition # --------------------------- From ea8eebbd9ec296ff00bf29aa44af3f824962dca9 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Fri, 18 Oct 2024 21:40:19 +0200 Subject: [PATCH 07/32] almost finalize draft --- demonstrations/tutorial_kak_theorem.py | 206 ++++++++++++++++--------- 1 file changed, 130 insertions(+), 76 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index e75cd86a78..984dd72851 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -33,15 +33,12 @@ at your favourite linear algebra material, for the latter see our :doc:`introduction to (dynamical) Lie algebras `. +TODO: DO WE NEED MORE INTRODUCTION HERE? -Introduction ------------- +Lie algebras and their groups +----------------------------- -Basic mathematical objects --------------------------- - -Introduce the mathematical objects that will play together to yield -the KAK theorem. +#TODO (Semi-)simple Lie algebras ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -92,9 +89,11 @@ from itertools import product, combinations import pennylane as qml +from pennylane import X, Y, Z import numpy as np +import matplotlib.pyplot as plt -su2 = [qml.X(0), qml.Y(0), qml.Z(0)] +su2 = [X(0), Y(0), Z(0)] print(f"su(2) is {len(su2)}-dimensional") all_hermitian = all(qml.equal(qml.adjoint(op).simplify(), op) for op in su2) @@ -122,8 +121,8 @@ # In particular, our example here is of the latter type, so it is not only semisimple, # but even simple. # -# Group and algebra interaction -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Lie group from Lie algebra +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ # # The topic of Lie groups and Lie algebras is a large field of study and there are many # things we could talk about in this section. For the sake of brevity, however, we will @@ -143,6 +142,9 @@ # subalgebras, the correspondence is well-known to quantum practitioners: Exponentiate # a skew-Hermitian matrix to obtain a unitary operation, i.e., a quantum gate. # +# Interaction between group and algebra +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # We will make use of a particular interaction between the algebra :math:`\mathfrak{g}` and # its group :math:`\mathcal{G}`, called the *adjoint action* of :math:`\mathcal{G}` on :math:`\mathfrak{g}`. # It is given by @@ -187,8 +189,11 @@ # # Consider a curve through :math:`\mathcal{G}` given by # -# Subalgebras and Cartan decomposition -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Symmetric spaces +# ---------------- +# +# Subalgebras and Cartan decompositions +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # A *subalgebra* :math:`\mathfrak{k}` of a Lie algebra :math:`\mathfrak{g}` is a # vector subspace that is closed under the Lie bracket. Overall, this means that @@ -291,7 +296,7 @@ def check_cartan_decomposition(g, k, space_name): p = [g_op for g_op in g if is_orthogonal(g_op, k)] print( f"k has dimension {len(k)}, p has dimension {len(p)}, which combine to " - f"the dimension {len(su2)} of su(2): {len(k)+len(p)==len(su2)}" + f"the dimension {len(g)} of g: {len(k)+len(p)==len(g)}" ) # Check reductive property @@ -319,49 +324,10 @@ def check_cartan_decomposition(g, k, space_name): return p -u1 = [qml.Z(0)] +u1 = [Z(0)] space_name = "SU(2)/U(1)" p = check_cartan_decomposition(su2, u1, space_name) -""" -# Subalgebra -k = [qml.X(0), qml.Y(0), qml.Z(0), qml.X(1), qml.Y(1), qml.Z(1)] -# Check Lie closure of k -k_lie_closed = qml.pauli.dla.lie_closure(k) -print(f"The Lie closure of k is as large as k itself: {len(k_lie_closed)==len(k)}.") - -# Orthogonal complement of k -p = [op for op in su4 if np.allclose([inner_product(op, k_op) for k_op in k], 0)] -print( - f"k has dimension {len(k)}, p has dimension {len(p)}, which combine to " - f"the dimension {len(su4)} of su(4): {len(k)+len(p)==len(su4)}" -) - -# Check reductive property -k_p_commutators = [ - k_op.pauli_rep.commutator(p_op.pauli_rep) for k_op, p_op in product(k, p) -] -k_p_coms_in_p = [ - np.allclose([inner_product(com, k_op) for k_op in k], 0) - for com in k_p_commutators -] -print(f"All commutators in [k, p] are in p (orthogonal to k): {all(k_p_coms_in_p)}.") -if all(k_p_coms_in_p): - print("SU(4)/(SU(2)xSU(2)) is a reductive homogeneous space.") - -# Check symmetric property -p_p_commutators = [ - op1.pauli_rep.commutator(op2.pauli_rep) for op1, op2 in combinations(p, r=2) -] -p_p_coms_in_k = [ - np.allclose([inner_product(com, p_op) for p_op in p], 0) - for com in p_p_commutators -] -print(f"All commutators in [p, p] are in k (orthogonal to p): {all(p_p_coms_in_k)}.") -if all(p_p_coms_in_k): - print("SU(4)/(SU(2)xSU(2)) is a symmetric space.") -""" - ###################################################################### # Cartan subalgebras # ~~~~~~~~~~~~~~~~~~ @@ -445,19 +411,18 @@ def check_cartan_decomposition(g, k, space_name): # Rotate CSA by applying vertical group element eta = 0.6 -# The factor -2 compensates the convention -1/2 in the RZ gate -# TODO -# a_prime = qml.simplify(qml.prod(qml.RZ(-2 * eta, 0), a, qml.RZ(2 * eta, 0))) -# a_prime = qml.RZ(-2 * eta, 0).pauli_rep @ a.pauli_rep -# print(f"The rotated CSA a' is generated by {a_prime}") +# The factor -2 compensates the convention -1/2 in the RZ gate +a_prime = qml.RZ(-2 * eta, 0) @ a @ qml.RZ(2 * eta, 0) a_prime_expected = np.cos(2 * eta) * a + np.sin(2 * eta) * p[0] -# a_primes_equal = qml.equal(a_prime_expected, a_prime) -# print(f"This matches the expected rotated CSA from theory: {a_primes_equal}") +a_primes_equal = np.allclose(qml.matrix(a_prime_expected), qml.matrix(a_prime)) +print( + f"The numerically rotated CSA matches the expectation from theory: {a_primes_equal}" +) ###################################################################### -# Involutions -# ~~~~~~~~~~~ +# Cartan involutions +# ~~~~~~~~~~~~~~~~~~ # # In practice, there often is a more convenient way to a Cartan decomposition # than by specifying the subalgebra :math:`\mathfrak{k}` or its horizontal counterpart @@ -471,7 +436,8 @@ def check_cartan_decomposition(g, k, space_name): # #. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)]`, and # #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x`. # -# Put compactly, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}`. +# In short, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}`. +# # As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1`, with associated # eigenspaces :math:`\mathfrak{g}_\pm`. Let's see what happens when we compute commutators between # elements :math:`x_\pm\in\mathfrak{g}_\pm`: @@ -569,7 +535,7 @@ def check_cartan_decomposition(g, k, space_name): def theta_Z(x): - return qml.simplify(qml.Z(0) @ x @ qml.Z(0)) + return qml.simplify(Z(0) @ x @ Z(0)) theta_of_u1 = [theta_Z(x) for x in u1] @@ -591,7 +557,7 @@ def theta_Z(x): def theta_Y(x): - return qml.simplify(qml.Y(0) @ x @ qml.Y(0)) + return qml.simplify(Y(0) @ x @ Y(0)) eigvals = [] @@ -610,7 +576,7 @@ def theta_Y(x): ###################################################################### # This worked! a new involution gave us a new subalgebra and Cartan decomposition. # -# .. adminition:: Mathematical detail +# .. admonition:: Mathematical detail # :class: note # # You might already see that the two different decompositions created by :math:`\theta_Z` @@ -620,8 +586,8 @@ def theta_Y(x): # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra. # -# KAK theorem -# ~~~~~~~~~~~ +# The KAK theorem +# --------------- # # Now that we covered all prerequisites, we are ready for our main result. It consists of two steps # that are good to know my themselves, so we will look at both of them in sequence. We will not conduct @@ -675,7 +641,9 @@ def theta_Y(x): # # .. math:: # -# \mathcal{G} &= \mathcal{K} \mathcal{A} \mathcal{K} \quad\textbf{(KAK Theorem).} +# \mathcal{G} +# &= \{\exp(y_1) \exp(a) \exp(y_2) | a\in\mathfrak{a}, \ y_{1, 2}\in\mathfrak{k}\}\\ +# &= \mathcal{K} \mathcal{A} \mathcal{K} \qquad\textbf{(KAK Theorem).} # # It teaches us that any group element can be decomposed into two factors from the Lie subgroup and # the exponential of a CSA element, i.e., of commuting elements from the horizontal subspace @@ -704,16 +672,102 @@ def theta_Y(x): # And that's it for our main discussion. We conclude this demo by applying the # KAK theorem to the group of arbitrary two-qubit gates. # -# Two-qubit KAK decomposition -# --------------------------- +# Application: Two-qubit gate decomposition +# ----------------------------------------- # -# - Algebra/subalgebra :math:`\mathfrak{g} =\mathfrak{su}(4) | \mathfrak{k} =\mathfrak{su}(2) \oplus \mathfrak{su}(2)` -# - Involution: EvenOdd -# - CSA: :math:`\mathfrak{a} = \langle\{XX, YY, ZZ\}\rangle_{i\mathbb{R}}` -# - KAK decomposition :math:`U= (A\otimes B) \exp(i(\eta_x XX+\eta_y YY +\eta_z ZZ)) (C\otimes D)`. -# - [optional] Mention Cartan coordinates +# Two-qubit operations are described by the special unitary group :math:`SU(4)` and +# here we will use a decomposition of its algebra :math:`\mathfrak{su}(4)` to decompose +# such gates. +# Specifically, we use the subalgebra that generates single-qubit operations independently +# on either qubit, :math:`\mathfrak{su}(2)\oplus\mathfrak{su}(2)`. Let's set it up with our +# tool from earlier: + +# Define su(4). Skip first entry of Pauli group, which is the identity +su4 = list(qml.pauli.pauli_group(2))[1:] +print(f"su(4) is {len(su4)}-dimensional") + +# Define subalgebra su(2) ⊕ su(2) +su2_su2 = [X(0), Y(0), Z(0), X(1), Y(1), Z(1)] +space_name = "SU(4)/(SU(2)xSU(2))" +p = check_cartan_decomposition(su4, su2_su2, space_name) ###################################################################### +# .. admonition:: Mathematical detail +# :class: note +# +# The accompanying involution sorts operators by the number of qubits on which they are +# supported (:math:`\mathfrak{k}` is supported on one, :math:`\mathfrak{p}` on two). +# This can be realized with the operation +# +# .. math:: +# +# \theta(x) = -Y_0Y_1 x^T Y_0Y_1. +# +# Intuitively, the conjugation by :math:`Y_0Y_1` adds a minus +# sign for each :math:`X` and :math:`Z` factor in :math:`x`, and the transposition +# adds a minus sign for each :math:`Y`. Taken together, each Pauli operator contributes +# a minus sign. Finally, as we want the single-qubit operators to receive no sign in total, +# we add a minus sign overall. +# +# Now we can pick a Cartan subalgebra within :math:`\mathfrak{p}`, the vector space +# of all two-qubit Paulis. A common choice for this decomposition is +# +# .. math:: +# +# \mathfrak{a} = \text{span}_{\mathbb{R}}\{iX_0X_1, iY_0Y_1, iZ_0Z_1\} +# +# Clearly, these three operators commute, making :math:`\mathfrak{a}` Abelian. +# They also form a *maximal* Abelian algebra within :math:`\mathfrak{p}`, which is less obvious. +# +# The KAK theorem now tells us that any two-qubit gate :math:`U,` being part of +# :math:`SU(4)`, can be implemented by a sequence +# +# .. math:: +# +# U &= \exp(y_1) \exp(a)\exp(y_2)\\ +# &= \exp(i[\varphi^x_0 X_0 + \varphi^y_0 Y_0 + \varphi^z_0 Z_0]) +# \exp(i[\varphi^x_1 X_1 + \varphi^y_1 Y_1 + \varphi^z_1 Z_1])\\ +# &\times \exp(i [\eta^x X_0X_1 + \eta^y Y_0Y_1 + \eta^z Z_0Z_1])\\ +# &\times \exp(i[\vartheta^x_0 X_0 + \vartheta^y_0 Y_0 + \vartheta^z_0 Z_0]) +# \exp(i[\vartheta^x_1 X_1 + \vartheta^y_1 Y_1 + \vartheta^z_1 Z_1]). +# +# Here we decomposed the exponentials of the vertical elements :math:`y_{1,2}` further by splitting them +# into exponentials acting on the first and second qubit, respectively. +# +# The three parameters :math:`\eta^{x, y, z}` sometimes are called the Cartan coordinates +# of :math:`U`, and they can be used, e.g., to assess the smallest-possible duration to +# implement the gate in hardware. +# +# With this result, we can implement a template that can create any two-qubit gate. +# We'll use :class:`~.pennylane.Rot` for the single-qubit exponentials (which changes +# the meaning of the angles, but maintains coverage) and are allowed to +# split the Cartan subalgebra term :math:`\exp(a)` into three exponentials, as the +# terms commute. +# + + +def su4_gate(params): + phi0, phi1, eta, theta0, theta1 = np.split(params, range(3, 15, 3)) + qml.Rot(*phi0, wires=0) + qml.Rot(*phi1, wires=1) + qml.IsingXX(eta[0], wires=[0, 1]) + qml.IsingYY(eta[1], wires=[0, 1]) + qml.IsingZZ(eta[2], wires=[0, 1]) + qml.Rot(*theta0, wires=0) + qml.Rot(*theta1, wires=1) + + +params = np.random.random(15) +fig, ax = qml.draw_mpl(su4_gate, wire_order=[0, 1])(params) + +###################################################################### +# And that's a wrap on our KAK theorem application for two-qubit gates! +# +# You may have noticed that the theorem only states the existence of a +# decomposition, but does not provide a constructive way of finding +# :math:`y_{1,2}` and :math:`a` for a given gate :math:`U`. If you are +# curious about this question, watch out for follow-up demos! +# # Conclusion # ---------- # From c2485e44c62ee24c979b566517d2f7d3ef460edb Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 23 Oct 2024 11:08:43 +0200 Subject: [PATCH 08/32] polish --- demonstrations/tutorial_kak_theorem.py | 308 ++++++++++++++----------- 1 file changed, 178 insertions(+), 130 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 984dd72851..4de3496fdc 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -2,22 +2,19 @@ =================== The KAK theorem is a beautiful mathematical result from Lie theory, with -particular relevance for quantum computing research. It can be seen as a +particular relevance for quantum computing. It can be seen as a generalization of the singular value decomposition, and therefore falls under the large umbrella of matrix factorizations. This allows us to -use it for quantum circuit decompositions. However, it can also -be understood from a more abstract point of view, as we will see. +use it for quantum circuit decompositions. In this demo, we will discuss so-called symmetric spaces, which arise from -subgroups of Lie groups. For this, we will focus on the algebraic level -and introduce Cartan decompositions, horizontal -and vertical subspaces, as well as (horizontal) Cartan subalgebras. -With these tools in our hands, we will then learn about the KAK theorem -itself. +certain subgroups of Lie groups. For this, we will focus on the Lie algebras +of these groups. With these tools in our hands, we will then learn about +the KAK theorem itself. -As an application, we will get to know a handy decomposition of arbitrary -two-qubit unitaries into rotation gates. We will use this example throughout -to accompany the mathematical derivation in code. +We will make all steps explicit on a toy example on paper and in code. +Finally, we will get to know a handy decomposition of arbitrary +two-qubit unitaries into rotation gates as an application of the KAK theorem. .. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png @@ -29,16 +26,21 @@ :class: note In the following we will assume a basic understanding of vector spaces, - linear maps, and Lie algebras. For the former two, we recommend a look - at your favourite linear algebra material, for the latter see our + linear maps, and Lie algebras. To review those topics, we recommend a look + at your favourite linear algebra material. For the latter also see our :doc:`introduction to (dynamical) Lie algebras `. -TODO: DO WE NEED MORE INTRODUCTION HERE? + +Along the way, we will box up some mathematical details that are not essential +to follow the demo, as well as a few gotchas regarding the nomenclature, +which unfortunately is not fully consistent in the literature. +Without further ado, let's get started! Lie algebras and their groups ----------------------------- -#TODO +We start by introducing Lie algebras and the Lie groups they give rise to, +as well as a particular interaction between the two, the *adjoint action*. (Semi-)simple Lie algebras ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -48,8 +50,8 @@ see our :doc:`intro to (dynamical) Lie algebras `). A *Lie algebra* :math:`\mathfrak{g}` is a vector space with an additional operation -between two vectors, called the *Lie bracket*, that yields a vector again. -For our purposes, the vectors will always be matrices and the Lie bracket is the matrix +between two vectors, called the *Lie bracket*, that yields a new vector. +For our purposes, the vectors will always be matrices and the Lie bracket will be the matrix commutator. **Example** @@ -59,9 +61,10 @@ .. math:: - \mathfrak{su}(2) = \left\{x \in \mathbb{C}^{(2\times 2)} \large| x^\dagger = -x , \text{tr}[x]=0\right\}. + \mathfrak{su}(2) + = \left\{x \in \mathbb{C}^{(2\times 2)} \large| x^\dagger = -x , \text{tr}[x]=0\right\}. -We will look at a slightly more complex example at the end of the demo. +We will look at a more involved example at the end of the demo. .. admonition:: Mathematical detail :class: note @@ -77,6 +80,8 @@ :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c`, so that :math:`(cx)^\dagger=-cx` and we're fine. + We will only consider real Lie algebras here. + Let us set up :math:`\mathfrak{su}(2)` in code. For this, we create a basis for traceless Hermitian :math:`2\times 2` matrices, which is given by the Pauli operators. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work @@ -136,8 +141,8 @@ # # \exp : \mathfrak{g} \to \exp(\mathfrak{g})=\mathcal{G}, \ x\mapsto \exp(x) # -# We will only consider Lie groups arising from Lie algebras here, which we denote by -# :math:`\exp(\mathfrak{g})` for an algebra :math:`\mathfrak{g}`. +# We will only consider Lie groups :math:`\exp(\mathfrak{g})` arising from a Lie algebra +# :math:`\mathfrak{g}` here. # As we usually think about the unitary algebras :math:`\mathfrak{u}` and their # subalgebras, the correspondence is well-known to quantum practitioners: Exponentiate # a skew-Hermitian matrix to obtain a unitary operation, i.e., a quantum gate. @@ -146,8 +151,8 @@ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # We will make use of a particular interaction between the algebra :math:`\mathfrak{g}` and -# its group :math:`\mathcal{G}`, called the *adjoint action* of :math:`\mathcal{G}` on :math:`\mathfrak{g}`. -# It is given by +# its group :math:`\mathcal{G}`, called the *adjoint action* of :math:`\mathcal{G}` on +# :math:`\mathfrak{g}`. It is given by # # .. math:: # @@ -178,20 +183,57 @@ # .. admonition:: Derivation: Adjoint representations # :class: note # -# TODO -# An important operation in :math:`\mathcal{G}` is the *adjoint action* on itself, +# We begin this derivation with the *adjoint action* of :math:`\mathcal{G}` on itself, # given by # # .. math:: # -# \text{Ad}: \mathcal{G} \times \mathcal{G} \to \mathcal{G}, -# \ (\exp(x),\exp(y))\mapsto \text{Ad}_{\exp(x)}(\exp(y)) = \exp(x) \exp(y)\exp(-x). +# \Psi: \mathcal{G} \times \mathcal{G} \to \mathcal{G}, +# \ (\exp(x),\exp(y))\mapsto \Psi_{\exp(x)}(\exp(y)) = \exp(x) \exp(y)\exp(-x). +# +# The map :math:`\Psi_{\exp(x)}` is a smooth map from the Lie group :math:`\mathcal{G}` +# to itself, so that we may differentiate it. This leads to the differential +# :math:`\text{Ad}_{\exp(x)}=d\Psi_{\exp(x)}` which maps the tangent spaces of +# :math:`\mathcal{G}` to itself. In particular, at the identity :math:`e=\exp(0)` where +# the algebra :math:`\mathfrak{g}` forms the tangent space, we find +# +# .. math:: +# +# \text{Ad}_{\exp(x)} : \mathfrak{g} \to \mathfrak{g}, +# \ y\mapsto \exp(x) y \exp(-x). +# +# This is the adjoint action of :math:`\mathcal{G}` on :math:`\mathfrak{g}` as we +# introduced above. +# If we want to understand this interaction abstractly, it is useful to view this +# transformation as the modification of the tangent vector :math:`y` to a new tangent +# vector that gives rise to the curve :math:`\exp(x) \exp(ty)\exp(-x)` instead of the +# original curve :math:`\exp(ty)`. We will not go into detail here. +# +# Now that we have the adjoint action of :math:`\mathcal{G}` on :math:`\mathfrak{g}`, +# we can differentiate it with respect to the subscript argument: +# +# .. math:: +# +# \text{ad}_{\circ}(y)&=d\text{Ad}_\circ(y)\\ +# \text{ad}: \mathfrak{g}\times \mathfrak{g}&\to\mathfrak{g}, +# \ (x, y)\mapsto \text{ad}_x(y) = [x, y]. +# +# It is a non-trivial observation that this differential equals the commutator! +# With ad we arrived at a map that *represents* the action of an algebra element +# :math:`x` on the vector space that is the algebra itself. That is, we found the +# *adjoint representation* of :math:`\mathfrak{g}`. # -# Consider a curve through :math:`\mathcal{G}` given by +# Finally, note that the adjoint identity can be proven by with similar tools as above, +# i.e., chaining derivatives and exponentiation suitably. #TODO ref # # Symmetric spaces # ---------------- # +# Symmetric spaces are a popular field of study both in physics and mathematics. +# We will not go into depth regarding their interpretation or classification, but refer the +# interested reader to #TODO refs. +# In the following, we mostly care about the algebraic structure of symmetric spaces. +# # Subalgebras and Cartan decompositions # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # @@ -241,10 +283,11 @@ def is_orthogonal(op, basis): # [\mathfrak{p}, \mathfrak{p}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. # # The first property tells us that :math:`\mathfrak{p}` is left intact by the adjoint action of -# :math:`\mathfrak{k}` and that :math:`\mathfrak{p}` behaves like the "opposite" of a subalgebra, i.e., -# all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. -# Due to the adjoint identity from above, the first property also holds for group elements acting on -# algebra elements; For all :math:`x\in\mathfrak{p}` and :math:`y\in\mathfrak{k}`, we have +# :math:`\mathfrak{k}` and that :math:`\mathfrak{p}` behaves like the "opposite" of a +# subalgebra, i.e., all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. +# Due to the adjoint identity from above, the first property also holds for group elements +# acting on algebra elements; For all :math:`x\in\mathfrak{p}` and :math:`y\in\mathfrak{k}`, +# we have # # .. math:: # @@ -256,8 +299,8 @@ def is_orthogonal(op, basis): # # If the reductive property holds, the quotient space :math:`G/K` of the groups # of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. -# If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is called a -# *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a *Cartan decomposition*. +# If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is called a *Cartan pair* and +# we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a *Cartan decomposition*. # :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* # and the quotient :math:`G/K` is a *symmetric space*. # Symmetric spaces are relevant for a wide range of applications in physics @@ -287,10 +330,9 @@ def check_cartan_decomposition(g, k, space_name): """Given an algebra g and an operator subspace k, verify that k is a subalgebra and gives rise to a Cartan decomposition.""" # Check Lie closure of k - k_lie_closed = qml.pauli.dla.lie_closure(k) - print( - f"The Lie closure of k is as large as k itself: {len(k_lie_closed)==len(k)}." - ) + k_lie_closure = qml.pauli.dla.lie_closure(k) + k_is_closed = len(k_lie_closure) == len(k) + print(f"The Lie closure of k is as large as k itself: {k_is_closed}.") # Orthogonal complement of k, assuming that everything is given in the same basis. p = [g_op for g_op in g if is_orthogonal(g_op, k)] @@ -301,24 +343,18 @@ def check_cartan_decomposition(g, k, space_name): # Check reductive property k_p_commutators = [qml.commutator(k_op, p_op) for k_op, p_op in product(k, p)] - k_p_coms_in_p = [is_orthogonal(com, k) for com in k_p_commutators] + k_p_coms_in_p = all([is_orthogonal(com, k) for com in k_p_commutators]) - print( - f"All commutators in [k, p] are in p (orthogonal to k): {all(k_p_coms_in_p)}." - ) - if all(k_p_coms_in_p): + print(f"All commutators in [k, p] are in p (orthogonal to k): {k_p_coms_in_p}.") + if k_p_coms_in_p: print(f"{space_name} is a reductive homogeneous space.") # Check symmetric property - p_p_commutators = [ - qml.commutator(p_op, p_op) for p_op, p_op in combinations(p, r=2) - ] - p_p_coms_in_k = [is_orthogonal(com, p) for com in p_p_commutators] + p_p_commutators = [qml.commutator(*ops) for ops in combinations(p, r=2)] + p_p_coms_in_k = all([is_orthogonal(com, p) for com in p_p_commutators]) - print( - f"All commutators in [p, p] are in k (orthogonal to p): {all(p_p_coms_in_k)}." - ) - if all(p_p_coms_in_k): + print(f"All commutators in [p, p] are in k (orthogonal to p): {p_p_coms_in_k}.") + if p_p_coms_in_k: print(f"{space_name} is a symmetric space.") return p @@ -332,20 +368,23 @@ def check_cartan_decomposition(g, k, space_name): # Cartan subalgebras # ~~~~~~~~~~~~~~~~~~ # -# The symmetric property of a Cartan decomposition (:math:`[\mathfrak{p}, \mathfrak{p}]\subset\mathfrak{k}`) -# tells us that :math:`\mathfrak{p}` is very -# far from being a subalgebra. This also gives us information about potential subalgebras -# *within* :math:`\ \mathfrak{p}`. Assume we have a subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. Then the commutator +# The symmetric property of a Cartan decomposition +# (:math:`[\mathfrak{p}, \mathfrak{p}]\subset\mathfrak{k}`) tells us that :math:`\mathfrak{p}` +# is "very far" from being a subalgebra (commutators never end up in :math:`\mathfrak{p}` again). +# This also gives us information about potential subalgebras *within* :math:`\ \mathfrak{p}`. +# Assume we have a subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. Then the commutator # between any two elements :math:`x, y\in\mathfrak{a}` must satisfy # # .. math:: # -# [x, y] \in \mathfrak{a} \subset \mathfrak{p} &\Rightarrow [x, y]\in\mathfrak{p} \text{(subalgebra property)} \\ -# [x, y] \in [\mathfrak{a}, \mathfrak{a}] \subset [\mathfrak{p}, \mathfrak{p}]\subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. +# [x, y] \in \mathfrak{a} \subset \mathfrak{p} +# &\Rightarrow [x, y]\in\mathfrak{p} \text{(subalgebra property)} \\ +# [x, y] \in [\mathfrak{a}, \mathfrak{a}] \subset [\mathfrak{p}, \mathfrak{p}] +# \subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. # -# That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and :math:`\mathfrak{p}`, -# which only have the zero vector in common. This tells us that *all* commutators in :math:`\mathfrak{a}` -# vanish, making it an *Abelian* subalgebra: +# That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and +# :math:`\mathfrak{p}`, which only have the zero vector in common. This tells us that *all* +# commutators in :math:`\mathfrak{a}` vanish, making it an *Abelian* subalgebra: # # .. math:: # @@ -362,16 +401,17 @@ def check_cartan_decomposition(g, k, space_name): # in a horizontal space. Throughout this demo, we always mean a *horizontal* # maximal Abelian subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. # -# How many different CSAs are there? Given a CSA :math:`\mathfrak{a}`, we can pick a vertical element -# :math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to -# all elements of the CSA, using the adjoint action we studied above. -# This will yield a valid CSA again. First, :math:`K\mathfrak{a} K^\dagger` remains in :math:`\mathfrak{p}` +# How many different CSAs are there? Given a CSA :math:`\mathfrak{a}`, we can pick a vertical +# element :math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to +# all elements of the CSA, using the adjoint action we studied above. This will yield a valid +# CSA again: First, :math:`K\mathfrak{a} K^\dagger` remains in :math:`\mathfrak{p}` # due to the reductive property, as we discussed when introducing the Cartan decomposition. -# Second the adjoint action will not change the Abelian property because +# Second, the adjoint action will not change the Abelian property because # # .. math:: # -# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 \quad \forall\ x_{1, 2}\in\mathfrak{a}. +# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 +# \quad \forall\ x_{1, 2}\in\mathfrak{a}. # # Finally, we are guaranteed that :math:`K\mathfrak{a} K^\dagger` remains maximal. # @@ -393,32 +433,33 @@ def check_cartan_decomposition(g, k, space_name): # # **Example** # -# For our example, we established the decomposition :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` -# with the two-dimensional horizontal space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}`. -# Starting with the subspace :math:`\mathfrak{a}=\mathbb{R} iY`, we see that we immediately -# reach a maximal Abelian subalgebra, i.e., a CSA, -# because :math:`[Y, X]\neq 0`. Applying a rotation :math:`\exp(i\eta Z)` to this CSA gives us a new CSA via +# For our example, we established the decomposition +# :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal +# space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}`. Starting with the subspace +# :math:`\mathfrak{a}=\mathbb{R} iY`, we see that we immediately reach a maximal Abelian +# subalgebra, i.e., a CSA, because :math:`[Y, X]\neq 0`. Applying a rotation :math:`\exp(i\eta Z)` +# to this CSA gives us a new CSA via # # .. math:: # -# \mathfrak{a}'=\exp(i\eta Z) (\mathbb{R} iY) \exp(-i\eta Z) = \mathbb{R} (\cos(2\eta) iY + \sin(2\eta) iX). +# \mathfrak{a}'=\exp(i\eta Z) (\mathbb{R} iY) \exp(-i\eta Z) +# = \mathbb{R} (\cos(2\eta) iY + \sin(2\eta) iX). # -# The vertical group element :math:`\exp(i\eta Z)` simply rotates the CSA within :math:`\mathfrak{p}!` -# Let us not forget to define the CSA in code. +# The vertical group element :math:`\exp(i\eta Z)` simply rotates the CSA within +# :math:`\mathfrak{p}!` Let us not forget to define the CSA in code. # CSA generator: iY a = p[1] # Rotate CSA by applying vertical group element eta = 0.6 - # The factor -2 compensates the convention -1/2 in the RZ gate a_prime = qml.RZ(-2 * eta, 0) @ a @ qml.RZ(2 * eta, 0) + +# Expectation from our theoretical calculation a_prime_expected = np.cos(2 * eta) * a + np.sin(2 * eta) * p[0] a_primes_equal = np.allclose(qml.matrix(a_prime_expected), qml.matrix(a_prime)) -print( - f"The numerically rotated CSA matches the expectation from theory: {a_primes_equal}" -) +print(f"The rotated CSAs match between numerics and theory: {a_primes_equal}") ###################################################################### # Cartan involutions @@ -444,14 +485,19 @@ def check_cartan_decomposition(g, k, space_name): # # .. math:: # -# \theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ -# \theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ -# \theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. +# \theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] +# &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ +# \theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] +# &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ +# \theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] +# &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. # -# Or, in other words, :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, +# Or, in other words, +# :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, +# :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, # and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+`. -# So an involution is enough to find us a Cartan decomposition, with :math:`\mathfrak{k}=\mathfrak{g}_+` -# and :math:`\mathfrak{p}=\mathfrak{g}_-`. +# So an involution is enough to find us a Cartan decomposition, with +# :math:`\mathfrak{k}=\mathfrak{g}_+` and :math:`\mathfrak{p}=\mathfrak{g}_-`. # # 🤯 # @@ -463,7 +509,7 @@ def check_cartan_decomposition(g, k, space_name): # Some people do so, some people again require more properties for such an # involution to be called Cartan involution. # For our purposes, let's go with the more general definition and call all -# involutions with the properties above Cartan involution. +# involutions with the properties above Cartan involutions. # # Conversely, if we have a Cartan decomposition based on a subalgebra :math:`\mathfrak{k}`, # we can define the map @@ -475,7 +521,18 @@ def check_cartan_decomposition(g, k, space_name): # where :math:`\Pi` are the projectors onto the two vector subspaces. # Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. # It is also compatible with the commutator due to the commutation relations -# between :math:`\mathfrak{k}` and :math:`\mathfrak{p}` (see box). +# between :math:`\mathfrak{k}` and :math:`\mathfrak{p}` (see box below). +# Finally, :math:`\theta_{\mathfrak{k}}` is an involution because +# +# .. math:: +# +# \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}})^2 +# = \Pi_{\mathfrak{k}}^2-\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}} +# -\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{p}}^2 +# =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}} +# = \mathbb{I}_{\mathfrak{g}}, +# +# where we used the properties of the projectors. # # .. admonition:: Mathematical detail # :class: note @@ -514,24 +571,14 @@ def check_cartan_decomposition(g, k, space_name): # &=[\Pi_{\mathfrak{k}}(x) -\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)-\Pi_{\mathfrak{p}}(y)]\\ # &=[\theta_{\mathfrak{k}} (x),\theta_{\mathfrak{k}} (y)]. # -# Finally, :math:`\theta_{\mathfrak{k}}` is an involution because -# -# .. math:: -# -# \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}})^2 -# = \Pi_{\mathfrak{k}}^2-\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}}-\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{p}}^2 -# =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}} -# = \mathbb{I}_{\mathfrak{g}}, -# -# where we used the projector's properties. -# # This shows us that we can easily switch between a Cartan involution and a Cartan # decomposition, in either direction! # # **Example** # # In our example, an involution that reproduces our choice :math:`\mathfrak{k}=\mathbb{R} iZ` is -# :math:`\theta_Z(x) = Z x Z` (Convince yourself that it is an involution that respects commutators). +# :math:`\theta_Z(x) = Z x Z` (Convince yourself that it is an involution that respects +# commutators). def theta_Z(x): @@ -539,21 +586,17 @@ def theta_Z(x): theta_of_u1 = [theta_Z(x) for x in u1] -u1_is_su2_plus = all( - qml.equal(x, theta_of_x) for x, theta_of_x in zip(u1, theta_of_u1) -) +u1_is_su2_plus = all(qml.equal(x, theta_of_x) for x, theta_of_x in zip(u1, theta_of_u1)) print(f"U(1) is the +1 eigenspace: {u1_is_su2_plus}") theta_of_p = [theta_Z(x) for x in p] -p_is_su2_minus = all( - qml.equal(-x, theta_of_x) for x, theta_of_x in zip(p, theta_of_p) -) +p_is_su2_minus = all(qml.equal(-x, theta_of_x) for x, theta_of_x in zip(p, theta_of_p)) print(f"p is the -1 eigenspace: {p_is_su2_minus}") ###################################################################### # -# We can easily get a new subalgebra by modifying the involution, say, to :math:`\theta_Y(x) = Y x Y`, -# expecting that :math:`k_Y=\mathbb{R} iY` becomes the new subalgebra. +# We can easily get a new subalgebra by modifying the involution, say, to +# :math:`\theta_Y(x) = Y x Y`, expecting that :math:`k_Y=\mathbb{R} iY` becomes the new subalgebra. def theta_Y(x): @@ -569,9 +612,7 @@ def theta_Y(x): else: raise ValueError("Operator not purely in either eigenspace.") -print( - f"Under the involution theta_Y, the operators\n{su2}\nhave the eigenvalues\n{eigvals}" -) +print(f"Under theta_Y, the operators\n{su2}\nhave the eigenvalues\n{eigvals}") ###################################################################### # This worked! a new involution gave us a new subalgebra and Cartan decomposition. @@ -584,24 +625,28 @@ def theta_Y(x): # characterizing---and even fully classifying---the possible Cartan decompositions # of semisimple Lie algebras. We will not go into detail here, but this classification # plays a big role when talking about decompositions without getting stuck on details -# like the choice of basis or the representation of the algebra. +# like the choice of basis or the representation of the algebra as matrices. # # The KAK theorem # --------------- # -# Now that we covered all prerequisites, we are ready for our main result. It consists of two steps -# that are good to know my themselves, so we will look at both of them in sequence. We will not conduct -# formal proofs but leave those to the literature references. -# In the following, let :math:`\mathfrak{g}` be a compact real semisimple Lie algebra and :math:`\mathfrak{k}` -# a subalgebra such that :math:`\mathfrak{g}=\mathfrak{k}\oplus \mathfrak{p}` is a Cartan decomposition. +# Now that we covered all prerequisites, we are ready for our main result. It consists of two +# steps that are good to know individually, so we will look at both of them in sequence. +# We will not conduct formal proofs but leave those to the literature references. +# In the following, let :math:`\mathfrak{g}` be a compact real semisimple Lie algebra and +# :math:`\mathfrak{k}` a subalgebra such that :math:`\mathfrak{g}=\mathfrak{k}\oplus \mathfrak{p}` +# is a Cartan decomposition. # -# The first step is a decomposition of the Lie group :math:`\mathcal{G}=\exp(\mathfrak{g})` into the Lie subgroup -# :math:`\mathcal{K}=\exp(\mathfrak{k})` and the exponential of the horizontal space, :math:`\mathcal{P}=\exp(\mathfrak{p})`, -# *which is not a group*. The decomposition is a simple product within :math:`\mathcal{G}`: +# The first step is a decomposition of the Lie group :math:`\mathcal{G}=\exp(\mathfrak{g})` +# into the Lie subgroup +# :math:`\mathcal{K}=\exp(\mathfrak{k})` and the exponential of the horizontal space, +# :math:`\mathcal{P}=\exp(\mathfrak{p})`, *which is not a group*. The decomposition is a simple +# product within :math:`\mathcal{G}`: # # .. math:: # -# \mathcal{G} = \mathcal{K}\mathcal{P}, \text{ or }\ \forall\ G\in\mathcal{G} \exists K\in\mathcal{K}, x\in\mathcal{m}: G = K \exp(x) +# \mathcal{G} = \mathcal{K}\mathcal{P}, \text{ or }\ \forall\ G\in\mathcal{G} +# \exists K\in\mathcal{K}, x\in\mathcal{m}: G = K \exp(x) # # This "KP" decomposition can be seen as the "group version" of # :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}`. @@ -613,9 +658,11 @@ def theta_Y(x): # CSAs there is a subalgebra element :math:`y\in\mathfrak{k}` such that the adjoint action of # :math:`\exp(y)` maps one CSA to the other. In particular, there is a :math:`y\in\mathfrak{k}` # so that +# # .. math:: # -# \exp(y)\mathfrak{a}_x\exp(-y)=\mathfrak{a}\quad\Rightarrow\quad x\in(\exp(-y) \mathfrak{a}\exp(y). +# \exp(y)\mathfrak{a}_x\exp(-y)=\mathfrak{a} +# \quad\Rightarrow\quad x\in(\exp(-y) \mathfrak{a}\exp(y). # # Generalizing this statement across all horizontal elements :math:`x\in\mathfrak{p}`, we find # @@ -623,10 +670,10 @@ def theta_Y(x): # # \mathfrak{p} \subset \{\exp(-y) \mathfrak{a} \exp(y) | y\in\mathfrak{k}\}. # -# As we discussed, the converse inclusion also must hold for a reductive space, so that we may even replace -# :math:`\subset` by an equality. -# Now we can use :math:`\exp(\text{Ad}_{\exp(-y)} x)=\text{Ad}_{\exp(-y)}\exp(x)` to move this statement -# to the group level, +# As we discussed, the converse inclusion also must hold for a reductive space, so that we +# may even replace :math:`\subset` by an equality. +# Now we can use :math:`\exp(\text{Ad}_{\exp(-y)} x)=\text{Ad}_{\exp(-y)}\exp(x)` to move +# this statement to the group level, # # .. math:: # @@ -655,8 +702,9 @@ def theta_Y(x): # Applying what we just learned to our example on :math:`\mathfrak{su}(2)`, we can state that # any single-qubit gate can be implemented by running a gate from # :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\}`, a CSA gate -# :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\}`, and another gate from :math:`\mathcal{K}`. -# We rediscovered a standard decomposition of an arbitrary :class:`~.pennylane.Rot` gate! +# :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\}`, and another gate from +# :math:`\mathcal{K}`. We rediscovered a standard decomposition of an arbitrary +# :class:`~.pennylane.Rot` gate! print(qml.Rot(0.5, 0.2, -1.6, wires=0).decomposition()) @@ -731,8 +779,8 @@ def theta_Y(x): # &\times \exp(i[\vartheta^x_0 X_0 + \vartheta^y_0 Y_0 + \vartheta^z_0 Z_0]) # \exp(i[\vartheta^x_1 X_1 + \vartheta^y_1 Y_1 + \vartheta^z_1 Z_1]). # -# Here we decomposed the exponentials of the vertical elements :math:`y_{1,2}` further by splitting them -# into exponentials acting on the first and second qubit, respectively. +# Here we decomposed the exponentials of the vertical elements :math:`y_{1,2}` further by +# splitting them into exponentials acting on the first and second qubit, respectively. # # The three parameters :math:`\eta^{x, y, z}` sometimes are called the Cartan coordinates # of :math:`U`, and they can be used, e.g., to assess the smallest-possible duration to @@ -740,8 +788,8 @@ def theta_Y(x): # # With this result, we can implement a template that can create any two-qubit gate. # We'll use :class:`~.pennylane.Rot` for the single-qubit exponentials (which changes -# the meaning of the angles, but maintains coverage) and are allowed to -# split the Cartan subalgebra term :math:`\exp(a)` into three exponentials, as the +# the meaning of the angles, but maintains the coverage) and are allowed to +# split the Cartan subalgebra term :math:`\exp(a)` into three exponentials, as its # terms commute. # From 366837e302dad7dd4def3dd9cb16b5e9b1f3ca54 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 23 Oct 2024 15:37:49 +0200 Subject: [PATCH 09/32] punctuation --- demonstrations/tutorial_kak_theorem.py | 177 +++++++++++++------------ 1 file changed, 89 insertions(+), 88 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 4de3496fdc..59093cde94 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -30,39 +30,40 @@ at your favourite linear algebra material. For the latter also see our :doc:`introduction to (dynamical) Lie algebras `. - -Along the way, we will box up some mathematical details that are not essential -to follow the demo, as well as a few gotchas regarding the nomenclature, -which unfortunately is not fully consistent in the literature. +Along the way, we will box up some non-essential mathematical details +as well as a few gotchas regarding the nomenclature. Without further ado, let's get started! Lie algebras and their groups ----------------------------- -We start by introducing Lie algebras and the Lie groups they give rise to, -as well as a particular interaction between the two, the *adjoint action*. +We start by introducing Lie algebras, their Lie groups, +and a particular interaction between the two, the *adjoint action*. -(Semi-)simple Lie algebras -~~~~~~~~~~~~~~~~~~~~~~~~~~ +Lie algebras +~~~~~~~~~~~~ As mentioned above, we will assume a basic understanding of the mathematical objects we will use. To warm up, however, let us briefly talk about Lie algebras (for details see our :doc:`intro to (dynamical) Lie algebras `). A *Lie algebra* :math:`\mathfrak{g}` is a vector space with an additional operation -between two vectors, called the *Lie bracket*, that yields a new vector. +that takes two vectors to a new vector, the *Lie bracket*. For our purposes, the vectors will always be matrices and the Lie bracket will be the matrix commutator. **Example** -Our working example in this demo will be the *special unitary* algebra :math:`\mathfrak{su}(2)`. +Our working example in this demo will be the *special unitary* algebra in two dimensions, +:math:`\mathfrak{su}(2).` It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, i.e., .. math:: \mathfrak{su}(2) - = \left\{x \in \mathbb{C}^{(2\times 2)} \large| x^\dagger = -x , \text{tr}[x]=0\right\}. + &= \left\{x \in \mathbb{C}^{(2\times 2)} {\large|} x^\dagger = -x , \text{tr}[x]=0\right\}\\ + &= \left\{\left(\begin{array} i a & b + ic \\ -b + ic & -i a \end{array}\right) + {\large |} a, b, c \in \mathbb{R}\right\}. We will look at a more involved example at the end of the demo. @@ -70,20 +71,20 @@ :class: note :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the - real numbers :math:`\mathbb{R}`. This means that scalar-vector multiplication is + real numbers :math:`\mathbb{R}.` This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. - There is a simple reason to see this; Multiplying a skew-Hermitian matrix + There is a simple way to see this; Multiplying a skew-Hermitian matrix :math:`x\in\mathfrak{su}(n)` by a complex number :math:`c\in\mathbb{C}` will yield - :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x`, so that + :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x,` so that the result might no longer be in the algebra! If we keep it to real scalars - :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c`, so that + :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c,` so that :math:`(cx)^\dagger=-cx` and we're fine. We will only consider real Lie algebras here. -Let us set up :math:`\mathfrak{su}(2)` in code. For this, we create a basis for traceless -Hermitian :math:`2\times 2` matrices, which is given by the Pauli operators. +Let us set up :math:`\mathfrak{su}(2)` in code. For this, we use Pauli operators as a basis +for traceless Hermitian :math:`2\times 2` matrices. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work with the Hermitian counterparts as inputs. We can check that :math:`\mathfrak{su}(2)` is closed under commutators, by @@ -96,7 +97,6 @@ import pennylane as qml from pennylane import X, Y, Z import numpy as np -import matplotlib.pyplot as plt su2 = [X(0), Y(0), Z(0)] print(f"su(2) is {len(su2)}-dimensional") @@ -112,7 +112,8 @@ ###################################################################### # We find that :math:`\mathfrak{su}(2)` indeed is closed, and that it is a 3-dimensional -# space. We also picked a correct representation with traceless operators. +# space, as expected from the explicit expression above. +# We also picked a correct representation with traceless operators. # # .. admonition:: Mathematical detail # :class: note @@ -121,13 +122,13 @@ # so-called *semisimple* Lie algebras. We will not go into detail about this notion, but # it often is sufficient to think of them as the algebras that are composed from # three types of *simple* building blocks, namely -# (1) special orthogonal algebras :math:`\mathfrak{so}(n)`, (2) unitary symplectic algebras -# :math:`\mathfrak{sp}(n)`, and (3) special unitary algebras :math:`\mathfrak{su}(n)`. +# (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic algebras +# :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{su}(n).` # In particular, our example here is of the latter type, so it is not only semisimple, # but even simple. # -# Lie group from Lie algebra -# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Lie group from a Lie algebra +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # The topic of Lie groups and Lie algebras is a large field of study and there are many # things we could talk about in this section. For the sake of brevity, however, we will @@ -139,7 +140,7 @@ # # .. math:: # -# \exp : \mathfrak{g} \to \exp(\mathfrak{g})=\mathcal{G}, \ x\mapsto \exp(x) +# \exp : \mathfrak{g} \to \exp(\mathfrak{g})=\mathcal{G}, \ x\mapsto \exp(x). # # We will only consider Lie groups :math:`\exp(\mathfrak{g})` arising from a Lie algebra # :math:`\mathfrak{g}` here. @@ -151,8 +152,8 @@ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # We will make use of a particular interaction between the algebra :math:`\mathfrak{g}` and -# its group :math:`\mathcal{G}`, called the *adjoint action* of :math:`\mathcal{G}` on -# :math:`\mathfrak{g}`. It is given by +# its group :math:`\mathcal{G},` called the *adjoint action* of :math:`\mathcal{G}` on +# :math:`\mathfrak{g}.` It is given by # # .. math:: # @@ -207,9 +208,9 @@ # If we want to understand this interaction abstractly, it is useful to view this # transformation as the modification of the tangent vector :math:`y` to a new tangent # vector that gives rise to the curve :math:`\exp(x) \exp(ty)\exp(-x)` instead of the -# original curve :math:`\exp(ty)`. We will not go into detail here. +# original curve :math:`\exp(ty).` We will not go into detail here. # -# Now that we have the adjoint action of :math:`\mathcal{G}` on :math:`\mathfrak{g}`, +# Now that we have the adjoint action of :math:`\mathcal{G}` on :math:`\mathfrak{g},` # we can differentiate it with respect to the subscript argument: # # .. math:: @@ -221,7 +222,7 @@ # It is a non-trivial observation that this differential equals the commutator! # With ad we arrived at a map that *represents* the action of an algebra element # :math:`x` on the vector space that is the algebra itself. That is, we found the -# *adjoint representation* of :math:`\mathfrak{g}`. +# *adjoint representation* of :math:`\mathfrak{g}.` # # Finally, note that the adjoint identity can be proven by with similar tools as above, # i.e., chaining derivatives and exponentiation suitably. #TODO ref @@ -240,7 +241,7 @@ # A *subalgebra* :math:`\mathfrak{k}` of a Lie algebra :math:`\mathfrak{g}` is a # vector subspace that is closed under the Lie bracket. Overall, this means that # :math:`\mathfrak{k}` is closed under addition, scalar multiplication, and the Lie bracket. -# The latter often is simply written as :math:`[\mathfrak{k}, \mathfrak{k}]\subset \mathfrak{k}`. +# The latter often is simply written as :math:`[\mathfrak{k}, \mathfrak{k}]\subset \mathfrak{k}.` # # The algebras we are interested in come with an *inner product* between its elements. # For our purposes, it is sufficient to assume that it is @@ -265,7 +266,7 @@ def is_orthogonal(op, basis): ###################################################################### -# Given a subalgebra :math:`\mathfrak{k}\subset \mathfrak{g}`, the inner product allows +# Given a subalgebra :math:`\mathfrak{k}\subset \mathfrak{g},` the inner product allows # us to define an orthogonal complement # # .. math:: @@ -284,9 +285,9 @@ def is_orthogonal(op, basis): # # The first property tells us that :math:`\mathfrak{p}` is left intact by the adjoint action of # :math:`\mathfrak{k}` and that :math:`\mathfrak{p}` behaves like the "opposite" of a -# subalgebra, i.e., all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}`. +# subalgebra, i.e., all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}.` # Due to the adjoint identity from above, the first property also holds for group elements -# acting on algebra elements; For all :math:`x\in\mathfrak{p}` and :math:`y\in\mathfrak{k}`, +# acting on algebra elements; For all :math:`x\in\mathfrak{p}` and :math:`y\in\mathfrak{k},` # we have # # .. math:: @@ -369,10 +370,10 @@ def check_cartan_decomposition(g, k, space_name): # ~~~~~~~~~~~~~~~~~~ # # The symmetric property of a Cartan decomposition -# (:math:`[\mathfrak{p}, \mathfrak{p}]\subset\mathfrak{k}`) tells us that :math:`\mathfrak{p}` +# :math:`([\mathfrak{p}, \mathfrak{p}]\subset\mathfrak{k})` tells us that :math:`\mathfrak{p}` # is "very far" from being a subalgebra (commutators never end up in :math:`\mathfrak{p}` again). -# This also gives us information about potential subalgebras *within* :math:`\ \mathfrak{p}`. -# Assume we have a subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. Then the commutator +# This also gives us information about potential subalgebras *within* :math:`\ \mathfrak{p}.` +# Assume we have a subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}.` Then the commutator # between any two elements :math:`x, y\in\mathfrak{a}` must satisfy # # .. math:: @@ -383,7 +384,7 @@ def check_cartan_decomposition(g, k, space_name): # \subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. # # That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and -# :math:`\mathfrak{p}`, which only have the zero vector in common. This tells us that *all* +# :math:`\mathfrak{p},` which only have the zero vector in common. This tells us that *all* # commutators in :math:`\mathfrak{a}` vanish, making it an *Abelian* subalgebra: # # .. math:: @@ -391,7 +392,7 @@ def check_cartan_decomposition(g, k, space_name): # [\mathfrak{a}, \mathfrak{a}] = \{0\}. # # Such an Abelian subalgebra is a (horizontal) *Cartan subalgebra (CSA)* if it is *maximal*, -# i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{p}`. +# i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{p}.` # # .. admonition:: Nomenclature # :class: warning @@ -399,9 +400,9 @@ def check_cartan_decomposition(g, k, space_name): # Depending on context and field, there are inequivalent notions of Cartan subalgebras. # In particular, there is a common notion of Cartan subalgebras which are not contained # in a horizontal space. Throughout this demo, we always mean a *horizontal* -# maximal Abelian subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}`. +# maximal Abelian subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}.` # -# How many different CSAs are there? Given a CSA :math:`\mathfrak{a}`, we can pick a vertical +# How many different CSAs are there? Given a CSA :math:`\mathfrak{a},` we can pick a vertical # element :math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to # all elements of the CSA, using the adjoint action we studied above. This will yield a valid # CSA again: First, :math:`K\mathfrak{a} K^\dagger` remains in :math:`\mathfrak{p}` @@ -422,9 +423,9 @@ def check_cartan_decomposition(g, k, space_name): # that we assume :math:`\mathfrak{g}` to be a semisimple Lie algebra, for which the # adjoint representation is faithful. This in turn implies that linearly # independent elements of :math:`\mathfrak{g}` will not be mapped to linearly dependent -# elements by the adjoint action of :math:`K`. +# elements by the adjoint action of :math:`K.` # -# For most :math:`y\in\mathfrak{k}`, applying :math:`K=\exp(y)` in this way will yield a +# For most :math:`y\in\mathfrak{k},` applying :math:`K=\exp(y)` in this way will yield a # *different* CSA, so that we find a whole continuum of them. # It turns out that they *all* can be found by starting with *any* # :math:`\mathfrak{a}` and applying all of :math:`\exp(\mathfrak{k})` to it. @@ -435,9 +436,9 @@ def check_cartan_decomposition(g, k, space_name): # # For our example, we established the decomposition # :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal -# space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}`. Starting with the subspace -# :math:`\mathfrak{a}=\mathbb{R} iY`, we see that we immediately reach a maximal Abelian -# subalgebra, i.e., a CSA, because :math:`[Y, X]\neq 0`. Applying a rotation :math:`\exp(i\eta Z)` +# space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}.` Starting with the subspace +# :math:`\mathfrak{a}=\mathbb{R} iY,` we see that we immediately reach a maximal Abelian +# subalgebra, i.e., a CSA, because :math:`[Y, X]\neq 0.` Applying a rotation :math:`\exp(i\eta Z)` # to this CSA gives us a new CSA via # # .. math:: @@ -471,17 +472,17 @@ def check_cartan_decomposition(g, k, space_name): # # We will look at a map :math:`\theta` from the total Lie algebra :math:`\mathfrak{g}` # to itself. We demand that :math:`\theta` has the following properties, for -# :math:`x, y\in\mathfrak{g}` and :math:`c\in\mathbb{R}`. +# :math:`x, y\in\mathfrak{g}` and :math:`c\in\mathbb{R}.` # -# #. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y)` -# #. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)]`, and -# #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x`. +# #. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y),` +# #. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)],` and +# #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x.` # -# In short, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}`. +# In short, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}.` # -# As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1`, with associated -# eigenspaces :math:`\mathfrak{g}_\pm`. Let's see what happens when we compute commutators between -# elements :math:`x_\pm\in\mathfrak{g}_\pm`: +# As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1,` with associated +# eigenspaces :math:`\mathfrak{g}_\pm.` Let's see what happens when we compute commutators between +# elements :math:`x_\pm\in\mathfrak{g}_\pm:` # # .. math:: # @@ -493,11 +494,11 @@ def check_cartan_decomposition(g, k, space_name): # &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. # # Or, in other words, -# :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+`, -# :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-`, -# and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+`. +# :math:`[\mathfrak{g}_+, \mathfrak{g}_+] \subset \mathfrak{g}_+,` +# :math:`[\mathfrak{g}_+, \mathfrak{g}_-] \subset \mathfrak{g}_-,` +# and :math:`[\mathfrak{g}_-, \mathfrak{g}_-] \subset \mathfrak{g}_+.` # So an involution is enough to find us a Cartan decomposition, with -# :math:`\mathfrak{k}=\mathfrak{g}_+` and :math:`\mathfrak{p}=\mathfrak{g}_-`. +# :math:`\mathfrak{k}=\mathfrak{g}_+` and :math:`\mathfrak{p}=\mathfrak{g}_-.` # # 🤯 # @@ -511,15 +512,15 @@ def check_cartan_decomposition(g, k, space_name): # For our purposes, let's go with the more general definition and call all # involutions with the properties above Cartan involutions. # -# Conversely, if we have a Cartan decomposition based on a subalgebra :math:`\mathfrak{k}`, +# Conversely, if we have a Cartan decomposition based on a subalgebra :math:`\mathfrak{k},` # we can define the map # # .. math:: # # \theta_{\mathfrak{k}}(x) = \Pi_{\mathfrak{k}}(x)-\Pi_{\mathfrak{p}}(x), # -# where :math:`\Pi` are the projectors onto the two vector subspaces. -# Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. +# where :math:`\Pi_{\mathfrak{k},\mathfrak{p}}` are the projectors onto the two vector +# subspaces. Clearly, :math:`\theta_{\mathfrak{k}}` is linear because projectors are. # It is also compatible with the commutator due to the commutation relations # between :math:`\mathfrak{k}` and :math:`\mathfrak{p}` (see box below). # Finally, :math:`\theta_{\mathfrak{k}}` is an involution because @@ -555,10 +556,10 @@ def check_cartan_decomposition(g, k, space_name): # \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)]}}) # \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]}}) # \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]}})\\ -# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)] +# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]. # # Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{p}}` and the -# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{p}`. +# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{p}.` # # We can put thes pieces together to get # @@ -596,7 +597,7 @@ def theta_Z(x): ###################################################################### # # We can easily get a new subalgebra by modifying the involution, say, to -# :math:`\theta_Y(x) = Y x Y`, expecting that :math:`k_Y=\mathbb{R} iY` becomes the new subalgebra. +# :math:`\theta_Y(x) = Y x Y,` expecting that :math:`k_Y=\mathbb{R} iY` becomes the new subalgebra. def theta_Y(x): @@ -640,21 +641,21 @@ def theta_Y(x): # The first step is a decomposition of the Lie group :math:`\mathcal{G}=\exp(\mathfrak{g})` # into the Lie subgroup # :math:`\mathcal{K}=\exp(\mathfrak{k})` and the exponential of the horizontal space, -# :math:`\mathcal{P}=\exp(\mathfrak{p})`, *which is not a group*. The decomposition is a simple -# product within :math:`\mathcal{G}`: +# :math:`\mathcal{P}=\exp(\mathfrak{p}),` *which is not a group*. The decomposition is a simple +# product within :math:`\mathcal{G}:` # # .. math:: # # \mathcal{G} = \mathcal{K}\mathcal{P}, \text{ or }\ \forall\ G\in\mathcal{G} -# \exists K\in\mathcal{K}, x\in\mathcal{m}: G = K \exp(x) +# \exists K\in\mathcal{K}, x\in\mathcal{m}: G = K \exp(x). # # This "KP" decomposition can be seen as the "group version" of -# :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}`. +# :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}.` # -# The second step is the further decomposition of the space :math:`\mathcal{P}=\exp(\mathfrak{p})`. -# We start by fixing a Cartan subalgebra (CSA) :math:`\mathfrak{a}\subset\mathfrak{p}`. -# Given a horizontal vector :math:`x\in\mathfrak{p}`, we can construct a second CSA -# :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x`. Now, recall that for any two +# The second step is the further decomposition of the space :math:`\mathcal{P}=\exp(\mathfrak{p}).` +# We start by fixing a Cartan subalgebra (CSA) :math:`\mathfrak{a}\subset\mathfrak{p}.` +# Given a horizontal vector :math:`x\in\mathfrak{p},` we can construct a second CSA +# :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x.` Now, recall that for any two # CSAs there is a subalgebra element :math:`y\in\mathfrak{k}` such that the adjoint action of # :math:`\exp(y)` maps one CSA to the other. In particular, there is a :math:`y\in\mathfrak{k}` # so that @@ -664,7 +665,7 @@ def theta_Y(x): # \exp(y)\mathfrak{a}_x\exp(-y)=\mathfrak{a} # \quad\Rightarrow\quad x\in(\exp(-y) \mathfrak{a}\exp(y). # -# Generalizing this statement across all horizontal elements :math:`x\in\mathfrak{p}`, we find +# Generalizing this statement across all horizontal elements :math:`x\in\mathfrak{p},` we find # # .. math:: # @@ -681,7 +682,7 @@ def theta_Y(x): # = \{\exp(\exp(-y) \mathfrak{a} \exp(y)) | y\in\mathfrak{k}\} # = \{K^{-1} \mathcal{A} K | K\in\mathcal{K}\}, # -# where we abbreviated :math:`\mathcal{A} = \exp(\mathfrak{a})`. +# where we abbreviated :math:`\mathcal{A} = \exp(\mathfrak{a}).` # # Chaining the two steps together and combining the left factor :math:`K^{-1}` with the group # :math:`\mathcal{K}` in the "KP" decomposition, we obtain the *KAK theorem* @@ -694,16 +695,16 @@ def theta_Y(x): # # It teaches us that any group element can be decomposed into two factors from the Lie subgroup and # the exponential of a CSA element, i.e., of commuting elements from the horizontal subspace -# :math:`\mathfrak{p}`. This may already hint at the usefulness of the KAK theorem for matrix +# :math:`\mathfrak{p}.` This may already hint at the usefulness of the KAK theorem for matrix # factorizations in general, and for quantum circuit decompositions in particular. # # **Example** # -# Applying what we just learned to our example on :math:`\mathfrak{su}(2)`, we can state that +# Applying what we just learned to our example on :math:`\mathfrak{su}(2),` we can state that # any single-qubit gate can be implemented by running a gate from -# :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\}`, a CSA gate -# :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\}`, and another gate from -# :math:`\mathcal{K}`. We rediscovered a standard decomposition of an arbitrary +# :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\},` a CSA gate +# :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\},` and another gate from +# :math:`\mathcal{K}.` We rediscovered a standard decomposition of an arbitrary # :class:`~.pennylane.Rot` gate! print(qml.Rot(0.5, 0.2, -1.6, wires=0).decomposition()) @@ -711,7 +712,7 @@ def theta_Y(x): ###################################################################### # Other choices for involutions or---equivalently---subalgebras :math:`\mathfrak{k}` will # lead to other decompositions of ``Rot``. For example, using :math:`\theta_Y` from above -# together with the CSA :math:`\mathfrak{a_Y}=\mathbb{R} iX`, we find the decomposition +# together with the CSA :math:`\mathfrak{a_Y}=\mathbb{R} iX,` we find the decomposition # # .. math:: # @@ -727,7 +728,7 @@ def theta_Y(x): # here we will use a decomposition of its algebra :math:`\mathfrak{su}(4)` to decompose # such gates. # Specifically, we use the subalgebra that generates single-qubit operations independently -# on either qubit, :math:`\mathfrak{su}(2)\oplus\mathfrak{su}(2)`. Let's set it up with our +# on either qubit, :math:`\mathfrak{su}(2)\oplus\mathfrak{su}(2).` Let's set it up with our # tool from earlier: # Define su(4). Skip first entry of Pauli group, which is the identity @@ -752,12 +753,12 @@ def theta_Y(x): # \theta(x) = -Y_0Y_1 x^T Y_0Y_1. # # Intuitively, the conjugation by :math:`Y_0Y_1` adds a minus -# sign for each :math:`X` and :math:`Z` factor in :math:`x`, and the transposition -# adds a minus sign for each :math:`Y`. Taken together, each Pauli operator contributes +# sign for each :math:`X` and :math:`Z` factor in :math:`x,` and the transposition +# adds a minus sign for each :math:`Y.` Taken together, each Pauli operator contributes # a minus sign. Finally, as we want the single-qubit operators to receive no sign in total, # we add a minus sign overall. # -# Now we can pick a Cartan subalgebra within :math:`\mathfrak{p}`, the vector space +# Now we can pick a Cartan subalgebra within :math:`\mathfrak{p},` the vector space # of all two-qubit Paulis. A common choice for this decomposition is # # .. math:: @@ -765,10 +766,10 @@ def theta_Y(x): # \mathfrak{a} = \text{span}_{\mathbb{R}}\{iX_0X_1, iY_0Y_1, iZ_0Z_1\} # # Clearly, these three operators commute, making :math:`\mathfrak{a}` Abelian. -# They also form a *maximal* Abelian algebra within :math:`\mathfrak{p}`, which is less obvious. +# They also form a *maximal* Abelian algebra within :math:`\mathfrak{p},` which is less obvious. # # The KAK theorem now tells us that any two-qubit gate :math:`U,` being part of -# :math:`SU(4)`, can be implemented by a sequence +# :math:`SU(4),` can be implemented by a sequence # # .. math:: # @@ -783,7 +784,7 @@ def theta_Y(x): # splitting them into exponentials acting on the first and second qubit, respectively. # # The three parameters :math:`\eta^{x, y, z}` sometimes are called the Cartan coordinates -# of :math:`U`, and they can be used, e.g., to assess the smallest-possible duration to +# of :math:`U,` and they can be used, e.g., to assess the smallest-possible duration to # implement the gate in hardware. # # With this result, we can implement a template that can create any two-qubit gate. @@ -813,7 +814,7 @@ def su4_gate(params): # # You may have noticed that the theorem only states the existence of a # decomposition, but does not provide a constructive way of finding -# :math:`y_{1,2}` and :math:`a` for a given gate :math:`U`. If you are +# :math:`y_{1,2}` and :math:`a` for a given gate :math:`U.` If you are # curious about this question, watch out for follow-up demos! # # Conclusion @@ -822,7 +823,7 @@ def su4_gate(params): # In this demo we learned about the KAK theorem and how it uses a Cartan # decomposition of a Lie algebra to decompose its Lie group. # This allows us to break down arbitrary quantum gates from that group, -# as we implemented in code for the group of two-qubit gates :math:`SU(4)`. +# as we implemented in code for the group of two-qubit gates :math:`SU(4).` # # If you are interested in other applications of Lie theory in the field of # quantum computing, you are in luck! It has been a handy tool throughout the last From 9812f3708379b3d587f7065d153bd08e7da752e9 Mon Sep 17 00:00:00 2001 From: David Wierichs Date: Mon, 28 Oct 2024 11:55:54 +0100 Subject: [PATCH 10/32] Apply suggestions from code review Co-authored-by: Korbinian Kottmann <43949391+Qottmann@users.noreply.github.com> --- demonstrations/tutorial_kak_theorem.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 59093cde94..57512ac1e2 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -77,7 +77,7 @@ There is a simple way to see this; Multiplying a skew-Hermitian matrix :math:`x\in\mathfrak{su}(n)` by a complex number :math:`c\in\mathbb{C}` will yield :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x,` so that - the result might no longer be in the algebra! If we keep it to real scalars + the result might no longer be skew-Hermitian, i.e. no longer in the algebra! If we keep it to real scalars :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c,` so that :math:`(cx)^\dagger=-cx` and we're fine. @@ -104,7 +104,7 @@ all_hermitian = all(qml.equal(qml.adjoint(op).simplify(), op) for op in su2) print(f"The operators are all Hermitian: {all_hermitian}") -su2_lie_closed = qml.pauli.dla.lie_closure(su2) +su2_lie_closed = qml.lie_closure(su2) print(f"The Lie closure of su(2) is {len(su2_lie_closed)}-dimensional.") traces = [op.pauli_rep.trace() for op in su2] @@ -482,7 +482,7 @@ def check_cartan_decomposition(g, k, space_name): # # As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1,` with associated # eigenspaces :math:`\mathfrak{g}_\pm.` Let's see what happens when we compute commutators between -# elements :math:`x_\pm\in\mathfrak{g}_\pm:` +# elements :math:`x_\pm\in\mathfrak{g}_\pm \Leftrightarrow \theta(x_\pm) = \pm x_pm:` # # .. math:: # @@ -765,7 +765,7 @@ def theta_Y(x): # # \mathfrak{a} = \text{span}_{\mathbb{R}}\{iX_0X_1, iY_0Y_1, iZ_0Z_1\} # -# Clearly, these three operators commute, making :math:`\mathfrak{a}` Abelian. +# These three operators commute, making :math:`\mathfrak{a}` Abelian. # They also form a *maximal* Abelian algebra within :math:`\mathfrak{p},` which is less obvious. # # The KAK theorem now tells us that any two-qubit gate :math:`U,` being part of From 951b6b136cac105448d16a61e908158a24c24594 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Tue, 29 Oct 2024 15:40:00 +0100 Subject: [PATCH 11/32] code review --- demonstrations/tutorial_kak_theorem.py | 87 +++++++++++++------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 59093cde94..d13fb4ee68 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -56,16 +56,17 @@ Our working example in this demo will be the *special unitary* algebra in two dimensions, :math:`\mathfrak{su}(2).` -It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, i.e., +It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, which we +can conveniently describe using the Pauli matrices: .. math:: \mathfrak{su}(2) - &= \left\{x \in \mathbb{C}^{(2\times 2)} {\large|} x^\dagger = -x , \text{tr}[x]=0\right\}\\ &= \left\{\left(\begin{array} i a & b + ic \\ -b + ic & -i a \end{array}\right) - {\large |} a, b, c \in \mathbb{R}\right\}. + {\large |} a, b, c \in \mathbb{R}\right\}\\ + &= \left\{i(a Z + b Y + c X)| a, b, c \in \mathbb{R}\right\}. -We will look at a more involved example at the end of the demo. +We will also look at a more involved example at the end of the demo. .. admonition:: Mathematical detail :class: note @@ -83,10 +84,9 @@ We will only consider real Lie algebras here. -Let us set up :math:`\mathfrak{su}(2)` in code. For this, we use Pauli operators as a basis -for traceless Hermitian :math:`2\times 2` matrices. +Let us set up :math:`\mathfrak{su}(2)` in code. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work -with the Hermitian counterparts as inputs. +with the Hermitian counterparts as inputs, i.e., we will skip the factor :math:`i.` We can check that :math:`\mathfrak{su}(2)` is closed under commutators, by computing all nested commutators, the so-called *Lie closure*, and observing that the closure is not larger than :math:`\mathfrak{su}(2)` itself. @@ -175,7 +175,8 @@ # # \text{Ad}_{\exp(x)}(y) = \exp(\text{ad}_x) (y), # -# where we applied the exponential map to :math:`\text{ad}_x` via its series representation. +# where we applied the exponential map to :math:`\text{ad}_x`, which maps from :math:`\mathfrak{g}` +# to itself, via its series representation. # We will refer to this relationship as *adjoint identity*. # We talk about Ad and ad in more detail in the box below, and refer to our tutorial on # :doc:`g-sim: Lie algebraic classical simulations ` for @@ -192,23 +193,19 @@ # \Psi: \mathcal{G} \times \mathcal{G} \to \mathcal{G}, # \ (\exp(x),\exp(y))\mapsto \Psi_{\exp(x)}(\exp(y)) = \exp(x) \exp(y)\exp(-x). # -# The map :math:`\Psi_{\exp(x)}` is a smooth map from the Lie group :math:`\mathcal{G}` -# to itself, so that we may differentiate it. This leads to the differential -# :math:`\text{Ad}_{\exp(x)}=d\Psi_{\exp(x)}` which maps the tangent spaces of -# :math:`\mathcal{G}` to itself. In particular, at the identity :math:`e=\exp(0)` where +# The map :math:`\Psi_{\exp(x)}` (with fixed subscript) is a smooth map from the Lie group +# :math:`\mathcal{G}` to itself, so that we may differentiate it. This leads to the +# differential :math:`\text{Ad}_{\exp(x)}=d\Psi_{\exp(x)}` which maps the tangent spaces of +# :math:`\mathcal{G}` to itself. At the identity, where # the algebra :math:`\mathfrak{g}` forms the tangent space, we find # # .. math:: # -# \text{Ad}_{\exp(x)} : \mathfrak{g} \to \mathfrak{g}, -# \ y\mapsto \exp(x) y \exp(-x). +# \text{Ad} : \mathcal{G} \times\mathfrak{g} \to \mathfrak{g}, +# \ (\exp(x), y)\mapsto \exp(x) y \exp(-x). # # This is the adjoint action of :math:`\mathcal{G}` on :math:`\mathfrak{g}` as we # introduced above. -# If we want to understand this interaction abstractly, it is useful to view this -# transformation as the modification of the tangent vector :math:`y` to a new tangent -# vector that gives rise to the curve :math:`\exp(x) \exp(ty)\exp(-x)` instead of the -# original curve :math:`\exp(ty).` We will not go into detail here. # # Now that we have the adjoint action of :math:`\mathcal{G}` on :math:`\mathfrak{g},` # we can differentiate it with respect to the subscript argument: @@ -224,7 +221,7 @@ # :math:`x` on the vector space that is the algebra itself. That is, we found the # *adjoint representation* of :math:`\mathfrak{g}.` # -# Finally, note that the adjoint identity can be proven by with similar tools as above, +# Finally, note that the adjoint identity can be proven with similar tools as above, # i.e., chaining derivatives and exponentiation suitably. #TODO ref # # Symmetric spaces @@ -320,7 +317,7 @@ def is_orthogonal(op, basis): # # .. math:: # -# \mathfrak{k} = \mathbb{R} iZ. +# \mathfrak{k} = \text{span}_{\mathbb{R}} \{iZ\}. # # Let us define it in code, and check whether it gives rise to a Cartan decomposition. # As we want to look at another example later, we wrap everything in a function. @@ -437,14 +434,14 @@ def check_cartan_decomposition(g, k, space_name): # For our example, we established the decomposition # :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal # space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}.` Starting with the subspace -# :math:`\mathfrak{a}=\mathbb{R} iY,` we see that we immediately reach a maximal Abelian +# :math:`\mathfrak{a}=\text{span}_{\mathbb{R}} \{iY\},` we see that we immediately reach a maximal Abelian # subalgebra, i.e., a CSA, because :math:`[Y, X]\neq 0.` Applying a rotation :math:`\exp(i\eta Z)` # to this CSA gives us a new CSA via # # .. math:: # -# \mathfrak{a}'=\exp(i\eta Z) (\mathbb{R} iY) \exp(-i\eta Z) -# = \mathbb{R} (\cos(2\eta) iY + \sin(2\eta) iX). +# \mathfrak{a}'=\{\exp(i\eta Z) (c iY) \exp(-i\eta Z) | c\in\mathbb{R}\} +# =\{c\cos(2\eta) iY + c\sin(2\eta) iX | c\in\mathbb{R}\} . # # The vertical group element :math:`\exp(i\eta Z)` simply rotates the CSA within # :math:`\mathfrak{p}!` Let us not forget to define the CSA in code. @@ -533,7 +530,10 @@ def check_cartan_decomposition(g, k, space_name): # =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}} # = \mathbb{I}_{\mathfrak{g}}, # -# where we used the properties of the projectors. +# where we used the projectors' property :math:`\Pi_{\mathfrak{k}}^2=\Pi_{\mathfrak{k}}` and +# :math:`\Pi_{\mathfrak{p}}^2=\Pi_{\mathfrak{p}}`, as well as the fact that +# :math:`\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}}=\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}=0` because +# the spaces :math:`\mathfrak{k}` and :math:`\mathfrak{p}` are orthogonal to each other. # # .. admonition:: Mathematical detail # :class: note @@ -577,9 +577,9 @@ def check_cartan_decomposition(g, k, space_name): # # **Example** # -# In our example, an involution that reproduces our choice :math:`\mathfrak{k}=\mathbb{R} iZ` is -# :math:`\theta_Z(x) = Z x Z` (Convince yourself that it is an involution that respects -# commutators). +# In our example, an involution that reproduces our choice +# :math:`\mathfrak{k}=\text{span}_{\mathbb{R}} \{iZ\}` is :math:`\theta_Z(x) = Z x Z` +# (Convince yourself that it is an involution that respects commutators). def theta_Z(x): @@ -595,9 +595,9 @@ def theta_Z(x): print(f"p is the -1 eigenspace: {p_is_su2_minus}") ###################################################################### -# # We can easily get a new subalgebra by modifying the involution, say, to -# :math:`\theta_Y(x) = Y x Y,` expecting that :math:`k_Y=\mathbb{R} iY` becomes the new subalgebra. +# :math:`\theta_Y(x) = Y x Y,` expecting that :math:`k_Y=\text{span}_{\mathbb{R}} \{iZ\}` +# becomes the new subalgebra. def theta_Y(x): @@ -646,19 +646,20 @@ def theta_Y(x): # # .. math:: # -# \mathcal{G} = \mathcal{K}\mathcal{P}, \text{ or }\ \forall\ G\in\mathcal{G} -# \exists K\in\mathcal{K}, x\in\mathcal{m}: G = K \exp(x). +# \mathcal{G} &= \mathcal{K}\mathcal{P}, \text{ or }\\ +# \forall\ G\in\mathcal{G}\exists K\in\mathcal{K}, x\in\mathcal{m}: G &= K \exp(x). # # This "KP" decomposition can be seen as the "group version" of # :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}.` # # The second step is the further decomposition of the space :math:`\mathcal{P}=\exp(\mathfrak{p}).` -# We start by fixing a Cartan subalgebra (CSA) :math:`\mathfrak{a}\subset\mathfrak{p}.` -# Given a horizontal vector :math:`x\in\mathfrak{p},` we can construct a second CSA -# :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x.` Now, recall that for any two -# CSAs there is a subalgebra element :math:`y\in\mathfrak{k}` such that the adjoint action of -# :math:`\exp(y)` maps one CSA to the other. In particular, there is a :math:`y\in\mathfrak{k}` -# so that +# For this we first need to fix a Cartan subalgebra (CSA) :math:`\mathfrak{a}\subset\mathfrak{p}.` +# The CSA might be given through some application or contextual information, but there is no +# canonical choice. +# Given a horizontal vector :math:`x\in\mathfrak{p},` we can always construct a second CSA +# :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x.` As any two CSAs can be mapped +# to each other by some subalgebra element :math:`y\in\mathfrak{k}` using the adjoint action Ad, +# we know that a :math:`y` exists such that # # .. math:: # @@ -673,13 +674,14 @@ def theta_Y(x): # # As we discussed, the converse inclusion also must hold for a reductive space, so that we # may even replace :math:`\subset` by an equality. -# Now we can use :math:`\exp(\text{Ad}_{\exp(-y)} x)=\text{Ad}_{\exp(-y)}\exp(x)` to move +# Now we can use :math:`\exp(\text{Ad}_{K} x)=\text{Ad}_{K}\exp(x)` to move # this statement to the group level, # # .. math:: # # \mathcal{P} # = \{\exp(\exp(-y) \mathfrak{a} \exp(y)) | y\in\mathfrak{k}\} +# = \{\exp(K^{-1} \mathfrak{a} K) | K\in\mathcal{K}\} # = \{K^{-1} \mathcal{A} K | K\in\mathcal{K}\}, # # where we abbreviated :math:`\mathcal{A} = \exp(\mathfrak{a}).` @@ -712,7 +714,7 @@ def theta_Y(x): ###################################################################### # Other choices for involutions or---equivalently---subalgebras :math:`\mathfrak{k}` will # lead to other decompositions of ``Rot``. For example, using :math:`\theta_Y` from above -# together with the CSA :math:`\mathfrak{a_Y}=\mathbb{R} iX,` we find the decomposition +# together with the CSA :math:`\mathfrak{a_Y}=\text{span}_{\mathbb{R}} \{iX\},` we find the decomposition # # .. math:: # @@ -814,8 +816,8 @@ def su4_gate(params): # # You may have noticed that the theorem only states the existence of a # decomposition, but does not provide a constructive way of finding -# :math:`y_{1,2}` and :math:`a` for a given gate :math:`U.` If you are -# curious about this question, watch out for follow-up demos! +# :math:`y_{1,2}` and :math:`a` for a given gate :math:`U.` For this, +# some additional work is required, as explained in [#kokcu]_, for example. # # Conclusion # ---------- @@ -831,8 +833,7 @@ def su4_gate(params): # in quantum optimal control, and for trainability analyses. For Lie algebraic # classical simulation of quantum circuits, check the # :doc:`g-sim ` and -# :doc:`(g+P)-sim ` demos, and stay posted for -# a brand new demo on compiling Hamiltonian simulation circuits with the KAK theorem! +# :doc:`(g+P)-sim ` demos. # # References # ---------- From c218fe1624c855f731c37849d998d0833ca51a89 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 4 Nov 2024 10:00:59 +0100 Subject: [PATCH 12/32] code review cont --- demonstrations/tutorial_kak_theorem.py | 45 ++++++++++++++++++++------ 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 7c862b288b..bf20e66674 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -295,11 +295,11 @@ def is_orthogonal(op, basis): # = \sum_{n=0}^\infty \frac{1}{n!} \underset{\in\mathfrak{p}}{\underbrace{(\text{ad}_y)^n (x)}} # \in \mathfrak{p}. # -# If the reductive property holds, the quotient space :math:`G/K` of the groups -# of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` is called a *reductive homogeneous space*. -# If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is called a *Cartan pair* and -# we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a *Cartan decomposition*. -# :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* +# If the reductive property holds, the quotient space :math:`G/K` of the groups of +# :math:`\mathfrak{g}` and :math:`\mathfrak{k}` (see detail box below) is called a +# *reductive homogeneous space*. If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is +# called a *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a +# *Cartan decomposition*. :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* # and the quotient :math:`G/K` is a *symmetric space*. # Symmetric spaces are relevant for a wide range of applications in physics # and have been studied a lot throughout the last hundred years. @@ -307,8 +307,23 @@ def is_orthogonal(op, basis): # .. admonition:: Nomenclature # :class: warning # -# Depending on context and field, there are sometimes additional requirements -# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{p}` to be called a Cartan decomposition. +# Depending on context and field, there sometimes are additional requirements +# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{p}` to be called a Cartan decomposition +# and for :math:`(\mathfrak{k}, \mathfrak{p})` to be a Cartan pair. +# +# .. admonition:: Mathematical detail +# :class: note +# +# The *quotient space* of a Lie group :math:`G` and a subgroup :math:`K` is the space of +# cosets of :math:`K,` i.e., :math:`G/K = \{gK | g\in G\}.` In this space, two elements +# are equal if they just differ by multiplying an element from :math:`K` from the left +# to one of them. The quotient space is a manifold like the two groups :math:`G` and +# :math:`K,` but in general it will *not* be a group itself. For example, a product +# of two elements is :math:`(g'K)(gK)=g'g(g^{-1} K g) K,` which only is of the form +# :math:`g'' K` if :math:`g^{-1} K g\subset K.` Subgroups for which this condition holds +# for any :math:`g\in G` are called *normal subgroups*. +# We are interested in cases where the symmetric property holds, which excludes normal +# subgroups, and :math:`G/K` will not be a group. # # **Example** # @@ -622,11 +637,21 @@ def theta_Y(x): # :class: note # # You might already see that the two different decompositions created by :math:`\theta_Z` -# and :math:`\theta_Y` are very similar. There is a whole field of study -# characterizing---and even fully classifying---the possible Cartan decompositions -# of semisimple Lie algebras. We will not go into detail here, but this classification +# and :math:`\theta_Y` are very similar. There is a whole field of study that +# characterizes---and even fully classifies---the possible Cartan decompositions +# of semisimple Lie algebras. This classification # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra as matrices. +# For example, there are only three types of Cartan decompositions of the special +# unitary group :math:`SU(n)`, called AI, AII, and AIII. The subalgebras :math:`\mathfrak{k}` +# for these decompositions are the special orthogonal algebra :math:`\mathfrak{so}(n)` (AI), +# the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), and a sum of (special) unitary +# algebras :math:`\mathfrak{su}(p)\oplus\mathfrak{su}(q)\oplus\mathfrak{u}(1)` +# (AIII, :math:`p+q=n`). +# Their involutions are usually represented by complex conjugation (AI), by the adjoint +# action with a Pauli operator (AIII, for qubits, :math:`p=q=2^{N-1}`), or by both in +# sequence (AII). It is instructive to try and see why those three are *not* equivalent +# under a unitary basis change! # # The KAK theorem # --------------- From 02b9bc793748cbf2c2e4fa7dbdae4f9b9cbaf08c Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 4 Nov 2024 10:08:03 +0100 Subject: [PATCH 13/32] more review --- demonstrations/tutorial_kak_theorem.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index bf20e66674..662648d376 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -724,6 +724,12 @@ def theta_Y(x): # the exponential of a CSA element, i.e., of commuting elements from the horizontal subspace # :math:`\mathfrak{p}.` This may already hint at the usefulness of the KAK theorem for matrix # factorizations in general, and for quantum circuit decompositions in particular. +# Given a group operation :math:`g=\exp(x)` with :math:`x\in\mathfrak{g}`, there are two +# subalgebra elements :math:`y_{1,2}\in\mathfrak{k}` (or subgroup elements +# :math:`k_{1,2}=\exp(y_{1,2})\in K`) and a Cartan subgalgebra element :math:`a\in\mathfrak{a}` so +# that :math:`g=k_1 \exp(a) k_2`. If :math:`g` happens to be from the subspace +# :math:`\mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements will be related, +# namely :math:`g=k_1\exp(a)k_1^\dagger`. # # **Example** # From 94d23a10c8ca5e07778b99ce17c4dd1e66f831eb Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 4 Nov 2024 11:15:07 +0100 Subject: [PATCH 14/32] references --- .../tutorial_kak_theorem.metadata.json | 137 +++++++++++++++++ demonstrations/tutorial_kak_theorem.py | 138 +++++++++++++----- demonstrations/tutorial_liesim.metadata.json | 80 +++++----- 3 files changed, 282 insertions(+), 73 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index ae224f0a23..2a77d09bc3 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -26,6 +26,138 @@ "doi": "", "canonicalURL": "/qml/demos/tutorial_kak_theorem", "references": [ + { + "id": "hall", + "type": "book", + "title": "Lie Groups, Lie Algebras, and Representations. An Elementary Introduction", + "authors": "Brian C. Hall", + "year": "2015", + "publisher": "Springer", + "journal": "Graduate Texts in Mathematics", + "doi": "10.1007/978-3-319-13467-3", + "url": "https://link.springer.com/book/10.1007/978-3-319-13467-3" + }, + { + "id": "tu", + "type": "book", + "title": "An Introduction to Manifolds", + "authors": "Loring W. Tu", + "year": "2011", + "publisher": "Springer", + "journal": "Universitext", + "doi": "10.1007/978-1-4419-7400-6", + "url": "https://link.springer.com/book/10.1007/978-1-4419-7400-6" + }, + { + "id": "arvanitogeorgos", + "type": "book", + "title": "An Introduction to Lie Groups and the Geometry of Homogeneous Spaces", + "authors": "Andreas Arvanitogeorgos", + "year": "2003", + "publisher": "American Mathematical Society", + "journal": "Student Mathematical Library", + "doi": "", + "url": "https://bookstore.ams.org/stml-22" + }, + { + "id": "helgason", + "type": "book", + "title": "Differential geometry, Lie groups, and symmetric spaces", + "authors": "Sigurdur Helgason", + "year": "2001", + "publisher": "American Mathematical Society", + "journal": "Graduate Studies in Mathematics", + "doi": "10.1090/gsm/034", + "url": "https://bookstore.ams.org/gsm-34" + }, + { + "id": "goh", + "type": "preprint", + "title": "lie-algebraic classical simulations for variational quantum computing", + "authors": "matthew l. goh, martin larocca, lukasz cincio, m. cerezo, frédéric sauvage", + "year": "2023", + "publisher": "", + "journal": "", + "doi": "10.48550/arxiv.2308.01432", + "url": "https://arxiv.org/abs/2308.01432" + }, + { + "id": "somma", + "type": "preprint", + "title": "quantum computation, complexity, and many-body physics", + "authors": "rolando d. somma", + "year": "2005", + "publisher": "", + "journal": "", + "doi": "10.48550/arxiv.quant-ph/0512209", + "url": "https://arxiv.org/abs/quant-ph/0512209" + }, + { + "id": "kokcu_fdhs", + "type": "article", + "title": "Fixed Depth Hamiltonian Simulation via Cartan Decomposition", + "authors": "Efekan Kökcü, Thomas Steckmann, Yan Wang, J. K. Freericks, Eugene F. Dumitrescu, Alexander F. Kemper", + "year": "2022", + "publisher": "American Physical Society", + "journal": "", + "doi": "10.1103/PhysRevLett.129.070501", + "url": "https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.129.070501" + }, + { + "id": "kokcu_comp", + "type": "article", + "title": "Algebraic Compression of Quantum Circuits for Hamiltonian Evolution", + "authors": "Efekan Kökcü, Daan Camps, Lindsay Bassman, James K. Freericks, Wibe A. de Jong, Roel Van Beeumen, Alexander F. Kemper", + "year": "2022", + "publisher": "American Physical Society", + "journal": "", + "doi": "10.1103/PhysRevA.105.032420", + "url": "https://journals.aps.org/pra/abstract/10.1103/PhysRevA.105.032420" + }, + { + id: "gu", + type: "article", + title: "Fast-forwarding quantum evolution", + authors: "Shouzhen Gu, Rolando D. Somma, Burak Şahinoğlu", + year: "2021", + publisher: "", + journal: "Quantum", + doi: "10.22331/q-2021-11-15-577", + url: "https://quantum-journal.org/papers/q-2021-11-15-577/#" + }, + { + "id": "dirr", + "type": "article", + "title": "Lie Theory for Quantum Control", + "authors": "G. Dirr, U. Helmke", + "year": "2008", + "publisher": "Gesellschaft für Angewandte Mathematik und Mechanik", + "journal": "Surveys for Applied Mathematics and Mechanics", + "doi": "10.1002/gamm.200890003", + "url": "https://onlinelibrary.wiley.com/doi/abs/10.1002/gamm.200890003" + }, + { + "id": "fontana", + "type": "article", + "title": "the adjoint is all you need: characterizing barren plateaus in quantum ansätze", + "authors": "enrico fontana, dylan herman, shouvanik chakrabarti, niraj kumar, romina yalovetzky, jamie heredge, shree hari sureshbabu, marco pistoia", + "year": "2023", + "publisher": "", + "journal": "", + "doi": "10.48550/arxiv.2309.07902", + "url": "https://arxiv.org/abs/2309.07902" + }, + { + "id": "ragone", + "type": "preprint", + "title": "a unified theory of barren plateaus for deep parametrized quantum circuits", + "authors": "michael ragone, bojko n. bakalov, frédéric sauvage, alexander f. kemper, carlos ortiz marrero, martin larocca, m. cerezo", + "year": "2023", + "publisher": "", + "journal": "", + "doi": "10.48550/arxiv.2309.09342", + "url": "https://arxiv.org/abs/2309.09342" + } ], "basedOnPapers": [], "referencedByPapers": [], @@ -34,6 +166,11 @@ "type": "demonstration", "id": "tutorial_liealgebra", "weight": 1.0 + }, + { + "type": "demonstration", + "id": "tutorial_liesim", + "weight": 1.0 } ] } diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 662648d376..f3a9b9eb19 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -133,7 +133,7 @@ # The topic of Lie groups and Lie algebras is a large field of study and there are many # things we could talk about in this section. For the sake of brevity, however, we will # only list a few important properties that are needed further below. For more details -# and proofs, refer to your favourite Lie theory book, which might be #TODO +# and proofs, refer to your favourite Lie theory book, which could be [#hall]_ or [#tu]_. # # The Lie group :math:`\mathcal{G}` associated to a Lie algebra :math:`\mathfrak{g}` is given # by the exponential map applied to the algebra: @@ -222,14 +222,15 @@ # *adjoint representation* of :math:`\mathfrak{g}.` # # Finally, note that the adjoint identity can be proven with similar tools as above, -# i.e., chaining derivatives and exponentiation suitably. #TODO ref +# i.e., chaining derivatives and exponentiation suitably. # # Symmetric spaces # ---------------- # # Symmetric spaces are a popular field of study both in physics and mathematics. # We will not go into depth regarding their interpretation or classification, but refer the -# interested reader to #TODO refs. +# interested reader to the broad existing literature, including [#arvanitogeorgos]_ and +# [#helgason]_. # In the following, we mostly care about the algebraic structure of symmetric spaces. # # Subalgebras and Cartan decompositions @@ -295,12 +296,12 @@ def is_orthogonal(op, basis): # = \sum_{n=0}^\infty \frac{1}{n!} \underset{\in\mathfrak{p}}{\underbrace{(\text{ad}_y)^n (x)}} # \in \mathfrak{p}. # -# If the reductive property holds, the quotient space :math:`G/K` of the groups of +# If the reductive property holds, the quotient space :math:`\mathcal{G}/\mathcal{K}` of the groups of # :math:`\mathfrak{g}` and :math:`\mathfrak{k}` (see detail box below) is called a # *reductive homogeneous space*. If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is # called a *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a # *Cartan decomposition*. :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* -# and the quotient :math:`G/K` is a *symmetric space*. +# and the quotient :math:`\mathcal{G}/\mathcal{K}` is a *symmetric space*. # Symmetric spaces are relevant for a wide range of applications in physics # and have been studied a lot throughout the last hundred years. # @@ -314,16 +315,18 @@ def is_orthogonal(op, basis): # .. admonition:: Mathematical detail # :class: note # -# The *quotient space* of a Lie group :math:`G` and a subgroup :math:`K` is the space of -# cosets of :math:`K,` i.e., :math:`G/K = \{gK | g\in G\}.` In this space, two elements -# are equal if they just differ by multiplying an element from :math:`K` from the left -# to one of them. The quotient space is a manifold like the two groups :math:`G` and -# :math:`K,` but in general it will *not* be a group itself. For example, a product -# of two elements is :math:`(g'K)(gK)=g'g(g^{-1} K g) K,` which only is of the form -# :math:`g'' K` if :math:`g^{-1} K g\subset K.` Subgroups for which this condition holds -# for any :math:`g\in G` are called *normal subgroups*. +# The *quotient space* of a Lie group :math:`\mathcal{G}` and a subgroup :math:`\mathcal{K}` +# is the space of cosets of :math:`\mathcal{K},` i.e., +# :math:`\mathcal{G}/\mathcal{K} = \{g\mathcal{K} | g\in G\}.` In this space, two elements are +# equal if they just differ by multiplying an element from :math:`\mathcal{K}` from the left +# to one of them. The quotient space is a manifold like the two groups :math:`\mathcal{G}` and +# :math:`\mathcal{K},` but in general it will *not* be a group itself. For example, a product +# of two elements is +# :math:`(g'\mathcal{K})(g\mathcal{K})=g'g(g^{-1} \mathcal{K} g) \mathcal{K},` which only is +# a coset again if :math:`g^{-1} \mathcal{K} g\subset \mathcal{K}.` Subgroups for which this +# condition holds for any :math:`g\in \mathcal{G}` are called *normal subgroups*. # We are interested in cases where the symmetric property holds, which excludes normal -# subgroups, and :math:`G/K` will not be a group. +# subgroups, and :math:`\mathcal{G`/\mathcal{K}` will not be a group. # # **Example** # @@ -666,13 +669,13 @@ def theta_Y(x): # The first step is a decomposition of the Lie group :math:`\mathcal{G}=\exp(\mathfrak{g})` # into the Lie subgroup # :math:`\mathcal{K}=\exp(\mathfrak{k})` and the exponential of the horizontal space, -# :math:`\mathcal{P}=\exp(\mathfrak{p}),` *which is not a group*. The decomposition is a simple -# product within :math:`\mathcal{G}:` +# :math:`\mathcal{P}=\exp(\mathfrak{p}),` *which is not a group* (see box on quotient spaces). +# The decomposition is a simple product within :math:`\mathcal{G}:` # # .. math:: # # \mathcal{G} &= \mathcal{K}\mathcal{P}, \text{ or }\\ -# \forall\ G\in\mathcal{G}\exists K\in\mathcal{K}, x\in\mathcal{m}: G &= K \exp(x). +# \forall\ G\in\mathcal{G}\ \ \exists K\in\mathcal{K}, x\in\mathfrak{p}: \ G &= K \exp(x). # # This "KP" decomposition can be seen as the "group version" of # :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}.` @@ -717,19 +720,19 @@ def theta_Y(x): # .. math:: # # \mathcal{G} -# &= \{\exp(y_1) \exp(a) \exp(y_2) | a\in\mathfrak{a}, \ y_{1, 2}\in\mathfrak{k}\}\\ -# &= \mathcal{K} \mathcal{A} \mathcal{K} \qquad\textbf{(KAK Theorem).} +# = \{\exp(y_1) \exp(a) \exp(y_2) | a\in\mathfrak{a}, \ y_{1, 2}\in\mathfrak{k}\} +# = \mathcal{K} \mathcal{A} \mathcal{K} \qquad\textbf{(KAK Theorem).} # # It teaches us that any group element can be decomposed into two factors from the Lie subgroup and # the exponential of a CSA element, i.e., of commuting elements from the horizontal subspace # :math:`\mathfrak{p}.` This may already hint at the usefulness of the KAK theorem for matrix # factorizations in general, and for quantum circuit decompositions in particular. -# Given a group operation :math:`g=\exp(x)` with :math:`x\in\mathfrak{g}`, there are two +# Given a group operation :math:`G=\exp(x)` with :math:`x\in\mathfrak{g}`, there are two # subalgebra elements :math:`y_{1,2}\in\mathfrak{k}` (or subgroup elements -# :math:`k_{1,2}=\exp(y_{1,2})\in K`) and a Cartan subgalgebra element :math:`a\in\mathfrak{a}` so -# that :math:`g=k_1 \exp(a) k_2`. If :math:`g` happens to be from the subspace -# :math:`\mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements will be related, -# namely :math:`g=k_1\exp(a)k_1^\dagger`. +# :math:`K_{1,2}=\exp(y_{1,2})\in \mathcal{K}`) and a Cartan subgalgebra element +# :math:`a\in\mathfrak{a}` so that :math:`G=K_1 \exp(a) K_2`. If :math:`g` happens to be from +# the subspace :math:`\mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements +# will be related, namely :math:`G=K\exp(a)K^\dagger`. # # **Example** # @@ -848,7 +851,7 @@ def su4_gate(params): # You may have noticed that the theorem only states the existence of a # decomposition, but does not provide a constructive way of finding # :math:`y_{1,2}` and :math:`a` for a given gate :math:`U.` For this, -# some additional work is required, as explained in [#kokcu]_, for example. +# some additional work is required, as explained in [#kokcu_fdhs]_, for example. # # Conclusion # ---------- @@ -860,20 +863,89 @@ def su4_gate(params): # # If you are interested in other applications of Lie theory in the field of # quantum computing, you are in luck! It has been a handy tool throughout the last -# decades, e.g., for the simulation and compression of quantum circuits, # TODO: REFS -# in quantum optimal control, and for trainability analyses. For Lie algebraic -# classical simulation of quantum circuits, check the -# :doc:`g-sim ` and +# decades, e.g., for the simulation of quantum circuits [#somma]_ [#goh]_ and their +# compression [#kokcu_comp]_ [#gu]_, in quantum optimal control [#dirr]_, and for trainability +# analyses [#fontana]_ [#ragone]_. For Lie algebraic classical simulation of quantum circuits, +# also take a look at the :doc:`g-sim ` and # :doc:`(g+P)-sim ` demos. # # References # ---------- # -# .. [#khaneja_glaser] +# .. [#hall] # -# Navin Khaneja, Steffen Glaser -# "Cartan decomposition of SU(2^n), constructive controllability of spin systems and universal quantum computing" -# `arXiv:quant-ph/0010100 `__, 2000 +# Brian C. Hall +# "Lie Groups, Lie Algebras, and Representations. An Elementary Introduction" +# `Graduate Texts in Mathematics, Springer `__, 2015. +# +# .. [#tu] +# +# Loring W. Tu +# "An Introduction to Manifolds" +# `Universitext, Springer `__, 2011. +# +# .. [#arvanitogeorgos] +# +# Andreas Arvanitogeorgos +# "An Introduction to Lie Groups and the Geometry of Homogeneous Spaces" +# `Student Mathematical Library **22** `__, 2003 +# +# .. [#helgason] +# +# Sigurdur Helgason +# "Differential geometry, Lie groups, and symmetric spaces" +# `Graduate Studies in Mathematics **34** `__, 2001 +# +# .. [#goh] +# +# Matthew L. Goh, Martin Larocca, Lukasz Cincio, M. Cerezo, Frédéric Sauvage +# "Lie-algebraic classical simulations for variational quantum computing" +# `arXiv:2308.01432 `__, 2023. +# +# .. [#somma] +# +# Rolando D. Somma +# "Quantum Computation, Complexity, and Many-Body Physics" +# `arXiv:quant-ph/0512209 `__, 2005. +# +# .. [#kokcu_fdhs] +# +# Efekan Kökcü, Thomas Steckmann, Yan Wang, J. K. Freericks, Eugene F. Dumitrescu, Alexander F. Kemper +# "Fixed Depth Hamiltonian Simulation via Cartan Decomposition" +# `arXiv:2104.00728 `__, 2021. +# `PRL (closed access) `__, 2022. +# +# .. [#kokcu_comp] +# +# Efekan Kökcü, Daan Camps, Lindsay Bassman, James K. Freericks, Wibe A. de Jong, Roel Van Beeumen, Alexander F. Kemper +# "Algebraic Compression of Quantum Circuits for Hamiltonian Evolution" +# `arXiv:2108.03282 `__, 2021. +# `PRA (closed access) `__, 2022. +# +# .. [#gu] +# +# Shouzhen Gu, Rolando D. Somma, Burak Şahinoğlu +# "Fast-forwarding quantum evolution" +# `Quantum **5** `__, 2021. +# +# .. [#dirr] +# +# G. Dirr, U. Helmke +# "Lie Theory for Quantum Control" +# `GAMM-Mitteilungen **31** `__, 2008. +# +# .. [#fontana] +# +# Enrico Fontana, Dylan Herman, Shouvanik Chakrabarti, Niraj Kumar, Romina Yalovetzky, Jamie Heredge, Shree Hari Sureshbabu, Marco Pistoia +# "The Adjoint Is All You Need: Characterizing Barren Plateaus in Quantum Ansätze" +# `Nat. Commun. **15** `__, 2024. +# +# .. [#ragone] +# +# Michael Ragone, Bojko N. Bakalov, Frédéric Sauvage, Alexander F. Kemper, Carlos Ortiz Marrero, Martin Larocca, M. Cerezo +# "A Unified Theory of Barren Plateaus for Deep Parametrized Quantum Circuits" +# `Nat. Commun. **15** `__, 2024. # # About the author # ---------------- + diff --git a/demonstrations/tutorial_liesim.metadata.json b/demonstrations/tutorial_liesim.metadata.json index f3d75d959d..4ed6428f72 100644 --- a/demonstrations/tutorial_liesim.metadata.json +++ b/demonstrations/tutorial_liesim.metadata.json @@ -37,108 +37,108 @@ "url": "https://arxiv.org/abs/2309.05690" }, { - "id": "Fontana", + "id": "fontana", "type": "article", - "title": "The Adjoint Is All You Need: Characterizing Barren Plateaus in Quantum Ansätze", - "authors": "Enrico Fontana, Dylan Herman, Shouvanik Chakrabarti, Niraj Kumar, Romina Yalovetzky, Jamie Heredge, Shree Hari Sureshbabu, Marco Pistoia", + "title": "the adjoint is all you need: characterizing barren plateaus in quantum ansätze", + "authors": "enrico fontana, dylan herman, shouvanik chakrabarti, niraj kumar, romina yalovetzky, jamie heredge, shree hari sureshbabu, marco pistoia", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.2309.07902", + "doi": "10.48550/arxiv.2309.07902", "url": "https://arxiv.org/abs/2309.07902" }, { - "id": "Ragone", + "id": "ragone", "type": "preprint", - "title": "A Unified Theory of Barren Plateaus for Deep Parametrized Quantum Circuits", - "authors": "Michael Ragone, Bojko N. Bakalov, Frédéric Sauvage, Alexander F. Kemper, Carlos Ortiz Marrero, Martin Larocca, M. Cerezo", + "title": "a unified theory of barren plateaus for deep parametrized quantum circuits", + "authors": "michael ragone, bojko n. bakalov, frédéric sauvage, alexander f. kemper, carlos ortiz marrero, martin larocca, m. cerezo", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.2309.09342", + "doi": "10.48550/arxiv.2309.09342", "url": "https://arxiv.org/abs/2309.09342" }, { - "id": "Goh", + "id": "goh", "type": "preprint", - "title": "Lie-algebraic classical simulations for variational quantum computing", - "authors": "Matthew L. Goh, Martin Larocca, Lukasz Cincio, M. Cerezo, Frédéric Sauvage", + "title": "lie-algebraic classical simulations for variational quantum computing", + "authors": "matthew l. goh, martin larocca, lukasz cincio, m. cerezo, frédéric sauvage", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.2308.01432", + "doi": "10.48550/arxiv.2308.01432", "url": "https://arxiv.org/abs/2308.01432" }, { - "id": "Somma", + "id": "somma", "type": "preprint", - "title": "Quantum Computation, Complexity, and Many-Body Physics", - "authors": "Rolando D. Somma", + "title": "quantum computation, complexity, and many-body physics", + "authors": "rolando d. somma", "year": "2005", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.quant-ph/0512209", + "doi": "10.48550/arxiv.quant-ph/0512209", "url": "https://arxiv.org/abs/quant-ph/0512209" }, { - "id": "Somma2", + "id": "somma2", "type": "preprint", - "title": "Efficient solvability of Hamiltonians and limits on the power of some quantum computational models", - "authors": "Rolando Somma, Howard Barnum, Gerardo Ortiz, Emanuel Knill", + "title": "efficient solvability of hamiltonians and limits on the power of some quantum computational models", + "authors": "rolando somma, howard barnum, gerardo ortiz, emanuel knill", "year": "2006", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.quant-ph/0601030", + "doi": "10.48550/arxiv.quant-ph/0601030", "url": "https://arxiv.org/abs/quant-ph/0601030" }, { - "id": "Galitski", + "id": "galitski", "type": "preprint", - "title": "Quantum-to-Classical Correspondence and Hubbard-Stratonovich Dynamical Systems, a Lie-Algebraic Approach", - "authors": "Victor Galitski", + "title": "quantum-to-classical correspondence and hubbard-stratonovich dynamical systems, a lie-algebraic approach", + "authors": "victor galitski", "year": "2010", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.1012.2873", + "doi": "10.48550/arxiv.1012.2873", "url": "https://arxiv.org/abs/1012.2873" }, { - "id": "Cerezo", + "id": "cerezo", "type": "preprint", - "title": "Does provable absence of barren plateaus imply classical simulability? Or, why we need to rethink variational quantum computing", - "authors": "M. Cerezo, Martin Larocca, Diego García-Martín, N. L. Diaz, Paolo Braccia, Enrico Fontana, Manuel S. Rudolph, Pablo Bermejo, Aroosa Ijaz, Supanut Thanasilp, Eric R. Anschuetz, Zoë Holmes", + "title": "does provable absence of barren plateaus imply classical simulability? or, why we need to rethink variational quantum computing", + "authors": "m. cerezo, martin larocca, diego garcía-martín, n. l. diaz, paolo braccia, enrico fontana, manuel s. rudolph, pablo bermejo, aroosa ijaz, supanut thanasilp, eric r. anschuetz, zoë holmes", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.2312.09121", + "doi": "10.48550/arxiv.2312.09121", "url": "https://arxiv.org/abs/2312.09121" }, { - "id": "Mazzola", + "id": "mazzola", "type": "preprint", - "title": "Quantum computing for chemistry and physics applications from a Monte Carlo perspective", - "authors": "Guglielmo Mazzola", + "title": "quantum computing for chemistry and physics applications from a monte carlo perspective", + "authors": "guglielmo mazzola", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.2308.07964", + "doi": "10.48550/arxiv.2308.07964", "url": "https://arxiv.org/abs/2308.07964" }, { - "id": "Park", + "id": "park", "type": "preprint", - "title": "Hardware-efficient ansatz without barren plateaus in any depth", - "authors": "Chae-Yeun Park, Minhyeok Kang, Joonsuk Huh", + "title": "hardware-efficient ansatz without barren plateaus in any depth", + "authors": "chae-yeun park, minhyeok kang, joonsuk huh", "year": "2024", "publisher": "", "journal": "", - "doi": "10.48550/arXiv.2403.04844", + "doi": "10.48550/arxiv.2403.04844", "url": "https://arxiv.org/abs/2403.04844" } ], - "basedOnPapers": ["10.48550/arXiv.2308.01432"], - "referencedByPapers": [], - "relatedContent": [ + "basedonpapers": ["10.48550/arxiv.2308.01432"], + "referencedbypapers": [], + "relatedcontent": [ { "type": "demonstration", "id": "tutorial_liealgebra", @@ -151,7 +151,7 @@ }, { "type": "demonstration", - "id": "tutorial_How_to_optimize_QML_model_using_JAX_and_Optax", + "id": "tutorial_how_to_optimize_qml_model_using_jax_and_optax", "weight": 1.0 }, { From ef2b9ac16798af4f2bae64212116753d9829f41f Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 4 Nov 2024 11:20:10 +0100 Subject: [PATCH 15/32] whitespace --- demonstrations/tutorial_kak_theorem.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index f3a9b9eb19..7c0c0c3732 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -316,13 +316,13 @@ def is_orthogonal(op, basis): # :class: note # # The *quotient space* of a Lie group :math:`\mathcal{G}` and a subgroup :math:`\mathcal{K}` -# is the space of cosets of :math:`\mathcal{K},` i.e., +# is the space of cosets of :math:`\mathcal{K},` i.e., # :math:`\mathcal{G}/\mathcal{K} = \{g\mathcal{K} | g\in G\}.` In this space, two elements are # equal if they just differ by multiplying an element from :math:`\mathcal{K}` from the left # to one of them. The quotient space is a manifold like the two groups :math:`\mathcal{G}` and # :math:`\mathcal{K},` but in general it will *not* be a group itself. For example, a product -# of two elements is -# :math:`(g'\mathcal{K})(g\mathcal{K})=g'g(g^{-1} \mathcal{K} g) \mathcal{K},` which only is +# of two elements is +# :math:`(g'\mathcal{K})(g\mathcal{K})=g'g(g^{-1} \mathcal{K} g) \mathcal{K},` which only is # a coset again if :math:`g^{-1} \mathcal{K} g\subset \mathcal{K}.` Subgroups for which this # condition holds for any :math:`g\in \mathcal{G}` are called *normal subgroups*. # We are interested in cases where the symmetric property holds, which excludes normal @@ -731,7 +731,7 @@ def theta_Y(x): # subalgebra elements :math:`y_{1,2}\in\mathfrak{k}` (or subgroup elements # :math:`K_{1,2}=\exp(y_{1,2})\in \mathcal{K}`) and a Cartan subgalgebra element # :math:`a\in\mathfrak{a}` so that :math:`G=K_1 \exp(a) K_2`. If :math:`g` happens to be from -# the subspace :math:`\mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements +# the subspace :math:`\mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements # will be related, namely :math:`G=K\exp(a)K^\dagger`. # # **Example** @@ -948,4 +948,3 @@ def su4_gate(params): # # About the author # ---------------- - From 699a35f5258a159205600b0a7c86a02fd233183c Mon Sep 17 00:00:00 2001 From: dwierichs Date: Tue, 5 Nov 2024 21:45:41 +0100 Subject: [PATCH 16/32] polish --- demonstrations/tutorial_kak_theorem.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 7c0c0c3732..1ff501f7e8 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -325,8 +325,9 @@ def is_orthogonal(op, basis): # :math:`(g'\mathcal{K})(g\mathcal{K})=g'g(g^{-1} \mathcal{K} g) \mathcal{K},` which only is # a coset again if :math:`g^{-1} \mathcal{K} g\subset \mathcal{K}.` Subgroups for which this # condition holds for any :math:`g\in \mathcal{G}` are called *normal subgroups*. -# We are interested in cases where the symmetric property holds, which excludes normal -# subgroups, and :math:`\mathcal{G`/\mathcal{K}` will not be a group. +# We are interested in cases where the symmetric property +# :math:`[\mathfrak{p}, \mathfrak{p}] \subset \mathfrak{k}` holds, which excludes (non-Abelian) +# normal subgroups, and thus :math:`\mathcal{G`/\mathcal{K}` will not be a group. # # **Example** # @@ -730,9 +731,19 @@ def theta_Y(x): # Given a group operation :math:`G=\exp(x)` with :math:`x\in\mathfrak{g}`, there are two # subalgebra elements :math:`y_{1,2}\in\mathfrak{k}` (or subgroup elements # :math:`K_{1,2}=\exp(y_{1,2})\in \mathcal{K}`) and a Cartan subgalgebra element -# :math:`a\in\mathfrak{a}` so that :math:`G=K_1 \exp(a) K_2`. If :math:`g` happens to be from -# the subspace :math:`\mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements -# will be related, namely :math:`G=K\exp(a)K^\dagger`. +# :math:`a\in\mathfrak{a}` so that +# +# .. math:: +# +# G\in\mathcal{G} \quad\Rightarrow\quad G=K_1 \exp(a) K_2. +# +# If :math:`x` happens to be from the horizontal subspace :math:`\mathfrak{p}`, so that +# :math:`G\in \mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements :math:`K_1` +# and :math:`K_2` will in fact be related, namely +# +# .. math:: +# +# G\in\mathcal{P} \quad\Rightarrow\quad G=K\exp(a)K^\dagger. # # **Example** # From f5ca7ef6ce082cf5297cfbd3b59b3d86743dff41 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 6 Nov 2024 11:00:29 +0100 Subject: [PATCH 17/32] polish --- demonstrations/tutorial_kak_theorem.py | 191 +++++++++++++------------ 1 file changed, 103 insertions(+), 88 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 1ff501f7e8..23ed5131df 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -3,7 +3,7 @@ The KAK theorem is a beautiful mathematical result from Lie theory, with particular relevance for quantum computing. It can be seen as a -generalization of the singular value decomposition, and therefore falls +generalization of the singular value decomposition, and falls under the large umbrella of matrix factorizations. This allows us to use it for quantum circuit decompositions. @@ -22,6 +22,9 @@ :width: 60% :target: javascript:void(0) +Along the way, we will put some non-essential mathematical details +as well as a few gotchas regarding the nomenclature into boxes such as this one: + .. admonition:: Prerequisites :class: note @@ -30,14 +33,12 @@ at your favourite linear algebra material. For the latter also see our :doc:`introduction to (dynamical) Lie algebras `. -Along the way, we will box up some non-essential mathematical details -as well as a few gotchas regarding the nomenclature. Without further ado, let's get started! Lie algebras and their groups ----------------------------- -We start by introducing Lie algebras, their Lie groups, +We start with Lie algebras, their Lie groups, and a particular interaction between the two, the *adjoint action*. Lie algebras @@ -68,7 +69,7 @@ We will also look at a more involved example at the end of the demo. -.. admonition:: Mathematical detail +.. admonition:: Math detail: our Lie algebras are real :class: note :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the @@ -115,15 +116,14 @@ # space, as expected from the explicit expression above. # We also picked a correct representation with traceless operators. # -# .. admonition:: Mathematical detail +# .. admonition:: Math detail: (semi-)simple Lie algebras # :class: note # # Our main result for this demo will be the KAK theorem, which applies to -# so-called *semisimple* Lie algebras. We will not go into detail about this notion, but -# it often is sufficient to think of them as the algebras that are composed from -# three types of *simple* building blocks, namely -# (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic algebras -# :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{su}(n).` +# so-called *semisimple* Lie algebras, which are in turn composed of *simple* Lie algebras +# as building blocks. Without going into detail, it often is sufficient to think of these +# blocks as (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic +# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{su}(n).` # In particular, our example here is of the latter type, so it is not only semisimple, # but even simple. # @@ -178,7 +178,7 @@ # where we applied the exponential map to :math:`\text{ad}_x`, which maps from :math:`\mathfrak{g}` # to itself, via its series representation. # We will refer to this relationship as *adjoint identity*. -# We talk about Ad and ad in more detail in the box below, and refer to our tutorial on +# We talk about Ad and ad in more detail in the box below, and refer to our demo # :doc:`g-sim: Lie algebraic classical simulations ` for # further discussion. # @@ -269,7 +269,7 @@ def is_orthogonal(op, basis): # # .. math:: # -# \mathfrak{p} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \forall y\mathfrak{k}\}. +# \mathfrak{p} = \{x\in\mathfrak{g} | \langle x, y\rangle=0 \ \forall \ y\in\mathfrak{k}\}. # # In this context, :math:`\mathfrak{k}` is commonly called the *vertical space*, # :math:`\mathfrak{p}` accordingly is the *horizontal space*. @@ -282,22 +282,23 @@ def is_orthogonal(op, basis): # [\mathfrak{p}, \mathfrak{p}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. # # The first property tells us that :math:`\mathfrak{p}` is left intact by the adjoint action of -# :math:`\mathfrak{k}` and that :math:`\mathfrak{p}` behaves like the "opposite" of a -# subalgebra, i.e., all commutators lie in its complement, the subalgebra :math:`\mathfrak{k}.` -# Due to the adjoint identity from above, the first property also holds for group elements -# acting on algebra elements; For all :math:`x\in\mathfrak{p}` and :math:`y\in\mathfrak{k},` -# we have +# :math:`\mathfrak{k}`. The second property suggests that :math:`\mathfrak{p}` behaves like the +# "opposite" of a subalgebra, i.e., all commutators lie in its complement, the subalgebra +# :math:`\mathfrak{k}.` Due to the adjoint identity from above, the first property also holds for +# group elements acting on algebra elements; for all :math:`x\in\mathfrak{p}` and +# :math:`K\in\mathcal{K}=\exp(\mathfrak{k}),` we have # # .. math:: # # K x K^\dagger # = \exp(y) x \exp(-y) +# = \text{Ad}_{\exp(y)}(x) # = \exp(\text{ad}_y) (x) # = \sum_{n=0}^\infty \frac{1}{n!} \underset{\in\mathfrak{p}}{\underbrace{(\text{ad}_y)^n (x)}} # \in \mathfrak{p}. # -# If the reductive property holds, the quotient space :math:`\mathcal{G}/\mathcal{K}` of the groups of -# :math:`\mathfrak{g}` and :math:`\mathfrak{k}` (see detail box below) is called a +# If the reductive property holds, the quotient space :math:`\mathcal{G}/\mathcal{K}` of the groups +# of :math:`\mathfrak{g}` and :math:`\mathfrak{k}` (see detail box below) is called a # *reductive homogeneous space*. If both properties hold, :math:`(\mathfrak{k}, \mathfrak{p})` is # called a *Cartan pair* and we call :math:`\mathfrak{g}=\mathfrak{k} \oplus \mathfrak{p}` a # *Cartan decomposition*. :math:`(\mathfrak{g}, \mathfrak{k})` is named a *symmetric pair* @@ -305,14 +306,14 @@ def is_orthogonal(op, basis): # Symmetric spaces are relevant for a wide range of applications in physics # and have been studied a lot throughout the last hundred years. # -# .. admonition:: Nomenclature +# .. admonition:: Nomenclature: Cartan decomposition/pair # :class: warning # # Depending on context and field, there sometimes are additional requirements # for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{p}` to be called a Cartan decomposition # and for :math:`(\mathfrak{k}, \mathfrak{p})` to be a Cartan pair. # -# .. admonition:: Mathematical detail +# .. admonition:: Math detail: quotient space # :class: note # # The *quotient space* of a Lie group :math:`\mathcal{G}` and a subgroup :math:`\mathcal{K}` @@ -332,7 +333,7 @@ def is_orthogonal(op, basis): # **Example** # # For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{u}(1)` -# of :math:`\mathfrak{su}(2)` generating Pauli-Z rotations: +# of :math:`\mathfrak{su}(2)` that generates Pauli :math:`Z` rotations: # # .. math:: # @@ -349,7 +350,7 @@ def check_cartan_decomposition(g, k, space_name): # Check Lie closure of k k_lie_closure = qml.pauli.dla.lie_closure(k) k_is_closed = len(k_lie_closure) == len(k) - print(f"The Lie closure of k is as large as k itself: {k_is_closed}.") + print(f"The Lie closure of k is as big as k itself: {k_is_closed}.") # Orthogonal complement of k, assuming that everything is given in the same basis. p = [g_op for g_op in g if is_orthogonal(g_op, k)] @@ -399,7 +400,7 @@ def check_cartan_decomposition(g, k, space_name): # [x, y] \in [\mathfrak{a}, \mathfrak{a}] \subset [\mathfrak{p}, \mathfrak{p}] # \subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. # -# That is, the commutator must lie in both orthogonal complements :math:`\mathfrak{k}` and +# That is, the commutator must lie in *both* orthogonal complements :math:`\mathfrak{k}` and # :math:`\mathfrak{p},` which only have the zero vector in common. This tells us that *all* # commutators in :math:`\mathfrak{a}` vanish, making it an *Abelian* subalgebra: # @@ -410,13 +411,14 @@ def check_cartan_decomposition(g, k, space_name): # Such an Abelian subalgebra is a (horizontal) *Cartan subalgebra (CSA)* if it is *maximal*, # i.e., if it can not be made any larger (higher-dimensional) without leaving :math:`\mathfrak{p}.` # -# .. admonition:: Nomenclature +# .. admonition:: Nomenclature: Cartan subalgebra # :class: warning # # Depending on context and field, there are inequivalent notions of Cartan subalgebras. # In particular, there is a common notion of Cartan subalgebras which are not contained # in a horizontal space. Throughout this demo, we always mean a *horizontal* -# maximal Abelian subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}.` +# maximal Abelian subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}.` The two notions +# can be made compatible by being precise about the space of which the subalgebra is a CSA. # # How many different CSAs are there? Given a CSA :math:`\mathfrak{a},` we can pick a vertical # element :math:`y\in\mathfrak{k}` and apply the corresponding group element :math:`K=\exp(y)` to @@ -427,12 +429,12 @@ def check_cartan_decomposition(g, k, space_name): # # .. math:: # -# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = 0 +# [K x_1 K^\dagger, K x_2 K^\dagger] = K [x_1, x_2] K^\dagger = K 0 K^\dagger = 0 # \quad \forall\ x_{1, 2}\in\mathfrak{a}. # -# Finally, we are guaranteed that :math:`K\mathfrak{a} K^\dagger` remains maximal. +# Finally, we are guaranteed that :math:`K\mathfrak{a} K^\dagger` remains maximal: # -# .. admonition:: Mathematical detail +# .. admonition:: Math detail: CSAs remain maximal # :class: note # # The reason that :math:`K\mathfrak{a} K^\dagger` is maximal if :math:`\mathfrak{a}` was, is @@ -444,7 +446,7 @@ def check_cartan_decomposition(g, k, space_name): # For most :math:`y\in\mathfrak{k},` applying :math:`K=\exp(y)` in this way will yield a # *different* CSA, so that we find a whole continuum of them. # It turns out that they *all* can be found by starting with *any* -# :math:`\mathfrak{a}` and applying all of :math:`\exp(\mathfrak{k})` to it. +# :math:`\mathfrak{a}` and applying all of :math:`\mathcal{K}` to it. # # *This is what powers the KAK theorem.* # @@ -454,8 +456,8 @@ def check_cartan_decomposition(g, k, space_name): # :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal # space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}.` Starting with the subspace # :math:`\mathfrak{a}=\text{span}_{\mathbb{R}} \{iY\},` we see that we immediately reach a maximal Abelian -# subalgebra, i.e., a CSA, because :math:`[Y, X]\neq 0.` Applying a rotation :math:`\exp(i\eta Z)` -# to this CSA gives us a new CSA via +# subalgebra (a CSA), because :math:`[Y, X]\neq 0.` Applying a rotation +# :math:`\exp(i\eta Z)\in\mathcal{K}` to this CSA gives us a new CSA via # # .. math:: # @@ -463,12 +465,12 @@ def check_cartan_decomposition(g, k, space_name): # =\{c\cos(2\eta) iY + c\sin(2\eta) iX | c\in\mathbb{R}\} . # # The vertical group element :math:`\exp(i\eta Z)` simply rotates the CSA within -# :math:`\mathfrak{p}!` Let us not forget to define the CSA in code. +# :math:`\mathfrak{p}.` Let us not forget to define the CSA in code. # CSA generator: iY a = p[1] -# Rotate CSA by applying vertical group element +# Rotate CSA by applying some vertical group element exp(i eta Z) eta = 0.6 # The factor -2 compensates the convention -1/2 in the RZ gate a_prime = qml.RZ(-2 * eta, 0) @ a @ qml.RZ(2 * eta, 0) @@ -482,7 +484,7 @@ def check_cartan_decomposition(g, k, space_name): # Cartan involutions # ~~~~~~~~~~~~~~~~~~ # -# In practice, there often is a more convenient way to a Cartan decomposition +# In practice, there often is a more convenient way to obtain a Cartan decomposition # than by specifying the subalgebra :math:`\mathfrak{k}` or its horizontal counterpart # :math:`\mathfrak{p}` manually. It goes as follows. # @@ -492,21 +494,22 @@ def check_cartan_decomposition(g, k, space_name): # # #. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y),` # #. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)],` and -# #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x.` +# #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x,` +# or :math:`\theta^2=\mathbb{I}_{\mathfrak{g}}` # # In short, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}.` # # As an involution, :math:`\theta` only can have the eigenvalues :math:`\pm 1,` with associated # eigenspaces :math:`\mathfrak{g}_\pm.` Let's see what happens when we compute commutators between -# elements :math:`x_\pm\in\mathfrak{g}_\pm \Leftrightarrow \theta(x_\pm) = \pm x_pm:` +# elements :math:`x_\pm\in\mathfrak{g}_\pm \Leftrightarrow \theta(x_\pm) = \pm x_\pm:` # # .. math:: # -# \theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] +# &\theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] # &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ -# \theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] +# &\theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] # &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ -# \theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] +# &\theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] # &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. # # Or, in other words, @@ -520,7 +523,7 @@ def check_cartan_decomposition(g, k, space_name): # # We might want to call such a :math:`\theta` a *Cartan involution*. # -# .. admonition:: Nomenclature +# .. admonition:: Nomenclature: Cartan involution # :class: warning # # Some people do so, some people again require more properties for such an @@ -546,7 +549,7 @@ def check_cartan_decomposition(g, k, space_name): # \theta_{\mathfrak{k}}^2=(\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}})^2 # = \Pi_{\mathfrak{k}}^2-\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}} # -\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{p}}^2 -# =\Pi_{\mathfrak{k}}-\Pi_{\mathfrak{p}} +# =\Pi_{\mathfrak{k}}+\Pi_{\mathfrak{p}} # = \mathbb{I}_{\mathfrak{g}}, # # where we used the projectors' property :math:`\Pi_{\mathfrak{k}}^2=\Pi_{\mathfrak{k}}` and @@ -554,33 +557,24 @@ def check_cartan_decomposition(g, k, space_name): # :math:`\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}}=\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}=0` because # the spaces :math:`\mathfrak{k}` and :math:`\mathfrak{p}` are orthogonal to each other. # -# .. admonition:: Mathematical detail +# .. admonition:: Math detail: :math:`\theta_{\mathfrak{k}}` is a homomorphism # :class: note # -# To see that :math:`\theta_{\mathfrak{k}}` is compatible with the commutator, we compute -# the action of the projectors on it: +# To see that :math:`\theta_{\mathfrak{k}}` is compatible with the commutator, i.e., +# an algebra homomorphism, see how a commutator :math:`[x, y]` splits: # # .. math:: # -# \Pi_{\mathfrak{k}}([x, y]) -# &= \Pi_{\mathfrak{k}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{p}}(y) \\ -# &= \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)]}}) -# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{k}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]}})\\ -# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]\\ -# \Pi_{\mathfrak{p}}([x, y]) -# &= \Pi_{\mathfrak{p}}([\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{p}}(y) \\ -# &= \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)]}}) -# \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]}}) -# \Pi_{\mathfrak{p}}(\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]}})\\ -# &= [\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)] + [\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]. -# -# Here we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{p}}` and the -# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{p}.` +# [x, y] +# &= [\Pi_{\mathfrak{k}}(x) + \Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y) + \Pi_{\mathfrak{p}}(y)] \\ +# &= \underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{k}}(y)]}} +# +\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{k}}(x), \Pi_{\mathfrak{p}}(y)]}} +# +\underset{\in \mathfrak{p}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)]}} +# +\underset{\in \mathfrak{k}}{\underbrace{[\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{p}}(y)]}}, # -# We can put thes pieces together to get +# where we used :math:`\mathbb{I}_{\mathfrak{g}} = \Pi_{\mathfrak{k}} + \Pi_{\mathfrak{p}}` and the +# commutation relations between :math:`\mathfrak{k}` and :math:`\mathfrak{p}.` +# We can use this split to compute # # .. math:: # @@ -591,6 +585,8 @@ def check_cartan_decomposition(g, k, space_name): # &=[\Pi_{\mathfrak{k}}(x) -\Pi_{\mathfrak{p}}(x), \Pi_{\mathfrak{k}}(y)-\Pi_{\mathfrak{p}}(y)]\\ # &=[\theta_{\mathfrak{k}} (x),\theta_{\mathfrak{k}} (y)]. # +# Thus, :math:`\theta_{\mathfrak{k}}` indeed is compatible with the commutator. +# # This shows us that we can easily switch between a Cartan involution and a Cartan # decomposition, in either direction! # @@ -598,7 +594,8 @@ def check_cartan_decomposition(g, k, space_name): # # In our example, an involution that reproduces our choice # :math:`\mathfrak{k}=\text{span}_{\mathbb{R}} \{iZ\}` is :math:`\theta_Z(x) = Z x Z` -# (Convince yourself that it is an involution that respects commutators). +# (Convince yourself that it is an involution that respects commutators, or verify that +# it matches :math:`\theta_{\mathfrak{k}}` from above). def theta_Z(x): @@ -615,8 +612,8 @@ def theta_Z(x): ###################################################################### # We can easily get a new subalgebra by modifying the involution, say, to -# :math:`\theta_Y(x) = Y x Y,` expecting that :math:`k_Y=\text{span}_{\mathbb{R}} \{iZ\}` -# becomes the new subalgebra. +# :math:`\theta_Y(x) = Y x Y,` expecting that +# :math:`\mathfrak{k}_Y=\text{span}_{\mathbb{R}} \{iY\}` becomes the new subalgebra. def theta_Y(x): @@ -637,7 +634,7 @@ def theta_Y(x): ###################################################################### # This worked! a new involution gave us a new subalgebra and Cartan decomposition. # -# .. admonition:: Mathematical detail +# .. admonition:: Math detail: classification of Cartan decompositions # :class: note # # You might already see that the two different decompositions created by :math:`\theta_Z` @@ -646,15 +643,15 @@ def theta_Y(x): # of semisimple Lie algebras. This classification # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra as matrices. -# For example, there are only three types of Cartan decompositions of the special -# unitary group :math:`SU(n)`, called AI, AII, and AIII. The subalgebras :math:`\mathfrak{k}` -# for these decompositions are the special orthogonal algebra :math:`\mathfrak{so}(n)` (AI), -# the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), and a sum of (special) unitary -# algebras :math:`\mathfrak{su}(p)\oplus\mathfrak{su}(q)\oplus\mathfrak{u}(1)` -# (AIII, :math:`p+q=n`). +# For example, there are only three types of Cartan decompositions of the special unitary +# algebra :math:`\mathfrak{su}(n)`, called AI, AII, and AIII. The subalgebras +# :math:`\mathfrak{k}` for these decompositions are the special orthogonal algebra +# :math:`\mathfrak{so}(n)` (AI), the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), +# and a sum of (special) unitary algebras +# :math:`\mathfrak{su}(p)\oplus\mathfrak{su}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). # Their involutions are usually represented by complex conjugation (AI), by the adjoint -# action with a Pauli operator (AIII, for qubits, :math:`p=q=2^{N-1}`), or by both in -# sequence (AII). It is instructive to try and see why those three are *not* equivalent +# action with a Pauli operator (AIII, for qubits, :math:`p=q=2^{N-1}`), or by both +# (AII). It is instructive to try and see why those three are *not* equivalent # under a unitary basis change! # # The KAK theorem @@ -679,11 +676,12 @@ def theta_Y(x): # \forall\ G\in\mathcal{G}\ \ \exists K\in\mathcal{K}, x\in\mathfrak{p}: \ G &= K \exp(x). # # This "KP" decomposition can be seen as the "group version" of -# :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}.` +# :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}` and is known as a *global* Cartan +# decomposition of :math:`\mathcal{G}.` # # The second step is the further decomposition of the space :math:`\mathcal{P}=\exp(\mathfrak{p}).` # For this we first need to fix a Cartan subalgebra (CSA) :math:`\mathfrak{a}\subset\mathfrak{p}.` -# The CSA might be given through some application or contextual information, but there is no +# The CSA might be given through some application or from context, but there is no # canonical choice. # Given a horizontal vector :math:`x\in\mathfrak{p},` we can always construct a second CSA # :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x.` As any two CSAs can be mapped @@ -738,7 +736,7 @@ def theta_Y(x): # G\in\mathcal{G} \quad\Rightarrow\quad G=K_1 \exp(a) K_2. # # If :math:`x` happens to be from the horizontal subspace :math:`\mathfrak{p}`, so that -# :math:`G\in \mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements :math:`K_1` +# :math:`G\in \mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements :math:`K_1` # and :math:`K_2` will in fact be related, namely # # .. math:: @@ -752,14 +750,30 @@ def theta_Y(x): # :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\},` a CSA gate # :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\},` and another gate from # :math:`\mathcal{K}.` We rediscovered a standard decomposition of an arbitrary -# :class:`~.pennylane.Rot` gate! +# :math:`SU(2)` gate! PennyLane produces it with :func:`~.pennylane.ops.one_qubit_decomposition`: + +x = 0.2j * su2[0] - 0.1j * su2[1] - 0.2j * su2[2] +G = qml.math.linalg.expm(qml.matrix(x)) +print(qml.ops.one_qubit_decomposition(G, 0, rotations="ZYZ")) -print(qml.Rot(0.5, 0.2, -1.6, wires=0).decomposition()) +###################################################################### +# If we pick a "horizontal gate", i.e., a gate :math:`G\in\mathcal{P}`, we obtain the same +# rotation angle for the initial and final :math:`R_Z` rotations, up to the expected sign, and +# a shift by some multiple of :math:`2\pi`. + +horizontal_x = -0.1j * p[0] - 4.1j * p[1] +print(horizontal_x) +P = qml.math.linalg.expm(qml.matrix(horizontal_x)) +decomp = qml.ops.one_qubit_decomposition(P, 0, rotations="ZYZ") +print(decomp) +angle_match = np.isclose((decomp[0].data[0] + decomp[-1].data[0])%(2*np.pi), 0.) +print(f"First and last rotation angle match up to sign and shift by 2kπ: {angle_match}") ###################################################################### # Other choices for involutions or---equivalently---subalgebras :math:`\mathfrak{k}` will # lead to other decompositions of ``Rot``. For example, using :math:`\theta_Y` from above -# together with the CSA :math:`\mathfrak{a_Y}=\text{span}_{\mathbb{R}} \{iX\},` we find the decomposition +# together with the CSA :math:`\mathfrak{a_Y}=\text{span}_{\mathbb{R}} \{iX\},` we find the +# decomposition # # .. math:: # @@ -788,7 +802,7 @@ def theta_Y(x): p = check_cartan_decomposition(su4, su2_su2, space_name) ###################################################################### -# .. admonition:: Mathematical detail +# .. admonition:: Math detail: involution for two-qubit decomposition # :class: note # # The accompanying involution sorts operators by the number of qubits on which they are @@ -802,11 +816,11 @@ def theta_Y(x): # Intuitively, the conjugation by :math:`Y_0Y_1` adds a minus # sign for each :math:`X` and :math:`Z` factor in :math:`x,` and the transposition # adds a minus sign for each :math:`Y.` Taken together, each Pauli operator contributes -# a minus sign. Finally, as we want the single-qubit operators to receive no sign in total, -# we add a minus sign overall. +# a minus sign. Finally, as we want the single-qubit operators to receive no sign in total +# (:math:`\mathfrak{k}` is the :math:`+1` eigenspace), we add a minus sign overall. # # Now we can pick a Cartan subalgebra within :math:`\mathfrak{p},` the vector space -# of all two-qubit Paulis. A common choice for this decomposition is +# of all two-qubit Paulis. A common choice is # # .. math:: # @@ -830,7 +844,7 @@ def theta_Y(x): # Here we decomposed the exponentials of the vertical elements :math:`y_{1,2}` further by # splitting them into exponentials acting on the first and second qubit, respectively. # -# The three parameters :math:`\eta^{x, y, z}` sometimes are called the Cartan coordinates +# The three parameters :math:`\eta^{x, y, z}` sometimes are called the *Cartan coordinates* # of :math:`U,` and they can be used, e.g., to assess the smallest-possible duration to # implement the gate in hardware. # @@ -870,7 +884,8 @@ def su4_gate(params): # In this demo we learned about the KAK theorem and how it uses a Cartan # decomposition of a Lie algebra to decompose its Lie group. # This allows us to break down arbitrary quantum gates from that group, -# as we implemented in code for the group of two-qubit gates :math:`SU(4).` +# as we implemented in code for the groups of single-qubit and two-qubit gates, +# :math:`SU(2).` and :math:`SU(4).` # # If you are interested in other applications of Lie theory in the field of # quantum computing, you are in luck! It has been a handy tool throughout the last From c0a6a82867c9d325b1aba8d7f4b68690a45c93bf Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 6 Nov 2024 11:10:16 +0100 Subject: [PATCH 18/32] quotes --- .../tutorial_kak_theorem.metadata.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index 2a77d09bc3..faf2535f5f 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -115,15 +115,15 @@ "url": "https://journals.aps.org/pra/abstract/10.1103/PhysRevA.105.032420" }, { - id: "gu", - type: "article", - title: "Fast-forwarding quantum evolution", - authors: "Shouzhen Gu, Rolando D. Somma, Burak Şahinoğlu", - year: "2021", - publisher: "", - journal: "Quantum", - doi: "10.22331/q-2021-11-15-577", - url: "https://quantum-journal.org/papers/q-2021-11-15-577/#" + "id": "gu", + "type": "article", + "title": "Fast-forwarding quantum evolution", + "authors": "Shouzhen Gu, Rolando D. Somma, Burak Şahinoğlu", + "year": "2021", + "publisher": "", + "journal": "Quantum", + "doi": "10.22331/q-2021-11-15-577", + "url": "https://quantum-journal.org/papers/q-2021-11-15-577/#" }, { "id": "dirr", From 09629fd67f7bf6f23800cdc1efc8b41fddee16f4 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 6 Nov 2024 11:59:55 +0100 Subject: [PATCH 19/32] remove empty doi --- demonstrations/tutorial_kak_theorem.metadata.json | 1 - 1 file changed, 1 deletion(-) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index faf2535f5f..aae09492b9 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -56,7 +56,6 @@ "year": "2003", "publisher": "American Mathematical Society", "journal": "Student Mathematical Library", - "doi": "", "url": "https://bookstore.ams.org/stml-22" }, { From 62fc819304ff594b19afe6025d649b72b7cf7dea Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 11 Nov 2024 09:41:03 +0100 Subject: [PATCH 20/32] code review; undo accidental minuscilization --- demonstrations/tutorial_kak_theorem.py | 35 +++++---- demonstrations/tutorial_liesim.metadata.json | 80 ++++++++++---------- 2 files changed, 62 insertions(+), 53 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 23ed5131df..6819908acd 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -49,7 +49,8 @@ see our :doc:`intro to (dynamical) Lie algebras `). A *Lie algebra* :math:`\mathfrak{g}` is a vector space with an additional operation -that takes two vectors to a new vector, the *Lie bracket*. +that takes two vectors to a new vector, the *Lie bracket*. :math:`\mathfrak{g}` must be +closed under the Lie bracket to form an algebra. For our purposes, the vectors will always be matrices and the Lie bracket will be the matrix commutator. @@ -63,9 +64,9 @@ .. math:: \mathfrak{su}(2) - &= \left\{\left(\begin{array} i a & b + ic \\ -b + ic & -i a \end{array}\right) + &= \left\{i\left(\begin{array}{cc} a & b-ic \\ b+ic & -a \end{array}\right) {\large |} a, b, c \in \mathbb{R}\right\}\\ - &= \left\{i(a Z + b Y + c X)| a, b, c \in \mathbb{R}\right\}. + &= \left\{i(a Z + b X + c Y)| a, b, c \in \mathbb{R}\right\}. We will also look at a more involved example at the end of the demo. @@ -119,9 +120,9 @@ # .. admonition:: Math detail: (semi-)simple Lie algebras # :class: note # -# Our main result for this demo will be the KAK theorem, which applies to -# so-called *semisimple* Lie algebras, which are in turn composed of *simple* Lie algebras -# as building blocks. Without going into detail, it often is sufficient to think of these +# Our main result for this demo will be the KAK theorem, which applies to so-called +# *semisimple* Lie algebras, which are in turn composed of *simple* Lie algebras as building +# blocks. Without going into detail, it often is sufficient to think of these building # blocks as (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic # algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{su}(n).` # In particular, our example here is of the latter type, so it is not only semisimple, @@ -140,7 +141,7 @@ # # .. math:: # -# \exp : \mathfrak{g} \to \exp(\mathfrak{g})=\mathcal{G}, \ x\mapsto \exp(x). +# \mathcal{G}=\exp(\mathfrak{g}). # # We will only consider Lie groups :math:`\exp(\mathfrak{g})` arising from a Lie algebra # :math:`\mathfrak{g}` here. @@ -177,7 +178,7 @@ # # where we applied the exponential map to :math:`\text{ad}_x`, which maps from :math:`\mathfrak{g}` # to itself, via its series representation. -# We will refer to this relationship as *adjoint identity*. +# We will refer to this relationship as the *adjoint identity*. # We talk about Ad and ad in more detail in the box below, and refer to our demo # :doc:`g-sim: Lie algebraic classical simulations ` for # further discussion. @@ -309,9 +310,11 @@ def is_orthogonal(op, basis): # .. admonition:: Nomenclature: Cartan decomposition/pair # :class: warning # -# Depending on context and field, there sometimes are additional requirements -# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{p}` to be called a Cartan decomposition -# and for :math:`(\mathfrak{k}, \mathfrak{p})` to be a Cartan pair. +# Depending on context and field, there sometimes is an additional requirement +# for :math:`\mathfrak{g}=\mathfrak{k}\oplus\mathfrak{p}` to be called a Cartan decomposition. +# Without going into detail, this requirement is that the so-called *Killing form* must be +# negative definite on :math:`\mathfrak{k}` and positive definite on :math:`\mathfrak{p}` +# [#helgason]_. # # .. admonition:: Math detail: quotient space # :class: note @@ -328,7 +331,8 @@ def is_orthogonal(op, basis): # condition holds for any :math:`g\in \mathcal{G}` are called *normal subgroups*. # We are interested in cases where the symmetric property # :math:`[\mathfrak{p}, \mathfrak{p}] \subset \mathfrak{k}` holds, which excludes (non-Abelian) -# normal subgroups, and thus :math:`\mathcal{G`/\mathcal{K}` will not be a group. +# normal subgroups, and thus our quotient space :math:`\mathcal{G`/\mathcal{K}` will not be +# a group. # # **Example** # @@ -649,6 +653,8 @@ def theta_Y(x): # :math:`\mathfrak{so}(n)` (AI), the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), # and a sum of (special) unitary algebras # :math:`\mathfrak{su}(p)\oplus\mathfrak{su}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). +# For a quick overview, see for example the `Wikipedia entry on symmetric spaces +# `__. # Their involutions are usually represented by complex conjugation (AI), by the adjoint # action with a Pauli operator (AIII, for qubits, :math:`p=q=2^{N-1}`), or by both # (AII). It is instructive to try and see why those three are *not* equivalent @@ -707,6 +713,7 @@ def theta_Y(x): # .. math:: # # \mathcal{P} +# =\exp(\mathfrak{p}) # = \{\exp(\exp(-y) \mathfrak{a} \exp(y)) | y\in\mathfrak{k}\} # = \{\exp(K^{-1} \mathfrak{a} K) | K\in\mathcal{K}\} # = \{K^{-1} \mathcal{A} K | K\in\mathcal{K}\}, @@ -719,7 +726,9 @@ def theta_Y(x): # .. math:: # # \mathcal{G} -# = \{\exp(y_1) \exp(a) \exp(y_2) | a\in\mathfrak{a}, \ y_{1, 2}\in\mathfrak{k}\} +# =\mathcal{K}\mathcal{P} +# = \mathcal{K}\{K^{-1} \mathcal{A} K | K\in\mathcal{K}\}, +# = \{K_1 \mathcal{A} K_2 | K_{1,2}\in\mathcal{K}\}, # = \mathcal{K} \mathcal{A} \mathcal{K} \qquad\textbf{(KAK Theorem).} # # It teaches us that any group element can be decomposed into two factors from the Lie subgroup and diff --git a/demonstrations/tutorial_liesim.metadata.json b/demonstrations/tutorial_liesim.metadata.json index 4ed6428f72..f3d75d959d 100644 --- a/demonstrations/tutorial_liesim.metadata.json +++ b/demonstrations/tutorial_liesim.metadata.json @@ -37,108 +37,108 @@ "url": "https://arxiv.org/abs/2309.05690" }, { - "id": "fontana", + "id": "Fontana", "type": "article", - "title": "the adjoint is all you need: characterizing barren plateaus in quantum ansätze", - "authors": "enrico fontana, dylan herman, shouvanik chakrabarti, niraj kumar, romina yalovetzky, jamie heredge, shree hari sureshbabu, marco pistoia", + "title": "The Adjoint Is All You Need: Characterizing Barren Plateaus in Quantum Ansätze", + "authors": "Enrico Fontana, Dylan Herman, Shouvanik Chakrabarti, Niraj Kumar, Romina Yalovetzky, Jamie Heredge, Shree Hari Sureshbabu, Marco Pistoia", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.2309.07902", + "doi": "10.48550/arXiv.2309.07902", "url": "https://arxiv.org/abs/2309.07902" }, { - "id": "ragone", + "id": "Ragone", "type": "preprint", - "title": "a unified theory of barren plateaus for deep parametrized quantum circuits", - "authors": "michael ragone, bojko n. bakalov, frédéric sauvage, alexander f. kemper, carlos ortiz marrero, martin larocca, m. cerezo", + "title": "A Unified Theory of Barren Plateaus for Deep Parametrized Quantum Circuits", + "authors": "Michael Ragone, Bojko N. Bakalov, Frédéric Sauvage, Alexander F. Kemper, Carlos Ortiz Marrero, Martin Larocca, M. Cerezo", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.2309.09342", + "doi": "10.48550/arXiv.2309.09342", "url": "https://arxiv.org/abs/2309.09342" }, { - "id": "goh", + "id": "Goh", "type": "preprint", - "title": "lie-algebraic classical simulations for variational quantum computing", - "authors": "matthew l. goh, martin larocca, lukasz cincio, m. cerezo, frédéric sauvage", + "title": "Lie-algebraic classical simulations for variational quantum computing", + "authors": "Matthew L. Goh, Martin Larocca, Lukasz Cincio, M. Cerezo, Frédéric Sauvage", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.2308.01432", + "doi": "10.48550/arXiv.2308.01432", "url": "https://arxiv.org/abs/2308.01432" }, { - "id": "somma", + "id": "Somma", "type": "preprint", - "title": "quantum computation, complexity, and many-body physics", - "authors": "rolando d. somma", + "title": "Quantum Computation, Complexity, and Many-Body Physics", + "authors": "Rolando D. Somma", "year": "2005", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.quant-ph/0512209", + "doi": "10.48550/arXiv.quant-ph/0512209", "url": "https://arxiv.org/abs/quant-ph/0512209" }, { - "id": "somma2", + "id": "Somma2", "type": "preprint", - "title": "efficient solvability of hamiltonians and limits on the power of some quantum computational models", - "authors": "rolando somma, howard barnum, gerardo ortiz, emanuel knill", + "title": "Efficient solvability of Hamiltonians and limits on the power of some quantum computational models", + "authors": "Rolando Somma, Howard Barnum, Gerardo Ortiz, Emanuel Knill", "year": "2006", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.quant-ph/0601030", + "doi": "10.48550/arXiv.quant-ph/0601030", "url": "https://arxiv.org/abs/quant-ph/0601030" }, { - "id": "galitski", + "id": "Galitski", "type": "preprint", - "title": "quantum-to-classical correspondence and hubbard-stratonovich dynamical systems, a lie-algebraic approach", - "authors": "victor galitski", + "title": "Quantum-to-Classical Correspondence and Hubbard-Stratonovich Dynamical Systems, a Lie-Algebraic Approach", + "authors": "Victor Galitski", "year": "2010", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.1012.2873", + "doi": "10.48550/arXiv.1012.2873", "url": "https://arxiv.org/abs/1012.2873" }, { - "id": "cerezo", + "id": "Cerezo", "type": "preprint", - "title": "does provable absence of barren plateaus imply classical simulability? or, why we need to rethink variational quantum computing", - "authors": "m. cerezo, martin larocca, diego garcía-martín, n. l. diaz, paolo braccia, enrico fontana, manuel s. rudolph, pablo bermejo, aroosa ijaz, supanut thanasilp, eric r. anschuetz, zoë holmes", + "title": "Does provable absence of barren plateaus imply classical simulability? Or, why we need to rethink variational quantum computing", + "authors": "M. Cerezo, Martin Larocca, Diego García-Martín, N. L. Diaz, Paolo Braccia, Enrico Fontana, Manuel S. Rudolph, Pablo Bermejo, Aroosa Ijaz, Supanut Thanasilp, Eric R. Anschuetz, Zoë Holmes", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.2312.09121", + "doi": "10.48550/arXiv.2312.09121", "url": "https://arxiv.org/abs/2312.09121" }, { - "id": "mazzola", + "id": "Mazzola", "type": "preprint", - "title": "quantum computing for chemistry and physics applications from a monte carlo perspective", - "authors": "guglielmo mazzola", + "title": "Quantum computing for chemistry and physics applications from a Monte Carlo perspective", + "authors": "Guglielmo Mazzola", "year": "2023", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.2308.07964", + "doi": "10.48550/arXiv.2308.07964", "url": "https://arxiv.org/abs/2308.07964" }, { - "id": "park", + "id": "Park", "type": "preprint", - "title": "hardware-efficient ansatz without barren plateaus in any depth", - "authors": "chae-yeun park, minhyeok kang, joonsuk huh", + "title": "Hardware-efficient ansatz without barren plateaus in any depth", + "authors": "Chae-Yeun Park, Minhyeok Kang, Joonsuk Huh", "year": "2024", "publisher": "", "journal": "", - "doi": "10.48550/arxiv.2403.04844", + "doi": "10.48550/arXiv.2403.04844", "url": "https://arxiv.org/abs/2403.04844" } ], - "basedonpapers": ["10.48550/arxiv.2308.01432"], - "referencedbypapers": [], - "relatedcontent": [ + "basedOnPapers": ["10.48550/arXiv.2308.01432"], + "referencedByPapers": [], + "relatedContent": [ { "type": "demonstration", "id": "tutorial_liealgebra", @@ -151,7 +151,7 @@ }, { "type": "demonstration", - "id": "tutorial_how_to_optimize_qml_model_using_jax_and_optax", + "id": "tutorial_How_to_optimize_QML_model_using_JAX_and_Optax", "weight": 1.0 }, { From 533f0ce73798e6fc7e6fbed4e340a1d80273aa16 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 11 Nov 2024 09:41:21 +0100 Subject: [PATCH 21/32] black --- demonstrations/tutorial_kak_theorem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 6819908acd..8ac894fe64 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -775,7 +775,7 @@ def theta_Y(x): P = qml.math.linalg.expm(qml.matrix(horizontal_x)) decomp = qml.ops.one_qubit_decomposition(P, 0, rotations="ZYZ") print(decomp) -angle_match = np.isclose((decomp[0].data[0] + decomp[-1].data[0])%(2*np.pi), 0.) +angle_match = np.isclose((decomp[0].data[0] + decomp[-1].data[0]) % (2 * np.pi), 0.0) print(f"First and last rotation angle match up to sign and shift by 2kπ: {angle_match}") ###################################################################### From d3f82f8dca11c2aab9ebaeced7dabe28665441bc Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 13 Nov 2024 16:26:39 +0100 Subject: [PATCH 22/32] spoiler: factorization --- conf.py | 2 +- demonstrations/tutorial_kak_theorem.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/conf.py b/conf.py index c8a9239f6e..61b3d032a5 100644 --- a/conf.py +++ b/conf.py @@ -84,7 +84,7 @@ "backreferences_dir" : "backreferences", "doc_module" : ("pennylane"), "junit": "../test-results/sphinx-gallery/junit.xml", - 'reset_modules': ("module_resets.reset_jax", "matplotlib", "seaborn"), + "reset_modules": ("module_resets.reset_jax", "matplotlib", "seaborn"), } diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 8ac894fe64..2d24da2017 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -3,9 +3,11 @@ The KAK theorem is a beautiful mathematical result from Lie theory, with particular relevance for quantum computing. It can be seen as a -generalization of the singular value decomposition, and falls -under the large umbrella of matrix factorizations. This allows us to -use it for quantum circuit decompositions. +generalization of the singular value decomposition, as it decomposes a group +element :math:`U` (think: unitary operator) into :math:`U=K_1AK_2`, where +:math:`K_{1,2}` and :math:`A` belong to special subgroups that we will introduce. +This means the KAK theorem falls under the large umbrella of matrix factorizations, +and it allows us to use it for quantum circuit decompositions. In this demo, we will discuss so-called symmetric spaces, which arise from certain subgroups of Lie groups. For this, we will focus on the Lie algebras From c9da2f636e759addfadd4caf73ccaf3649da1c53 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 18 Nov 2024 09:07:00 +0100 Subject: [PATCH 23/32] typo --- demonstrations/tutorial_kak_theorem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 2d24da2017..3f57836078 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -333,7 +333,7 @@ def is_orthogonal(op, basis): # condition holds for any :math:`g\in \mathcal{G}` are called *normal subgroups*. # We are interested in cases where the symmetric property # :math:`[\mathfrak{p}, \mathfrak{p}] \subset \mathfrak{k}` holds, which excludes (non-Abelian) -# normal subgroups, and thus our quotient space :math:`\mathcal{G`/\mathcal{K}` will not be +# normal subgroups, and thus our quotient space :math:`\mathcal{G}/\mathcal{K}` will not be # a group. # # **Example** From 7ce490dd8889e0fd55f0b792354bc84abcd7ed0c Mon Sep 17 00:00:00 2001 From: David Wierichs Date: Wed, 20 Nov 2024 20:59:02 +0100 Subject: [PATCH 24/32] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ivana Kurečić --- .../tutorial_kak_theorem.metadata.json | 1 - demonstrations/tutorial_kak_theorem.py | 52 +++++++++---------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index aae09492b9..d18c222e90 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -24,7 +24,6 @@ ], "seoDescription": "Learn about the KAK theorem and how it powers circuit decompositions.", "doi": "", - "canonicalURL": "/qml/demos/tutorial_kak_theorem", "references": [ { "id": "hall", diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 3f57836078..614b0bed1f 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -4,7 +4,7 @@ The KAK theorem is a beautiful mathematical result from Lie theory, with particular relevance for quantum computing. It can be seen as a generalization of the singular value decomposition, as it decomposes a group -element :math:`U` (think: unitary operator) into :math:`U=K_1AK_2`, where +element :math:`U` (think: unitary operator) into :math:`U=K_1AK_2,` where :math:`K_{1,2}` and :math:`A` belong to special subgroups that we will introduce. This means the KAK theorem falls under the large umbrella of matrix factorizations, and it allows us to use it for quantum circuit decompositions. @@ -21,7 +21,7 @@ .. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png :align: center - :width: 60% + :width: 70% :target: javascript:void(0) Along the way, we will put some non-essential mathematical details @@ -32,7 +32,7 @@ In the following we will assume a basic understanding of vector spaces, linear maps, and Lie algebras. To review those topics, we recommend a look - at your favourite linear algebra material. For the latter also see our + at your favourite linear algebra material. For the latter, also see our :doc:`introduction to (dynamical) Lie algebras `. Without further ado, let's get started! @@ -51,8 +51,8 @@ see our :doc:`intro to (dynamical) Lie algebras `). A *Lie algebra* :math:`\mathfrak{g}` is a vector space with an additional operation -that takes two vectors to a new vector, the *Lie bracket*. :math:`\mathfrak{g}` must be -closed under the Lie bracket to form an algebra. +that takes two vectors to a new vector, the *Lie bracket*. To form an algebra, :math:`\mathfrak{g}` must be +closed under the Lie bracket. For our purposes, the vectors will always be matrices and the Lie bracket will be the matrix commutator. @@ -75,11 +75,11 @@ .. admonition:: Math detail: our Lie algebras are real :class: note - :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the - real numbers :math:`\mathbb{R}.` This means that scalar-vector multiplication is + The algebra :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the + real numbers, :math:`\mathbb{R}.` This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. - There is a simple way to see this; Multiplying a skew-Hermitian matrix + There is a simple way to see this. Multiplying a skew-Hermitian matrix :math:`x\in\mathfrak{su}(n)` by a complex number :math:`c\in\mathbb{C}` will yield :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x,` so that the result might no longer be skew-Hermitian, i.e. no longer in the algebra! If we keep it to real scalars @@ -91,10 +91,10 @@ Let us set up :math:`\mathfrak{su}(2)` in code. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work with the Hermitian counterparts as inputs, i.e., we will skip the factor :math:`i.` -We can check that :math:`\mathfrak{su}(2)` is closed under commutators, by +We can check that :math:`\mathfrak{su}(2)` is closed under commutators by computing all nested commutators, the so-called *Lie closure*, and observing that the closure is not larger than :math:`\mathfrak{su}(2)` itself. -Of course we could also check the closure manually for this small example. +Of course, we could also check the closure manually for this small example. """ from itertools import product, combinations @@ -115,11 +115,11 @@ print(f"All operators are traceless: {np.allclose(traces, 0.)}") ###################################################################### -# We find that :math:`\mathfrak{su}(2)` indeed is closed, and that it is a 3-dimensional +# We find that :math:`\mathfrak{su}(2)` is indeed closed, and that it is a 3-dimensional # space, as expected from the explicit expression above. # We also picked a correct representation with traceless operators. # -# .. admonition:: Math detail: (semi-)simple Lie algebras +# .. admonition:: Math detail: (semi)simple Lie algebras # :class: note # # Our main result for this demo will be the KAK theorem, which applies to so-called @@ -178,7 +178,7 @@ # # \text{Ad}_{\exp(x)}(y) = \exp(\text{ad}_x) (y), # -# where we applied the exponential map to :math:`\text{ad}_x`, which maps from :math:`\mathfrak{g}` +# where we applied the exponential map to :math:`\text{ad}_x,` which maps from :math:`\mathfrak{g}` # to itself, via its series representation. # We will refer to this relationship as the *adjoint identity*. # We talk about Ad and ad in more detail in the box below, and refer to our demo @@ -198,7 +198,7 @@ # # The map :math:`\Psi_{\exp(x)}` (with fixed subscript) is a smooth map from the Lie group # :math:`\mathcal{G}` to itself, so that we may differentiate it. This leads to the -# differential :math:`\text{Ad}_{\exp(x)}=d\Psi_{\exp(x)}` which maps the tangent spaces of +# differential :math:`\text{Ad}_{\exp(x)}=d\Psi_{\exp(x)},` which maps the tangent spaces of # :math:`\mathcal{G}` to itself. At the identity, where # the algebra :math:`\mathfrak{g}` forms the tangent space, we find # @@ -285,7 +285,7 @@ def is_orthogonal(op, basis): # [\mathfrak{p}, \mathfrak{p}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. # # The first property tells us that :math:`\mathfrak{p}` is left intact by the adjoint action of -# :math:`\mathfrak{k}`. The second property suggests that :math:`\mathfrak{p}` behaves like the +# :math:`\mathfrak{k}.` The second property suggests that :math:`\mathfrak{p}` behaves like the # "opposite" of a subalgebra, i.e., all commutators lie in its complement, the subalgebra # :math:`\mathfrak{k}.` Due to the adjoint identity from above, the first property also holds for # group elements acting on algebra elements; for all :math:`x\in\mathfrak{p}` and @@ -501,7 +501,7 @@ def check_cartan_decomposition(g, k, space_name): # #. It is linear, i.e., :math:`\theta(x + cy)=\theta(x) +c \theta(y),` # #. It is compatible with the commutator, i.e., :math:`\theta([x, y])=[\theta(x),\theta(y)],` and # #. It is an *involution*, i.e., :math:`\theta(\theta(x)) = x,` -# or :math:`\theta^2=\mathbb{I}_{\mathfrak{g}}` +# or :math:`\theta^2=\mathbb{I}_{\mathfrak{g}}.` # # In short, we demand that :math:`\theta` be an *involutive automorphism* of :math:`\mathfrak{g}.` # @@ -559,7 +559,7 @@ def check_cartan_decomposition(g, k, space_name): # = \mathbb{I}_{\mathfrak{g}}, # # where we used the projectors' property :math:`\Pi_{\mathfrak{k}}^2=\Pi_{\mathfrak{k}}` and -# :math:`\Pi_{\mathfrak{p}}^2=\Pi_{\mathfrak{p}}`, as well as the fact that +# :math:`\Pi_{\mathfrak{p}}^2=\Pi_{\mathfrak{p}},` as well as the fact that # :math:`\Pi_{\mathfrak{k}}\Pi_{\mathfrak{p}}=\Pi_{\mathfrak{p}}\Pi_{\mathfrak{k}}=0` because # the spaces :math:`\mathfrak{k}` and :math:`\mathfrak{p}` are orthogonal to each other. # @@ -600,7 +600,7 @@ def check_cartan_decomposition(g, k, space_name): # # In our example, an involution that reproduces our choice # :math:`\mathfrak{k}=\text{span}_{\mathbb{R}} \{iZ\}` is :math:`\theta_Z(x) = Z x Z` -# (Convince yourself that it is an involution that respects commutators, or verify that +# (convince yourself that it is an involution that respects commutators, or verify that # it matches :math:`\theta_{\mathfrak{k}}` from above). @@ -638,7 +638,7 @@ def theta_Y(x): print(f"Under theta_Y, the operators\n{su2}\nhave the eigenvalues\n{eigvals}") ###################################################################### -# This worked! a new involution gave us a new subalgebra and Cartan decomposition. +# This worked! A new involution gave us a new subalgebra and Cartan decomposition. # # .. admonition:: Math detail: classification of Cartan decompositions # :class: note @@ -650,7 +650,7 @@ def theta_Y(x): # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra as matrices. # For example, there are only three types of Cartan decompositions of the special unitary -# algebra :math:`\mathfrak{su}(n)`, called AI, AII, and AIII. The subalgebras +# algebra :math:`\mathfrak{su}(n),` called AI, AII, and AIII. The subalgebras # :math:`\mathfrak{k}` for these decompositions are the special orthogonal algebra # :math:`\mathfrak{so}(n)` (AI), the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), # and a sum of (special) unitary algebras @@ -737,7 +737,7 @@ def theta_Y(x): # the exponential of a CSA element, i.e., of commuting elements from the horizontal subspace # :math:`\mathfrak{p}.` This may already hint at the usefulness of the KAK theorem for matrix # factorizations in general, and for quantum circuit decompositions in particular. -# Given a group operation :math:`G=\exp(x)` with :math:`x\in\mathfrak{g}`, there are two +# Given a group operation :math:`G=\exp(x)` with :math:`x\in\mathfrak{g},` there are two # subalgebra elements :math:`y_{1,2}\in\mathfrak{k}` (or subgroup elements # :math:`K_{1,2}=\exp(y_{1,2})\in \mathcal{K}`) and a Cartan subgalgebra element # :math:`a\in\mathfrak{a}` so that @@ -746,8 +746,8 @@ def theta_Y(x): # # G\in\mathcal{G} \quad\Rightarrow\quad G=K_1 \exp(a) K_2. # -# If :math:`x` happens to be from the horizontal subspace :math:`\mathfrak{p}`, so that -# :math:`G\in \mathcal{P}\subset\mathcal{G}`, we know that the two subgroup elements :math:`K_1` +# If :math:`x` happens to be from the horizontal subspace :math:`\mathfrak{p},` so that +# :math:`G\in \mathcal{P}\subset\mathcal{G},` we know that the two subgroup elements :math:`K_1` # and :math:`K_2` will in fact be related, namely # # .. math:: @@ -770,7 +770,7 @@ def theta_Y(x): ###################################################################### # If we pick a "horizontal gate", i.e., a gate :math:`G\in\mathcal{P}`, we obtain the same # rotation angle for the initial and final :math:`R_Z` rotations, up to the expected sign, and -# a shift by some multiple of :math:`2\pi`. +# a shift by some multiple of :math:`2\pi.` horizontal_x = -0.1j * p[0] - 4.1j * p[1] print(horizontal_x) @@ -835,7 +835,7 @@ def theta_Y(x): # # .. math:: # -# \mathfrak{a} = \text{span}_{\mathbb{R}}\{iX_0X_1, iY_0Y_1, iZ_0Z_1\} +# \mathfrak{a} = \text{span}_{\mathbb{R}}\{iX_0X_1, iY_0Y_1, iZ_0Z_1\}. # # These three operators commute, making :math:`\mathfrak{a}` Abelian. # They also form a *maximal* Abelian algebra within :math:`\mathfrak{p},` which is less obvious. @@ -896,7 +896,7 @@ def su4_gate(params): # decomposition of a Lie algebra to decompose its Lie group. # This allows us to break down arbitrary quantum gates from that group, # as we implemented in code for the groups of single-qubit and two-qubit gates, -# :math:`SU(2).` and :math:`SU(4).` +# :math:`SU(2)` and :math:`SU(4).` # # If you are interested in other applications of Lie theory in the field of # quantum computing, you are in luck! It has been a handy tool throughout the last From 6d19c38695c827fd8f35b575970322c149c75758 Mon Sep 17 00:00:00 2001 From: David Wierichs Date: Wed, 20 Nov 2024 22:09:56 +0100 Subject: [PATCH 25/32] Update demonstrations/tutorial_kak_theorem.metadata.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ivana Kurečić --- demonstrations/tutorial_kak_theorem.metadata.json | 1 - 1 file changed, 1 deletion(-) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index d18c222e90..3c125dec1f 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -24,7 +24,6 @@ ], "seoDescription": "Learn about the KAK theorem and how it powers circuit decompositions.", "doi": "", - "references": [ { "id": "hall", "type": "book", From daeb3ecb163edd5fba6cf08fc3fe9a63374cc7e9 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 20 Nov 2024 22:12:44 +0100 Subject: [PATCH 26/32] accidental deletion --- demonstrations/tutorial_kak_theorem.metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index 3c125dec1f..d18c222e90 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -24,6 +24,7 @@ ], "seoDescription": "Learn about the KAK theorem and how it powers circuit decompositions.", "doi": "", + "references": [ { "id": "hall", "type": "book", From 20f4cdb6ff960630ca85b575650a9fdfa1469fd9 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Wed, 20 Nov 2024 23:57:57 +0100 Subject: [PATCH 27/32] review --- demonstrations/tutorial_kak_theorem.py | 83 +++++++++++++------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 614b0bed1f..fed4258f37 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -7,17 +7,18 @@ element :math:`U` (think: unitary operator) into :math:`U=K_1AK_2,` where :math:`K_{1,2}` and :math:`A` belong to special subgroups that we will introduce. This means the KAK theorem falls under the large umbrella of matrix factorizations, -and it allows us to use it for quantum circuit decompositions. +and it allows us to break down arbitrary quantum circuits into smaller building blocks, +i.e., we can use it for quantum circuit decompositions. -In this demo, we will discuss so-called symmetric spaces, which arise from -certain subgroups of Lie groups. For this, we will focus on the Lie algebras -of these groups. With these tools in our hands, we will then learn about -the KAK theorem itself. +In this demo, we will dive into Lie algebras and their groups. Then, we will discuss +so-called symmetric spaces, which arise from certain subgroups of those Lie groups. +With these tools in our hands, we will then learn about the KAK theorem itself, which +exploits a so-called Cartan decomposition to break up such a Lie group. -We will make all steps explicit on a toy example on paper and in code. +We will make all steps explicit on a toy example on paper and in code, which splits +single-qubit gates into a well-known sequence of rotations. Finally, we will get to know a handy decomposition of arbitrary -two-qubit unitaries into rotation gates as an application of the KAK theorem. - +two-qubit unitaries into rotation gates as another application of the KAK theorem. .. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_kak_theorem.png :align: center @@ -59,13 +60,13 @@ **Example** Our working example in this demo will be the *special unitary* algebra in two dimensions, -:math:`\mathfrak{su}(2).` +:math:`\mathfrak{s}\mathfrak{u}(2).` It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, which we can conveniently describe using the Pauli matrices: .. math:: - \mathfrak{su}(2) + \mathfrak{s}\mathfrak{u}(2) &= \left\{i\left(\begin{array}{cc} a & b-ic \\ b+ic & -a \end{array}\right) {\large |} a, b, c \in \mathbb{R}\right\}\\ &= \left\{i(a Z + b X + c Y)| a, b, c \in \mathbb{R}\right\}. @@ -75,12 +76,12 @@ .. admonition:: Math detail: our Lie algebras are real :class: note - The algebra :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the + The algebra :math:`\mathfrak{s}\mathfrak{u}(n)` is a *real* Lie algebra, i.e., it is a vector space over the real numbers, :math:`\mathbb{R}.` This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. There is a simple way to see this. Multiplying a skew-Hermitian matrix - :math:`x\in\mathfrak{su}(n)` by a complex number :math:`c\in\mathbb{C}` will yield + :math:`x\in\mathfrak{s}\mathfrak{u}(n)` by a complex number :math:`c\in\mathbb{C}` will yield :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x,` so that the result might no longer be skew-Hermitian, i.e. no longer in the algebra! If we keep it to real scalars :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c,` so that @@ -88,12 +89,12 @@ We will only consider real Lie algebras here. -Let us set up :math:`\mathfrak{su}(2)` in code. +Let us set up :math:`\mathfrak{s}\mathfrak{u}(2)` in code. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work with the Hermitian counterparts as inputs, i.e., we will skip the factor :math:`i.` -We can check that :math:`\mathfrak{su}(2)` is closed under commutators by +We can check that :math:`\mathfrak{s}\mathfrak{u}(2)` is closed under commutators by computing all nested commutators, the so-called *Lie closure*, and observing -that the closure is not larger than :math:`\mathfrak{su}(2)` itself. +that the closure is not larger than :math:`\mathfrak{s}\mathfrak{u}(2)` itself. Of course, we could also check the closure manually for this small example. """ @@ -115,7 +116,7 @@ print(f"All operators are traceless: {np.allclose(traces, 0.)}") ###################################################################### -# We find that :math:`\mathfrak{su}(2)` is indeed closed, and that it is a 3-dimensional +# We find that :math:`\mathfrak{s}\mathfrak{u}(2)` is indeed closed, and that it is a 3-dimensional # space, as expected from the explicit expression above. # We also picked a correct representation with traceless operators. # @@ -126,7 +127,7 @@ # *semisimple* Lie algebras, which are in turn composed of *simple* Lie algebras as building # blocks. Without going into detail, it often is sufficient to think of these building # blocks as (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic -# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{su}(n).` +# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{s}\mathfrak{u}(n).` # In particular, our example here is of the latter type, so it is not only semisimple, # but even simple. # @@ -151,8 +152,8 @@ # subalgebras, the correspondence is well-known to quantum practitioners: Exponentiate # a skew-Hermitian matrix to obtain a unitary operation, i.e., a quantum gate. # -# Interaction between group and algebra -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Interaction between Lie algebra and its group +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # We will make use of a particular interaction between the algebra :math:`\mathfrak{g}` and # its group :math:`\mathcal{G},` called the *adjoint action* of :math:`\mathcal{G}` on @@ -181,11 +182,11 @@ # where we applied the exponential map to :math:`\text{ad}_x,` which maps from :math:`\mathfrak{g}` # to itself, via its series representation. # We will refer to this relationship as the *adjoint identity*. -# We talk about Ad and ad in more detail in the box below, and refer to our demo +# We talk about :math:`\text{Ad}` and :math:`\text{ad}` in more detail in the box below, and refer to our demo # :doc:`g-sim: Lie algebraic classical simulations ` for # further discussion. # -# .. admonition:: Derivation: Adjoint representations +# .. admonition:: Derivation: adjoint representations # :class: note # # We begin this derivation with the *adjoint action* of :math:`\mathcal{G}` on itself, @@ -215,12 +216,12 @@ # # .. math:: # -# \text{ad}_{\circ}(y)&=d\text{Ad}_\circ(y)\\ +# \text{ad}_{\circ}(y)&=d\text{Ad}_\circ(y),\\ # \text{ad}: \mathfrak{g}\times \mathfrak{g}&\to\mathfrak{g}, # \ (x, y)\mapsto \text{ad}_x(y) = [x, y]. # # It is a non-trivial observation that this differential equals the commutator! -# With ad we arrived at a map that *represents* the action of an algebra element +# With :math:`\text{ad}` we arrived at a map that *represents* the action of an algebra element # :math:`x` on the vector space that is the algebra itself. That is, we found the # *adjoint representation* of :math:`\mathfrak{g}.` # @@ -281,12 +282,12 @@ def is_orthogonal(op, basis): # # .. math:: # -# [\mathfrak{k}, \mathfrak{p}] \subset& \mathfrak{p} \qquad \text{(Reductive property)}\\ +# [\mathfrak{k}, \mathfrak{p}] \subset& \mathfrak{p} \qquad \text{(Reductive property)},\\ # [\mathfrak{p}, \mathfrak{p}] \subset& \mathfrak{k} \qquad \text{(Symmetric property)}. # # The first property tells us that :math:`\mathfrak{p}` is left intact by the adjoint action of # :math:`\mathfrak{k}.` The second property suggests that :math:`\mathfrak{p}` behaves like the -# "opposite" of a subalgebra, i.e., all commutators lie in its complement, the subalgebra +# *opposite* of a subalgebra, i.e., all commutators lie in its complement, the subalgebra # :math:`\mathfrak{k}.` Due to the adjoint identity from above, the first property also holds for # group elements acting on algebra elements; for all :math:`x\in\mathfrak{p}` and # :math:`K\in\mathcal{K}=\exp(\mathfrak{k}),` we have @@ -339,7 +340,7 @@ def is_orthogonal(op, basis): # **Example** # # For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{u}(1)` -# of :math:`\mathfrak{su}(2)` that generates Pauli :math:`Z` rotations: +# of :math:`\mathfrak{s}\mathfrak{u}(2)` that generates Pauli-:math:`Z` rotations: # # .. math:: # @@ -394,7 +395,7 @@ def check_cartan_decomposition(g, k, space_name): # # The symmetric property of a Cartan decomposition # :math:`([\mathfrak{p}, \mathfrak{p}]\subset\mathfrak{k})` tells us that :math:`\mathfrak{p}` -# is "very far" from being a subalgebra (commutators never end up in :math:`\mathfrak{p}` again). +# is *very far* from being a subalgebra (commutators never end up in :math:`\mathfrak{p}` again). # This also gives us information about potential subalgebras *within* :math:`\ \mathfrak{p}.` # Assume we have a subalgebra :math:`\mathfrak{a}\subset\mathfrak{p}.` Then the commutator # between any two elements :math:`x, y\in\mathfrak{a}` must satisfy @@ -402,7 +403,7 @@ def check_cartan_decomposition(g, k, space_name): # .. math:: # # [x, y] \in \mathfrak{a} \subset \mathfrak{p} -# &\Rightarrow [x, y]\in\mathfrak{p} \text{(subalgebra property)} \\ +# &\Rightarrow [x, y]\in\mathfrak{p} \text{(subalgebra property)}, \\ # [x, y] \in [\mathfrak{a}, \mathfrak{a}] \subset [\mathfrak{p}, \mathfrak{p}] # \subset \mathfrak{k} &\Rightarrow [x, y]\in\mathfrak{k}\ \text{(symmetric property)}. # @@ -459,7 +460,7 @@ def check_cartan_decomposition(g, k, space_name): # **Example** # # For our example, we established the decomposition -# :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal +# :math:`\mathfrak{s}\mathfrak{u}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal # space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}.` Starting with the subspace # :math:`\mathfrak{a}=\text{span}_{\mathbb{R}} \{iY\},` we see that we immediately reach a maximal Abelian # subalgebra (a CSA), because :math:`[Y, X]\neq 0.` Applying a rotation @@ -512,9 +513,9 @@ def check_cartan_decomposition(g, k, space_name): # .. math:: # # &\theta([x_+, x_+]) = [\theta(x_+), \theta(x_+)] = [x_+, x_+] -# &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+\\ +# &\ \Rightarrow\ [x_+, x_+]\in\mathfrak{g}_+ ,\\ # &\theta([x_+, x_-]) = [\theta(x_+), \theta(x_-)] = -[x_+, x_-] -# &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_-\\ +# &\ \Rightarrow\ [x_+, x_-]\in\mathfrak{g}_- ,\\ # &\theta([x_-, x_-]) = [\theta(x_-), \theta(x_-)] = (-1)^2 [x_-, x_-] # &\ \Rightarrow\ [x_-, x_-]\in\mathfrak{g}_+. # @@ -650,11 +651,11 @@ def theta_Y(x): # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra as matrices. # For example, there are only three types of Cartan decompositions of the special unitary -# algebra :math:`\mathfrak{su}(n),` called AI, AII, and AIII. The subalgebras +# algebra :math:`\mathfrak{s}\mathfrak{u}(n),` called AI, AII, and AIII. The subalgebras # :math:`\mathfrak{k}` for these decompositions are the special orthogonal algebra # :math:`\mathfrak{so}(n)` (AI), the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), # and a sum of (special) unitary algebras -# :math:`\mathfrak{su}(p)\oplus\mathfrak{su}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). +# :math:`\mathfrak{s}\mathfrak{u}(p)\oplus\mathfrak{s}\mathfrak{u}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). # For a quick overview, see for example the `Wikipedia entry on symmetric spaces # `__. # Their involutions are usually represented by complex conjugation (AI), by the adjoint @@ -683,7 +684,7 @@ def theta_Y(x): # \mathcal{G} &= \mathcal{K}\mathcal{P}, \text{ or }\\ # \forall\ G\in\mathcal{G}\ \ \exists K\in\mathcal{K}, x\in\mathfrak{p}: \ G &= K \exp(x). # -# This "KP" decomposition can be seen as the "group version" of +# This *KP* decomposition can be seen as the *group version* of # :math:`\mathfrak{g} = \mathfrak{k} \oplus\mathfrak{p}` and is known as a *global* Cartan # decomposition of :math:`\mathcal{G}.` # @@ -693,7 +694,7 @@ def theta_Y(x): # canonical choice. # Given a horizontal vector :math:`x\in\mathfrak{p},` we can always construct a second CSA # :math:`\mathfrak{a}_x\subset\mathfrak{p}` that contains :math:`x.` As any two CSAs can be mapped -# to each other by some subalgebra element :math:`y\in\mathfrak{k}` using the adjoint action Ad, +# to each other by some subalgebra element :math:`y\in\mathfrak{k}` using the adjoint action :math:`\text{Ad},` # we know that a :math:`y` exists such that # # .. math:: @@ -723,7 +724,7 @@ def theta_Y(x): # where we abbreviated :math:`\mathcal{A} = \exp(\mathfrak{a}).` # # Chaining the two steps together and combining the left factor :math:`K^{-1}` with the group -# :math:`\mathcal{K}` in the "KP" decomposition, we obtain the *KAK theorem* +# :math:`\mathcal{K}` in the *KP* decomposition, we obtain the *KAK theorem* # # .. math:: # @@ -756,7 +757,7 @@ def theta_Y(x): # # **Example** # -# Applying what we just learned to our example on :math:`\mathfrak{su}(2),` we can state that +# Applying what we just learned to our example on :math:`\mathfrak{s}\mathfrak{u}(2),` we can state that # any single-qubit gate can be implemented by running a gate from # :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\},` a CSA gate # :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\},` and another gate from @@ -768,7 +769,7 @@ def theta_Y(x): print(qml.ops.one_qubit_decomposition(G, 0, rotations="ZYZ")) ###################################################################### -# If we pick a "horizontal gate", i.e., a gate :math:`G\in\mathcal{P}`, we obtain the same +# If we pick a *horizontal gate*, i.e., a gate :math:`G\in\mathcal{P}`, we obtain the same # rotation angle for the initial and final :math:`R_Z` rotations, up to the expected sign, and # a shift by some multiple of :math:`2\pi.` @@ -783,7 +784,7 @@ def theta_Y(x): ###################################################################### # Other choices for involutions or---equivalently---subalgebras :math:`\mathfrak{k}` will # lead to other decompositions of ``Rot``. For example, using :math:`\theta_Y` from above -# together with the CSA :math:`\mathfrak{a_Y}=\text{span}_{\mathbb{R}} \{iX\},` we find the +# together with the CSA :math:`\mathfrak{a}_Y=\text{span}_{\mathbb{R}} \{iX\},` we find the # decomposition # # .. math:: @@ -797,10 +798,10 @@ def theta_Y(x): # ----------------------------------------- # # Two-qubit operations are described by the special unitary group :math:`SU(4)` and -# here we will use a decomposition of its algebra :math:`\mathfrak{su}(4)` to decompose +# here we will use a decomposition of its algebra :math:`\mathfrak{s}\mathfrak{u}(4)` to decompose # such gates. # Specifically, we use the subalgebra that generates single-qubit operations independently -# on either qubit, :math:`\mathfrak{su}(2)\oplus\mathfrak{su}(2).` Let's set it up with our +# on either qubit, :math:`\mathfrak{s}\mathfrak{u}(2)\oplus\mathfrak{s}\mathfrak{u}(2).` Let's set it up with our # tool from earlier: # Define su(4). Skip first entry of Pauli group, which is the identity From 6ec9b4d56100d66053bc3ca1b4d812342985384f Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 21 Nov 2024 09:31:00 +0100 Subject: [PATCH 28/32] formatting --- demonstrations/tutorial_kak_theorem.py | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index fed4258f37..c1806f01e1 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -60,13 +60,13 @@ **Example** Our working example in this demo will be the *special unitary* algebra in two dimensions, -:math:`\mathfrak{s}\mathfrak{u}(2).` +:math:`\mathfrak{s}`:math:`\mathfrak{u}(2).` It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, which we can conveniently describe using the Pauli matrices: .. math:: - \mathfrak{s}\mathfrak{u}(2) + \mathfrak{s}`:math:`\mathfrak{u}(2) &= \left\{i\left(\begin{array}{cc} a & b-ic \\ b+ic & -a \end{array}\right) {\large |} a, b, c \in \mathbb{R}\right\}\\ &= \left\{i(a Z + b X + c Y)| a, b, c \in \mathbb{R}\right\}. @@ -76,12 +76,12 @@ .. admonition:: Math detail: our Lie algebras are real :class: note - The algebra :math:`\mathfrak{s}\mathfrak{u}(n)` is a *real* Lie algebra, i.e., it is a vector space over the + The algebra :math:`\mathfrak{s}`:math:`\mathfrak{u}(n)` is a *real* Lie algebra, i.e., it is a vector space over the real numbers, :math:`\mathbb{R}.` This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. There is a simple way to see this. Multiplying a skew-Hermitian matrix - :math:`x\in\mathfrak{s}\mathfrak{u}(n)` by a complex number :math:`c\in\mathbb{C}` will yield + :math:`x\in\mathfrak{s}`:math:`\mathfrak{u}(n)` by a complex number :math:`c\in\mathbb{C}` will yield :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x,` so that the result might no longer be skew-Hermitian, i.e. no longer in the algebra! If we keep it to real scalars :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c,` so that @@ -89,12 +89,12 @@ We will only consider real Lie algebras here. -Let us set up :math:`\mathfrak{s}\mathfrak{u}(2)` in code. +Let us set up :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` in code. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work with the Hermitian counterparts as inputs, i.e., we will skip the factor :math:`i.` -We can check that :math:`\mathfrak{s}\mathfrak{u}(2)` is closed under commutators by +We can check that :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` is closed under commutators by computing all nested commutators, the so-called *Lie closure*, and observing -that the closure is not larger than :math:`\mathfrak{s}\mathfrak{u}(2)` itself. +that the closure is not larger than :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` itself. Of course, we could also check the closure manually for this small example. """ @@ -116,7 +116,7 @@ print(f"All operators are traceless: {np.allclose(traces, 0.)}") ###################################################################### -# We find that :math:`\mathfrak{s}\mathfrak{u}(2)` is indeed closed, and that it is a 3-dimensional +# We find that :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` is indeed closed, and that it is a 3-dimensional # space, as expected from the explicit expression above. # We also picked a correct representation with traceless operators. # @@ -127,7 +127,7 @@ # *semisimple* Lie algebras, which are in turn composed of *simple* Lie algebras as building # blocks. Without going into detail, it often is sufficient to think of these building # blocks as (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic -# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{s}\mathfrak{u}(n).` +# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{s}`:math:`\mathfrak{u}(n).` # In particular, our example here is of the latter type, so it is not only semisimple, # but even simple. # @@ -152,8 +152,8 @@ # subalgebras, the correspondence is well-known to quantum practitioners: Exponentiate # a skew-Hermitian matrix to obtain a unitary operation, i.e., a quantum gate. # -# Interaction between Lie algebra and its group -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Interaction between Lie groups and algebras +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # We will make use of a particular interaction between the algebra :math:`\mathfrak{g}` and # its group :math:`\mathcal{G},` called the *adjoint action* of :math:`\mathcal{G}` on @@ -340,7 +340,7 @@ def is_orthogonal(op, basis): # **Example** # # For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{u}(1)` -# of :math:`\mathfrak{s}\mathfrak{u}(2)` that generates Pauli-:math:`Z` rotations: +# of :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` that generates Pauli-:math:`Z` rotations: # # .. math:: # @@ -460,7 +460,7 @@ def check_cartan_decomposition(g, k, space_name): # **Example** # # For our example, we established the decomposition -# :math:`\mathfrak{s}\mathfrak{u}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal +# :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal # space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}.` Starting with the subspace # :math:`\mathfrak{a}=\text{span}_{\mathbb{R}} \{iY\},` we see that we immediately reach a maximal Abelian # subalgebra (a CSA), because :math:`[Y, X]\neq 0.` Applying a rotation @@ -651,11 +651,11 @@ def theta_Y(x): # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra as matrices. # For example, there are only three types of Cartan decompositions of the special unitary -# algebra :math:`\mathfrak{s}\mathfrak{u}(n),` called AI, AII, and AIII. The subalgebras +# algebra :math:`\mathfrak{s}`:math:`\mathfrak{u}(n),` called AI, AII, and AIII. The subalgebras # :math:`\mathfrak{k}` for these decompositions are the special orthogonal algebra # :math:`\mathfrak{so}(n)` (AI), the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), # and a sum of (special) unitary algebras -# :math:`\mathfrak{s}\mathfrak{u}(p)\oplus\mathfrak{s}\mathfrak{u}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). +# :math:`\mathfrak{s}`:math:`\mathfrak{u}(p)\oplus\mathfrak{s}`:math:`\mathfrak{u}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). # For a quick overview, see for example the `Wikipedia entry on symmetric spaces # `__. # Their involutions are usually represented by complex conjugation (AI), by the adjoint @@ -757,7 +757,7 @@ def theta_Y(x): # # **Example** # -# Applying what we just learned to our example on :math:`\mathfrak{s}\mathfrak{u}(2),` we can state that +# Applying what we just learned to our example on :math:`\mathfrak{s}`:math:`\mathfrak{u}(2),` we can state that # any single-qubit gate can be implemented by running a gate from # :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\},` a CSA gate # :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\},` and another gate from @@ -798,10 +798,10 @@ def theta_Y(x): # ----------------------------------------- # # Two-qubit operations are described by the special unitary group :math:`SU(4)` and -# here we will use a decomposition of its algebra :math:`\mathfrak{s}\mathfrak{u}(4)` to decompose +# here we will use a decomposition of its algebra :math:`\mathfrak{s}`:math:`\mathfrak{u}(4)` to decompose # such gates. # Specifically, we use the subalgebra that generates single-qubit operations independently -# on either qubit, :math:`\mathfrak{s}\mathfrak{u}(2)\oplus\mathfrak{s}\mathfrak{u}(2).` Let's set it up with our +# on either qubit, :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)\oplus\mathfrak{s}`:math:`\mathfrak{u}(2).` Let's set it up with our # tool from earlier: # Define su(4). Skip first entry of Pauli group, which is the identity From 9c7578f1a41fe5962a7c89a40a3daac0b5c9bdda Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 21 Nov 2024 10:48:25 +0100 Subject: [PATCH 29/32] revert multi-mathfrak --- demonstrations/tutorial_kak_theorem.py | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index c1806f01e1..8b87a74cb1 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -60,13 +60,13 @@ **Example** Our working example in this demo will be the *special unitary* algebra in two dimensions, -:math:`\mathfrak{s}`:math:`\mathfrak{u}(2).` +:math:`\mathfrak{su}(2).` It consists of traceless complex-valued skew-Hermitian :math:`2\times 2` matrices, which we can conveniently describe using the Pauli matrices: .. math:: - \mathfrak{s}`:math:`\mathfrak{u}(2) + \mathfrak{su}(2) &= \left\{i\left(\begin{array}{cc} a & b-ic \\ b+ic & -a \end{array}\right) {\large |} a, b, c \in \mathbb{R}\right\}\\ &= \left\{i(a Z + b X + c Y)| a, b, c \in \mathbb{R}\right\}. @@ -76,12 +76,12 @@ .. admonition:: Math detail: our Lie algebras are real :class: note - The algebra :math:`\mathfrak{s}`:math:`\mathfrak{u}(n)` is a *real* Lie algebra, i.e., it is a vector space over the + The algebra :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the real numbers, :math:`\mathbb{R}.` This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. There is a simple way to see this. Multiplying a skew-Hermitian matrix - :math:`x\in\mathfrak{s}`:math:`\mathfrak{u}(n)` by a complex number :math:`c\in\mathbb{C}` will yield + :math:`x\in\mathfrak{su}(n)` by a complex number :math:`c\in\mathbb{C}` will yield :math:`(cx)^\dagger=\overline{c} x^\dagger=-\overline{c} x,` so that the result might no longer be skew-Hermitian, i.e. no longer in the algebra! If we keep it to real scalars :math:`c\in\mathbb{R}` only, we have :math:`\overline{c}=c,` so that @@ -89,12 +89,12 @@ We will only consider real Lie algebras here. -Let us set up :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` in code. +Let us set up :math:`\mathfrak{su}(2)` in code. Note that the algebra itself consists of *skew*-Hermitian matrices, but we will work with the Hermitian counterparts as inputs, i.e., we will skip the factor :math:`i.` -We can check that :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` is closed under commutators by +We can check that :math:`\mathfrak{su}(2)` is closed under commutators by computing all nested commutators, the so-called *Lie closure*, and observing -that the closure is not larger than :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` itself. +that the closure is not larger than :math:`\mathfrak{su}(2)` itself. Of course, we could also check the closure manually for this small example. """ @@ -116,7 +116,7 @@ print(f"All operators are traceless: {np.allclose(traces, 0.)}") ###################################################################### -# We find that :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` is indeed closed, and that it is a 3-dimensional +# We find that :math:`\mathfrak{su}(2)` is indeed closed, and that it is a 3-dimensional # space, as expected from the explicit expression above. # We also picked a correct representation with traceless operators. # @@ -127,7 +127,7 @@ # *semisimple* Lie algebras, which are in turn composed of *simple* Lie algebras as building # blocks. Without going into detail, it often is sufficient to think of these building # blocks as (1) special orthogonal algebras :math:`\mathfrak{so}(n),` (2) unitary symplectic -# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{s}`:math:`\mathfrak{u}(n).` +# algebras :math:`\mathfrak{sp}(n),` and (3) special unitary algebras :math:`\mathfrak{su}(n).` # In particular, our example here is of the latter type, so it is not only semisimple, # but even simple. # @@ -340,7 +340,7 @@ def is_orthogonal(op, basis): # **Example** # # For our example, we consider the subalgebra :math:`\mathfrak{k}=\mathfrak{u}(1)` -# of :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)` that generates Pauli-:math:`Z` rotations: +# of :math:`\mathfrak{su}(2)` that generates Pauli-:math:`Z` rotations: # # .. math:: # @@ -460,7 +460,7 @@ def check_cartan_decomposition(g, k, space_name): # **Example** # # For our example, we established the decomposition -# :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal +# :math:`\mathfrak{su}(2)=\mathfrak{u}(1)\oplus \mathfrak{p}` with the two-dimensional horizontal # space :math:`\mathfrak{p} = \text{span}_{\mathbb{R}}\{iX, iY\}.` Starting with the subspace # :math:`\mathfrak{a}=\text{span}_{\mathbb{R}} \{iY\},` we see that we immediately reach a maximal Abelian # subalgebra (a CSA), because :math:`[Y, X]\neq 0.` Applying a rotation @@ -651,11 +651,11 @@ def theta_Y(x): # plays a big role when talking about decompositions without getting stuck on details # like the choice of basis or the representation of the algebra as matrices. # For example, there are only three types of Cartan decompositions of the special unitary -# algebra :math:`\mathfrak{s}`:math:`\mathfrak{u}(n),` called AI, AII, and AIII. The subalgebras +# algebra :math:`\mathfrak{su}(n),` called AI, AII, and AIII. The subalgebras # :math:`\mathfrak{k}` for these decompositions are the special orthogonal algebra # :math:`\mathfrak{so}(n)` (AI), the unitary symplectic algebra :math:`\mathfrak{sp}(n)` (AII), # and a sum of (special) unitary algebras -# :math:`\mathfrak{s}`:math:`\mathfrak{u}(p)\oplus\mathfrak{s}`:math:`\mathfrak{u}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). +# :math:`\mathfrak{su}(p)\oplus\mathfrak{su}(q)\oplus\mathfrak{u}(1)` (AIII, :math:`p+q=n`). # For a quick overview, see for example the `Wikipedia entry on symmetric spaces # `__. # Their involutions are usually represented by complex conjugation (AI), by the adjoint @@ -757,7 +757,7 @@ def theta_Y(x): # # **Example** # -# Applying what we just learned to our example on :math:`\mathfrak{s}`:math:`\mathfrak{u}(2),` we can state that +# Applying what we just learned to our example on :math:`\mathfrak{su}(2),` we can state that # any single-qubit gate can be implemented by running a gate from # :math:`\mathcal{K}=\{\exp(i\eta Z) | \eta\in\mathbb{R}\},` a CSA gate # :math:`\mathcal{A}=\{\exp(i\varphi Y) | \eta\in\mathbb{R}\},` and another gate from @@ -798,10 +798,10 @@ def theta_Y(x): # ----------------------------------------- # # Two-qubit operations are described by the special unitary group :math:`SU(4)` and -# here we will use a decomposition of its algebra :math:`\mathfrak{s}`:math:`\mathfrak{u}(4)` to decompose +# here we will use a decomposition of its algebra :math:`\mathfrak{su}(4)` to decompose # such gates. # Specifically, we use the subalgebra that generates single-qubit operations independently -# on either qubit, :math:`\mathfrak{s}`:math:`\mathfrak{u}(2)\oplus\mathfrak{s}`:math:`\mathfrak{u}(2).` Let's set it up with our +# on either qubit, :math:`\mathfrak{su}(2)\oplus\mathfrak{su}(2).` Let's set it up with our # tool from earlier: # Define su(4). Skip first entry of Pauli group, which is the identity From 2b91e03a5a2f27aa5f490d9124b76fe129c59921 Mon Sep 17 00:00:00 2001 From: dwierichs Date: Thu, 21 Nov 2024 13:37:32 +0100 Subject: [PATCH 30/32] review --- demonstrations/tutorial_kak_theorem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.py b/demonstrations/tutorial_kak_theorem.py index 8b87a74cb1..14d804f1d6 100644 --- a/demonstrations/tutorial_kak_theorem.py +++ b/demonstrations/tutorial_kak_theorem.py @@ -3,7 +3,7 @@ The KAK theorem is a beautiful mathematical result from Lie theory, with particular relevance for quantum computing. It can be seen as a -generalization of the singular value decomposition, as it decomposes a group +generalization of the singular value decomposition (SVD), as it decomposes a group element :math:`U` (think: unitary operator) into :math:`U=K_1AK_2,` where :math:`K_{1,2}` and :math:`A` belong to special subgroups that we will introduce. This means the KAK theorem falls under the large umbrella of matrix factorizations, @@ -76,7 +76,7 @@ .. admonition:: Math detail: our Lie algebras are real :class: note - The algebra :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over the + The algebra :math:`\mathfrak{su}(n)` is a *real* Lie algebra, i.e., it is a vector space over real numbers, :math:`\mathbb{R}.` This means that scalar-vector multiplication is only valid between vectors (complex-valued matrices) and real scalars. From 2edc7f408b9eb98116af4490ee4aeb53de1a576f Mon Sep 17 00:00:00 2001 From: dwierichs Date: Mon, 25 Nov 2024 16:57:22 +0100 Subject: [PATCH 31/32] upload thumbnails --- .../thumbnail_large_kak_theorem.png | Bin 38835 -> 56384 bytes .../OGthumbnail_kak_theorem.png | Bin 36336 -> 54174 bytes .../thumbnail_kak_theorem.png | Bin 25382 -> 14521 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_kak_theorem.png b/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_kak_theorem.png index 3a755c347dd84350a7dda6554f8cc9a7f119a384..bc387fdbd7165bbbbd7aa21cd65ddffaa26fa312 100644 GIT binary patch literal 56384 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�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 z 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 literal 38835 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%0D~6DjP3^l>5ahHA@Z8r3}EDgcm91 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 D|3~{Y literal 36336 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 From 1a57d4c1b235ae77aa4072ec745f1e2721fd82c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivana=20Kure=C4=8Di=C4=87?= Date: Mon, 25 Nov 2024 17:43:53 +0100 Subject: [PATCH 32/32] Update demonstrations/tutorial_kak_theorem.metadata.json --- demonstrations/tutorial_kak_theorem.metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demonstrations/tutorial_kak_theorem.metadata.json b/demonstrations/tutorial_kak_theorem.metadata.json index d18c222e90..c9e865884d 100644 --- a/demonstrations/tutorial_kak_theorem.metadata.json +++ b/demonstrations/tutorial_kak_theorem.metadata.json @@ -5,8 +5,8 @@ "username": "dwierichs" } ], - "dateOfPublication": "2024-12-05T00:00:00+00:00", - "dateOfLastModification": "2024-12-05T00:00:00+00:00", + "dateOfPublication": "2024-11-25T00:00:00+00:00", + "dateOfLastModification": "2024-11-25T00:00:00+00:00", "categories": [ "Quantum Computing", "Algorithms"