working version of Q extensions

This commit is contained in:
Florian Stecker
2022-04-25 14:09:45 -05:00
parent 1f92d1af9c
commit 51f7b98ccb
7 changed files with 111 additions and 193 deletions

54
qext.c
View File

@@ -1,15 +1,26 @@
#include "qext.h"
const int qext_coefficients[QEXT_RANK+1] = {36, 0, -8, 0, 1};
int qext_rank;
mpq_t *qext_coefficient;
#include <stdio.h>
#include <malloc.h>
#define LOOP(i,n) for(int i = 0; i < (n); i++)
void qext_setup(int rank, const int *coeffs)
{
qext_rank = rank;
qext_coefficient = malloc(rank*sizeof(mpq_t));
LOOP(i, rank) {
mpq_init(qext_coefficient[i]);
mpq_set_si(qext_coefficient[i], -coeffs[i], coeffs[rank]);
}
}
void qext_init(qext_number x)
{
x->rk = QEXT_RANK;
x->rk = qext_rank;
x->a = malloc(x->rk*sizeof(mpq_t));
LOOP(i, x->rk) mpq_init(x->a[i]);
}
@@ -32,6 +43,13 @@ void qext_set_int(qext_number x, int y)
mpq_set_ui(x->a[i], 0, 1);
}
void qext_set_q(qext_number x, mpq_t y)
{
mpq_set(x->a[0], y);
for(int i = 1; i < x->rk; i++)
mpq_set_ui(x->a[i], 0, 1);
}
void qext_add(qext_number result, qext_number x, qext_number y)
{
LOOP(i, x->rk) mpq_add(result->a[i], x->a[i], y->a[i]);
@@ -83,21 +101,13 @@ int qext_cmp(qext_number x, qext_number y)
void qext_mul(qext_number out, qext_number x, qext_number y)
{
static initialized = 0;
static mpq_t result[2*x->rk-1];
static mpq_t coefficient[x->rk];
static mpq_t tmp;
mpq_t result[2*x->rk-1];
mpq_t tmp;
if(!initialized) {
run_before = 1;
mpq_init(tmp);
LOOP(i, 2*x->rk-1) {
mpq_init(result[i]);
}
LOOP(i, x->rk) {
mpq_init(coefficient[i]);
mpq_set_si(coefficient[i], -qext_coefficients[i], qext_coefficients[x->rk]);
}
mpq_init(tmp);
LOOP(i, 2*x->rk-1) {
mpq_init(result[i]);
mpq_set_ui(result[i], 0, 1);
}
// rk*rk multiplications + (rk-1)*rk multiplications with fixed coefficients
@@ -105,8 +115,6 @@ void qext_mul(qext_number out, qext_number x, qext_number y)
// degree 2: 4+2
// degree 4: 16+12, including 6 times 0*
LOOP(i, 2*x->rk-1) mpq_set_ui(result[i], 0, 1);
LOOP(i, x->rk) LOOP(j, x->rk) {
mpq_mul(tmp, x->a[i], y->a[j]);
mpq_add(result[i+j], result[i+j], tmp);
@@ -114,18 +122,18 @@ void qext_mul(qext_number out, qext_number x, qext_number y)
for(int i = x->rk-2; i >= 0; i--) {
LOOP(j, x->rk) {
mpq_mul(tmp, coefficient[j], result[x->rk+i]);
mpq_mul(tmp, qext_coefficient[j], result[x->rk+i]);
mpq_add(result[i+j], result[i+j], tmp);
}
}
LOOP(i, x->rk) mpq_set(out->a[i], result[i]);
/*
LOOP(i, 2*x->rk-1) mpq_clear(result[i]);
LOOP(i, x->rk) mpq_clear(coefficient[i]);
mpq_clear(tmp);
*/
}
void qext_div(qext_number out, qext_number x, qext_number y);
void qext_div(qext_number out, qext_number x, qext_number y)
{
// todo: implement this by solving a linear system
}