Hilbert space

Site

The definition of a quantum many-body problem starts by defining the Hilbert space. The Site serves as a unit Hilbert space, and the Hilbert space for whole system can be constructed by taking the tensor product of them.

A Site can be constructed out of a set of State. For example,

julia> spinsite = Site([State("Up", 1), State("Dn", -1)])
Site{Tuple{Int64}}(State{Tuple{Int64}}[State{Tuple{Int64}}("Up", (1,)), State{Tuple{Int64}}("Dn", (-1,))])

constructs a two-state site with spin-half degrees of freedom. The type parameter Tuple{Int} represents the type of Abelian quantum number. which is is $2S_z$ in this case. When there are more than one conserved quantum numbers, they can be combined: e.g. Tuple{Int, Int}, to represent the charge and total $S_z$, for example. Each basis vector is represented as a binary number, corresponding to their order in the constructor (0-based). For the example above, the up-state is represented as 0 and the down-state is represented as 1.

HilbertSpace

We can combine multiple sites to form a HilbertSpace. To construct a Hilbert space from the spin-half sites as defined above,

hilbert_space = HilbertSpace([spinsite, spinsite, spinsite, spinsite])

Note that all the basis vectors of the Hilbert space will be represented as a binary number, where each Site occupies a fixed location and width. e.g.

|↑↑↑↑⟩ = |0000⟩
|↑↑↑↓⟩ = |0001⟩
|↑↑↓↑⟩ = |0010⟩
       ⋮
|↓↓↓↓⟩ = |1111⟩

The number of bits assigned for each site is determined by Int(ceil(log2(length(site.states))), and can be accessed by bitwidth.