compute complex traces

This commit is contained in:
Florian Stecker
2022-06-14 14:22:22 +02:00
parent 15681c308b
commit 244784794d
11 changed files with 446 additions and 59 deletions

View File

@@ -1,33 +1,17 @@
#include "generators.h"
#include "mat.h"
#define LOOP(i,n) for(int i = 0; i < (n); i++)
void generators_triangle_reflection_generic(mat *gen, NUMBER rho1, NUMBER rho2, NUMBER rho3, mpq_t q)
void generators_triangle_reflection_generic(mat *gen, NUMBER rho1, NUMBER rho2, NUMBER rho3, NUMBER q)
{
NUMBER b1,c1,a2,c2,a3,b3;
mpq_t qinv;
NUMBER tmp;
NUMBER qinv;
TYPE t = GETTYPE(rho1);
INIT(b1,t);INIT(c1,t);INIT(a2,t);INIT(c2,t);INIT(a3,t);INIT(b3,t);
// qinv = q^{-1}
mpq_init(qinv);
mpq_inv(qinv, q);
// c1 = rho2 q, a2 = rho3 q, b3 = rho1 q, b1 = c2 = a3 = 1/q
SET_ZERO(c1);
SET_Q(c1, q);
SET_Q(a2, q);
SET_Q(b3, q);
MUL(c1, c1, rho2);
MUL(a2, a2, rho3);
MUL(b3, b3, rho1);
SET_INT(b1, 1);
SET_INT(c2, 1);
SET_INT(a3, 1);
SET_Q(b1, qinv);
SET_Q(c2, qinv);
SET_Q(a3, qinv);
INIT(tmp, t);
INIT(qinv, t);
INV(qinv, q);
LOOP(i, 3) {
mat_init(gen[i], 3, t);
@@ -37,18 +21,21 @@ void generators_triangle_reflection_generic(mat *gen, NUMBER rho1, NUMBER rho2,
}
}
NEG(*mat_ref(gen[0], 1, 0), b1);
NEG(*mat_ref(gen[0], 2, 0), c1);
NEG(*mat_ref(gen[1], 0, 1), a2);
NEG(*mat_ref(gen[1], 2, 1), c2);
NEG(*mat_ref(gen[2], 0, 2), a3);
NEG(*mat_ref(gen[2], 1, 2), b3);
MUL(tmp, q, rho1);
NEG(*mat_ref(gen[2], 1, 2), tmp);
MUL(tmp, q, rho2);
NEG(*mat_ref(gen[0], 2, 0), tmp);
MUL(tmp, q, rho3);
NEG(*mat_ref(gen[1], 0, 1), tmp);
CLEAR(b1);CLEAR(c1);CLEAR(a2);CLEAR(c2);CLEAR(a3);CLEAR(b3);
mpq_clear(qinv);
NEG(*mat_ref(gen[1], 2, 1), qinv);
NEG(*mat_ref(gen[2], 0, 2), qinv);
NEG(*mat_ref(gen[0], 1, 0), qinv);
CLEAR(tmp);
CLEAR(qinv);
}
int generators_triangle_reflection_group(mat *gen, int p1, int p2, int p3, int q1, int q2, int q3, mpq_t t)
{
int p[3] = {p1, p2, p3};
@@ -103,9 +90,59 @@ int generators_triangle_reflection_group(mat *gen, int p1, int p2, int p3, int q
}
}
generators_triangle_reflection_generic(gen, rho[0], rho[1], rho[2], t);
NUMBER param;
INIT(param, type);
SET_Q(param, t);
generators_triangle_reflection_generic(gen, rho[0], rho[1], rho[2], param);
LOOP(i, 3) CLEAR(rho[i]);
CLEAR(param);
return 1;
}
int generators_triangle_reflection_group_555_complex(mat *gen, int q1, int q2, int q3, mpq_t treal, mpq_t timag)
{
int q[3] = {q1, q2, q3};
NUMBER rho[3];
LOOP(i, 3) INIT(rho[i], QT_GAUSS_SQRT5);
// compute rho1, rho2, rho3
LOOP(i, 3) {
if(q[i] == 1) {
// 4cos(pi/5)^2 = 3/2 + 1/2*sqrt(5)
mpq_set_si(rho[i]->a[0], 3, 2);
mpq_set_si(rho[i]->a[1], 7, 12);
mpq_set_si(rho[i]->a[2], 0, 1);
mpq_set_si(rho[i]->a[3], -1, 24);
} else if(q[i] == 2) {
// 4cos(pi/5)^2 = 3/2 - 1/2*sqrt(5)
mpq_set_si(rho[i]->a[0], 3, 2);
mpq_set_si(rho[i]->a[1], -7, 12);
mpq_set_si(rho[i]->a[2], 0, 1);
mpq_set_si(rho[i]->a[3], 1, 24);
} else {
return 0;
}
}
NUMBER param;
INIT(param, QT_GAUSS_SQRT5);
mpq_set(param->a[0], treal);
mpq_set_si(param->a[1], -1, 6);
mpq_mul(param->a[1], param->a[1], timag);
mpq_set_si(param->a[2], 0, 1);
mpq_set_si(param->a[3], 1, 12);
mpq_mul(param->a[3], param->a[3], timag);
generators_triangle_reflection_generic(gen, rho[0], rho[1], rho[2], param);
LOOP(i, 3) CLEAR(rho[i]);
CLEAR(param);
return 1;
}