WIP polynomials etc.

Former-commit-id: 546c139f9cce0686c1b3065403beaa769bd7b55b
This commit is contained in:
Marek Nečada 2019-10-29 14:00:09 +02:00
parent 6b5b773d0b
commit c0ec5389e0
2 changed files with 77 additions and 0 deletions

View File

@ -7,6 +7,57 @@
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) <= (y)) ? (x) : (y))
void mpzs_init(mpzs_t x) {
mpz_init(x->_1);
mpz_init(x->_2);
}
void mpzs_clear(mpzs_t x) {
mpz_clear(x->_1);
mpz_clear(x->_2);
}
void mpzs_set(mpzs_t x, const mpzs_t y) {
mpz_set(x->_1, y->_1);
mpz_set(x->_2, y->_2);
}
// Compares the square-rooted part of mpzs_t, so we can use it as a key in a search tree.
static int mpzs_cmp2(void *op1, void *op2) {
mpz_cmpabs(((mpzs_t) op1)->_2, ((mpzs_t) op2)->_2);
}
void mpqs_clear_num(mpqs_t x) {
TODO;
}
void mpqs_init(mpqs_t x) {
x->sz = 0;
x->nt = 0;
mpz_init_set_ui(x->den, 1);
}
void mpqs_clear(mpqs_t x) {
mpqs_clear_num(mpqs_t x);
mpz_clear(x->den);
x->sz = -1
x->nt = 0;
}
static void mpqs_num_add_elem(mpqs_t q, mpzs_t n) {
mpzs_t *n_owned;
QPMS_CRASHING_MALLOC(n_owned, sizeof(mpzs_t));
mpzs_init(*n_owned);
mpzs_set(*n_owned, n);
void *added =
tsearch(n_owned, &(t->nt), mpzs_cmp2);
QPMS_ENSURE(added, "Failed to add numerator element. Memory error?");
QPMS_ENSURE(added != n_owned, "FIXME another numerator elements with the same square root found."); // TODO how to handle this?
}
// Auxillary function to set a mpq_t to 0/1
static inline void mpq_zero(mpq_t q) {

View File

@ -136,6 +136,32 @@ int qpqs_get_elem_si(long *numerator, unsigned long *denominator, const qpqs_t *
void qpqs_clear(qpqs_t *p);
/// Type representing a number of form \f$ a \sqrt{b}; a \in \ints, b \in \nats \f$.
typedef struct _qp_mpzs {
mpz_t _1; ///< The integer factor \f$ a \f$.
mpz_t _2; ///< The square-rooted factor \f$ b \f$. Always positive.
} mpzs_t[1];
void mpzs_init(mpzs_t x);
void mpzs_clear(mpzs_t x);
void mpzs_set(mpzs_t x, const mpzs_t y);
/// Sum of square roots of rational numbers.
/// Represented as \f$ \sum_s a_i \sqrt{b_i} / d \f$.
typedef struct _qp_mpqs {
int sz; ///< Used size of the numtree.
void *nt; ///< Numerator tree.
mpz_t den; ///< Denominator. Always positive.
} mpqs_t[1];
void mpqs_init(mpqs_t x);
void mpqs_clear(mpqs_t x);
void mpqs_add(mpqs_t sum, const mpqs_t addend1, const mpqs_t addend2);
void mpqs_sub(mpqs_t difference, const mpqs_t minuend, const mpqs_t substrahend);
void mpqs_mul(mpqs_t product, const mpqs_t multiplier, const mpqs_t multiplicand);
void mpqs_div(mpqs_t quotient, const mpqs_t dividend, const mpqs_t divisor);
void mpqs_clear_num(mpqs_t x); ///< Sets the numerator to zero, clearing the numerator tree.
/// A type representing a polynomial with rational coefficients times an optional factor \f$ \sqrt{1-x^2} \f$.
typedef struct qpq_legendroid_t {