#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 sqrho1, NUMBER sqrho2, NUMBER sqrho3, NUMBER t) { NUMBER tmp; NUMBER tinv; TYPE type = GETTYPE(sqrho1); INIT(tmp, type); INIT(tinv, type); INV(tinv, t); LOOP(i, 3) { mat_init(gen[i], 3, type); mat_zero(gen[i]); LOOP(j, 3) { SET_INT(*mat_ref(gen[i], j, j), i == j ? 1 : -1); } } MUL(tmp, t, sqrho1); NEG(*mat_ref(gen[2], 1, 2), tmp); NEG(*mat_ref(gen[0], 2, 0), sqrho2); NEG(*mat_ref(gen[1], 0, 1), sqrho3); MUL(tmp, tinv, sqrho1); NEG(*mat_ref(gen[1], 2, 1), tmp); NEG(*mat_ref(gen[2], 0, 2), sqrho2); NEG(*mat_ref(gen[0], 1, 0), sqrho3); CLEAR(tmp); CLEAR(tinv); } // warning: this is not compatible anymore! 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}; int q[3] = {q1, q2, q3}; TYPE type; LOOP(i, 3) if(p[i] < 2 || p[i] > 6) return 0; #ifdef QEXT type = QT_TRIVIAL; LOOP(i, 3) if(p[i] == 5) type = QT_SQRT5; #else LOOP(i, 3) if(p[i] == 5) return 0; #endif NUMBER rho[3]; LOOP(i, 3) INIT(rho[i], type); // compute rho1, rho2, rho3 LOOP(i, 3) { if(p[i] == 2 && q[i] == 1) { SET_INT(rho[i], 0); } else if(p[i] == 3 && q[i] == 1) { SET_INT(rho[i], 1); } else if(p[i] == 4 && q[i] == 1) { SET_INT(rho[i], 2); } else if(p[i] == 4 && q[i] == 2) { SET_INT(rho[i], 0); } else if(p[i] == 6 && q[i] == 1) { SET_INT(rho[i], 3); } else if(p[i] == 6 && q[i] == 2) { SET_INT(rho[i], 1); } else if(p[i] == 6 && q[i] == 3) { SET_INT(rho[i], 0); #ifdef QEXT } else if(p[i] == 5 && q[i] == 1) { mpq_set_si(rho[i]->a[0], 3, 2); mpq_set_si(rho[i]->a[1], 1, 2); } else if(p[i] == 5 && q[i] == 2) { mpq_set_si(rho[i]->a[0], 3, 2); mpq_set_si(rho[i]->a[1], -1, 2); #endif } else { return 0; } } 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 sqrho[3]; LOOP(i, 3) INIT(sqrho[i], QT_GAUSS_SQRT5); // compute sqrho1, sqrho2, sqrho3 LOOP(i, 3) { if(q[i] == 1) { // 2cos(pi/5) = 1/2 + 1/2*sqrt(5) = 1/2 + 7/12 a - 1/24 a^3 mpq_set_si(sqrho[i]->a[0], 1, 2); mpq_set_si(sqrho[i]->a[1], 7, 12); mpq_set_si(sqrho[i]->a[2], 0, 1); mpq_set_si(sqrho[i]->a[3], -1, 24); } else if(q[i] == 2) { // 2cos(pi/5) = -1/2 + 1/2*sqrt(5) mpq_set_si(sqrho[i]->a[0], -1, 2); mpq_set_si(sqrho[i]->a[1], 7, 12); mpq_set_si(sqrho[i]->a[2], 0, 1); mpq_set_si(sqrho[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, sqrho[0], sqrho[1], sqrho[2], param); LOOP(i, 3) CLEAR(sqrho[i]); CLEAR(param); return 1; }