38 case 0: rdm(0,1) = rdm(2,3) = 1; rdm(1,0) = rdm(3,2) = -1;
break;
39 case 1: rdm(0,1) = rdm(1,0) = -1; rdm(2,3) = rdm(3,2) = 1;
break;
40 case 2: rdm(0,3) = rdm(1,2) = rdm(2,1) = rdm(3,0) = 1;
break;
41 case 3: rdm(0,0) = rdm(2,2) = -1; rdm(1,1) = rdm(3,3) = 1;
break;
42 case 4: rdm(0,0) = rdm(3,3) = -1; rdm(1,1) = rdm(2,2) = 1;
break;
43 case 5: rdm(0,2) = rdm(2,0) = 1; rdm(1,3) = rdm(3,1) = -1;
break;
44 case 6: rdm(0,1) = rdm(1,0) = rdm(2,3) = rdm(3,2) = 1;
break;
45 case 7: rdm(0,3) = rdm(2,1) = 1; rdm(1,2) = rdm(3,0) = -1;
break;
46 case 8: rdm(0,1) = rdm(3,2) = 1; rdm(1,0) = rdm(2,3) = -1;
break;
47 case 9: rdm(0,2) = rdm(1,3) = -1; rdm(2,0) = rdm(3,1) = 1;
break;
48 case 10: rdm(0,2) = rdm(3,1) = 1; rdm(1,3) = rdm(2,0) = -1;
break;
49 case 11: rdm(0,2) = rdm(1,3) = rdm(2,0) = rdm(3,1) = -1;
break;
50 case 12: rdm(0,0) = rdm(1,1) = -1; rdm(2,2) = rdm(3,3) = 1;
break;
51 case 13: rdm(0,3) = rdm(3,0) = -1; rdm(1,2) = rdm(2,1) = 1;
break;
52 case 14: rdm(0,3) = rdm(1,2) = -1; rdm(2,1) = rdm(3,0) = 1;
break;
53 case 15: rdm(0,0) = rdm(1,1) = rdm(2,2) = rdm(3,3) = 1;
break;
55 "Index (i = " + std::to_string(i)
56 +
" out of range: 0 <= i <= 15");
break;
65 R = boost::numeric::ublas::identity_matrix<double>(4);
69 double mr, mg, mb, eps;
72 auto mult = [&](
short i) {
77 matrix_t tmp = boost::numeric::ublas::prod(Ms,
getRDM(i))+boost::numeric::ublas::prod(
getRDM(i),Ms);
82 P =
vector_t({ mult(1), mult(2), mult(3)});
83 E =
vector_t({ mult(4), mult(5), mult(6)});
84 B =
vector_t({-mult(7), -mult(8), -mult(9)});
85 mr = boost::numeric::ublas::inner_prod(E, B);
86 mg = boost::numeric::ublas::inner_prod(B, P);
88 transform(Ms, 0, 0.5 * std::atan2(mg,mr), R, invR);
92 P =
vector_t({ mult(1), mult(2), mult(3)});
93 E =
vector_t({ mult(4), mult(5), mult(6)});
94 B =
vector_t({-mult(7), -mult(8), -mult(9)});
97 transform(Ms, 7, 0.5 * std::atan2(b(2), b(1)), R, invR);
101 P =
vector_t({ mult(1), mult(2), mult(3)});
102 E =
vector_t({ mult(4), mult(5), mult(6)});
103 B =
vector_t({-mult(7), -mult(8), -mult(9)});
106 transform(Ms, 9, -0.5 * std::atan2(b(0), b(1)), R, invR);
110 P =
vector_t({ mult(1), mult(2), mult(3)});
111 E =
vector_t({ mult(4), mult(5), mult(6)});
112 B =
vector_t({-mult(7), -mult(8), -mult(9)});
113 mr = boost::numeric::ublas::inner_prod(E, B);
119 if (std::fabs(mr) < std::fabs(b(1))) {
120 transform(Ms, 2, 0.5 * std::atanh(mr / b(1)), R, invR);
122 transform(Ms, 2, 0.5 * std::atanh(b(1) / mr), R, invR);
126 P =
vector_t({ mult(1), mult(2), mult(3)});
127 E =
vector_t({ mult(4), mult(5), mult(6)});
128 B =
vector_t({-mult(7), -mult(8), -mult(9)});
131 mr = boost::numeric::ublas::inner_prod(E, B);
132 mg = boost::numeric::ublas::inner_prod(B, P);
133 mb = boost::numeric::ublas::inner_prod(E, P);
135 double P2 = boost::numeric::ublas::inner_prod(P, P);
136 double E2 = boost::numeric::ublas::inner_prod(E, E);
139 transform(Ms, 0, 0.25 * std::atan2(mb,0.5 * (E2 - P2)), R, invR);
142 P(0) = mult(1); P(2) = mult(3);
144 transform(Ms, 8, -0.5 * std::atan2(P(2), P(0)), R, invR);
214 double s0 = 0.25 * ( sigma(0, 0) + sigma(1, 1) + sigma(2, 2) + sigma(3, 3) );
215 double s1 = 0.25 * (-sigma(0, 0) + sigma(1, 1) + sigma(2, 2) - sigma(3, 3) );
216 double s2 = 0.5 * ( sigma(0, 2) - sigma(1, 3) );
217 double s3 = 0.5 * ( sigma(0, 1) + sigma(2, 3) );
218 double s4 = 0.5 * ( sigma(0, 1) - sigma(2, 3) );
219 double s5 = -0.5 * ( sigma(0, 3) + sigma(1, 2) );
220 double s6 = 0.25 * ( sigma(0, 0) - sigma(1, 1) + sigma(2, 2) - sigma(3, 3) );
221 double s7 = 0.5 * ( sigma(0, 2) + sigma(1, 3) );
222 double s8 = 0.25 * ( sigma(0, 0) + sigma(1, 1) - sigma(2, 2) - sigma(3, 3) );
223 double s9 = 0.5 * ( sigma(0, 3) - sigma(1, 2) );
225 vector_t P(3); P(0) = s1; P(1) = s2; P(2) = s3;
226 vector_t E(3); E(0) = s4; E(1) = s5; E(2) = s6;
227 vector_t B(3); B(0) = s7; B(1) = s8; B(2) = s9;
229 double mr = boost::numeric::ublas::inner_prod(E, B);
230 double mg = boost::numeric::ublas::inner_prod(B, P);
231 double mb = boost::numeric::ublas::inner_prod(E, P);
238 double eps = std::atan2(mg, mr);
244 double eps = std::atan2(b(2), b(1));
250 double eps = - std::atan2(b(0), b(1));
256 double eps = - std::atanh(mr / b(1));
262 double eps = 0.5 * std::atan2(2.0 * mb,
263 boost::numeric::ublas::inner_prod(E, E) -
264 boost::numeric::ublas::inner_prod(P, P));
270 double eps = - std::atan2(P(2), P(0));
277 "Case " + std::to_string(i) +