Pending changes to the QuantumNumber library
- Move the functions for coupling coefficients to be member functions (possibly static) of a class. For example we would have
class SU2
{
public:
SU2();
typedef half_int value_type;
static double degree(half_int x);
static double coupling_3j_phase(half_int a, half_int b, half_int c);
// ...
};
In the case of {$SU(2)$} the functions can be static because the symmetry group has no parameters. In the case of the Dihedral
group {$D_n$} they cannot be static functions because the symmetry group depends on the parameter {$n$}. The representations
of the dihedral group consist of two one-dimensional reps {$+$} and {$-$}; for {$n$} even there are also two one-dimensional
reps {$+n$} and {$-n$}. The other reps {$j$} for {$0 < j < n$} are two dimensional. So a convenient representation is a 'signed' integer, where +0 and -0 are permissible values. (eg, this can be implemented using a sign bit or a 1's compliment representation.) We also allow half-integer (projective) representations. Note: the half-integer reps for odd {$n$} require complex coupling coefficients I think?!?!
class Dihedral
{
public:
Dihedral(int N_) : N(N_) {}
typedef signed_half_int value_type;
double degree(signed_half_int x) const;
double coupling_3j_phase(signed_half_int a, signed_half_int b, signed_half_int c) const;
// ...
private:
int N;
};
- To support non-abelian anyons the
degree()
function needs to return double
, not int
. All uses of the degree
function need to be audited.
- Strip out the Projection mechanism. Instead replace it with a group chain mechanism for more general projections. For example, from {$SU(2)$} we can do the common decomposition {$U(1) \subset SU(2)$}, but we can also do {$D_\inf \subset SU(2)$}, or {$Z_3 \subset SU(2)$}. There might be more than one decomposition {$Z_2 \subset SU(2)$}. So we need to be able to define a (named?) projection from one group to another.
- Rationalize the number of different functions required for the coupling coefficients. We need:
- degree (quantum dimension)
- 3-j phase
- 6-j symbol
- 9-j symbol, but can have a default implementation
- adjoint
- Clebsch-Gordan expansion
- coupling coefficients for
inner()
, dot()
, cross()
, outer()
- Uni10 will require phase factors for changing the direction of legs, hopefully this can re-use the 3-j phase.
- many others .....
- Implement 'small string' optimization for QuantumNumber
- Not sure if uni-10 wil use the braid group representations. But the idea is that each symmetry has a set of allowed representations of the braid group. So a model can select a specific representation for the operators, which means that the {$R$} matrix and other objects associated with swap gates and braiding can be calculated algebraically.