First, we introduce basic definitions on the algebra of composite quantum systems, that is, when the state vector of the system is an element of a Hilbert space which is the direct product of elementary Hilbert spaces (by elementary we mean that it cannot be further decomposed as a direct product of more elementary Hilbert spaces):
The number of elementary Hilbert spaces (the number of quantum numbers of the system) is referred to throughout as the rank or arity (unary, binary, ternary, quaternary, etc.) of the system.
Via an example we define state-vector slices:
A state-vector slice is defined by the retained index positions , which define the subsystem, and the “dummy” indices . In situations when slicing occurs in the framework, the set of retained index positions is an information available at compile time, while the set of dummy indices is an information becoming available only at runtime.
Slicing is fully recursive in that a state-vector slice behaves exactly as a state vector, only with a lower rank. It can even be further sliced. It is in particular true that
Via an example we define canonical operator extensions:
When the numbers in the angular brackets are permutations of a sequence of ordinals, this is in fact not even an extension, only a permutation of the underlying elementary Hilbert spaces.
Matrix elements of the operator in extended Hilbert spaces can then be calculated by acting with the (possibly permutated) original operator on an appropriate vector slice:
Due to the abovementioned recursiveness, the state vector of a composite quantum system is most conveniently represented as a complex (dcomp) multi-array. For a definition of the multi-array concept cf. the Boost.MultiArray manual.
By virtue of its adequacy for numerics and its efficiency, we have chosen the Array
class from the Blitz++ library to represent state vectors on the lowest level in the framework.
In namespace cpputils, our collection of general-purpose modules, we rely on the template alias CArray, while @ higher levels of the framework, we use the more intuitive name quantumdata::Types::StateVectorLow.