# Time-dependent perturbation theory and multi-variable series expansions review#

The `perturbation`

module contains functionality for numerically computing perturbation theory
expansions used in the study of the dynamics of quantum systems. Following
[1], this discussion reviews key concepts required to understand
and utilize the module, including the Dyson series and Magnus expansion, their generalization to a
multi-variable setting, and the notation used to represent multi-variable power series in terms of
multisets.

## The Dyson series and Magnus expansion#

The Dyson series [2] and Magnus expansion [3][4] are time-dependent perturbation theory expansions for solutions of linear matrix differential equations (LMDEs). For an LMDE

with \(U(0) = I\) the identity matrix, the Dyson series directly expands the solution:

The Magnus expansion alternatively seeks to construct a time-averaged generator, i.e. an operator \(\Omega(t)\) for which

The Magnus expansion provides a series expansion, which, under certain conditions [4], converges to \(\Omega(t)\):

where explicit expressions for the \(\Omega_k(t)\) are given in the literature [4].

## Generalizing to the multi-variable case#

In applications, these expansions are often used in a *multi-variable* setting, in which the
generator \(G(t)\) depends on several variables \(c_0, \dots, c_{r-1}\), and the Dyson
series or Magnus expansion are used to understand how the evolution changes under perturbations to
several of these parameters simultaneously. For working with these expansions algorithmically it is
necessary to formalize the expression of these expansions in the multi-variable setting.

Mathematically, we explicitly write the generator as a function of these variables \(G(t, c_0, \dots, c_{r-1})\), and expand \(G\) in a multi-variable power series in the variables \(c_i\):

For physical applications we take the existence of such a power series for granted: up to constant factors, the coefficients \(G_{i_1, \dots, i_k}(t)\) are the partial derivatives of \(G\) with respect to the variables \(c_i\). Commonly, \(G\) depends linearly on the variables, e.g. when representing couplings between quantum systems.

Before defining the multi-variable Dyson series and Magnus expansions, we transform the generator
into the *toggling frame* of \(G_\emptyset(t)\)
[5][6]. Denoting

the generator \(G\) in the toggling frame of \(G_\emptyset(t)\), the unperturbed generator, is given by:

Denoting \(U(t, c_0, \dots, c_{r-1})\) as the solution of the LMDE with generator \(\tilde{G}\), note that

and hence solution for \(G\) and \(\tilde{G}\) are simply related by \(V(t)\).

Using this, [1] defines the multi-variable Dyson series for the generator \(\tilde{G}(t, c_0, \dots, c_{r-1})\) as:

where the \(\mathcal{D}_{i_1, \dots, i_k}(t)\) are defined implicitly by the above equation, and
are called the *multi-variable Dyson series terms*. Similarly the multi-variable Magnus expansion
for \(\tilde{G}\) is given as:

with the \(\mathcal{O}_{i_1, \dots, i_k}(t)\) again defined implicitly, and called the
*multi-variable Magnus expansion terms*.

## Computing multi-variable Dyson series and Magnus expansion terms#

Given a power series decomposition of the generator as above, the function
`solve_lmde_perturbation()`

computes, in the toggling frame of the unperturbed generator,
either multi-variable Dyson series or Magnus expansion terms via the algorithms in
[1]. It can also be used to compute Dyson-like terms via the
algorithm in [7]. In the presentation here and elsewhere, the
expansions are phrased as infinite series, but of course in practice truncated versions must be
specified and computed.

Utilizing this function, and working with the other objects in the module, requires understanding the notation and data structures used to represent power series.

## Multiset power series notation#

Following [1], the `perturbation`

module utilizes a
*multiset* notation to more compactly represent and work with power series.

Consider the power series expansion above for the generator \(G(t, c_0, \dots, c_{r-1})\).
Structurally, each term in the power series is labelled by the number of times each variable
\(c_0, \dots, c_{r-1}\) appears in the product \(c_{i_1} \dots c_{i_k}\). Equivalently, each
term may be indexed by the number of times each variable label \(0, \dots, r-1\) appears. The
data structure used to represent these labels in this module is that of a *multiset*, i.e. a “set
with repeated entries”. Denoting multisets with round brackets, e.g. \(I = (i_1, \dots, i_k)\),
we define

and similarly denote \(G_I = G_{i_1, \dots, i_k}\). This notation is chosen due to the simple relationship between algebraic operations and multiset operations. E.g., for two multisets \(I, J\), it holds that:

where \(I + J\) denotes the multiset whose object counts are the sum of both \(I\) and \(J\).

Some example usages of this notation are:

\(c_{(0, 1)} = c_0 c_1\),

\(c_{(1, 1)} = c_1^2\), and

\(c_{(1, 2, 2, 3)} = c_1 c_2^2 c_3\).

Finally, we denote the set of multisets of size $k$ with elements in \(\{0, \dots, r-1\}\) as \(\mathcal{I}_k(r)\). Combining everything, the power series for \(G\) may be rewritten as:

Similarly, the multi-variable Dyson series is written as:

and the multi-variable Magnus expansion as:

In the module, multisets are represented using the `Multiset`

object in the multiset package. Arguments to functions which must specify a multiset or a
list of multisets accept either `Multiset`

instances directly, or a valid argument to the
constructor to `Multiset`

, with the restriction that the multiset entries must be non-negative
integers.

References