00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 class SU_Generators {
00017 public:
00018 vector<mdp_matrix> lambda;
00019 int n;
00020 int ngenerators;
00021 SU_Generators(int n) {
00022 this->n = n;
00023 this->ngenerators = (n*n-1);
00024 lambda.resize(ngenerators);
00025
00026 for(int a=0; a<ngenerators; a++)
00027 lambda[a] = build_matrix(a) ;
00028 }
00029
00030 mdp_matrix build_matrix(int a) {
00031
00032 int pos1 = (n*(n-1)/2);
00033 int pos2 = (n*(n-1));
00034 mdp_matrix mat(n,n);
00035 mdp_complex mult=0;
00036 vector<mdp_complex> vec(ngenerators);
00037 for(int i=0; i<ngenerators; i++)
00038 vec[i] = (i==a)?1:0;
00039
00040 for(int i=0, a=0; i<n; i++) {
00041 mat(i,i) = 0;
00042 for(int j=i+1; j<n; j++) {
00043 mat(i,j) = 0.5*(vec[a] - I*vec[pos1+a]);
00044 mat(j,i) = 0.5*(vec[a] + I*vec[pos1+a]);
00045 a++;
00046 }
00047 }
00048 for(int i=0; i<n-1; i++) {
00049 mult = vec[pos2+i] * (1.0/sqrt(2.+2./(1.+i))/(1.+i));
00050 for(int j=0; j<i+1; j++) {
00051 mat(j,j) += mult;
00052 }
00053 mat(i+1,i+1) -= (1+i)*mult;
00054 }
00055 return I * sqrt(2) * mat;
00056 }
00057 };
00058