Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
Header file cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
fredrik-johansson committed May 6, 2021
1 parent a929bc1 commit 80f5791
Show file tree
Hide file tree
Showing 10 changed files with 411 additions and 261 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1,3 +1,4 @@
libantic*
Makefile
build/
antic
275 changes: 14 additions & 261 deletions nf_elem.h
Expand Up @@ -144,44 +144,7 @@ int nf_elem_is_one(const nf_elem_t a, const nf_t nf)
return fmpq_poly_is_one(a->elem);
}

NF_ELEM_INLINE
int nf_elem_is_gen(const nf_elem_t a, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
fmpz_t t1, t2;
int is_gen;

/* fast path */
if (fmpz_equal(LNF_ELEM_DENREF(a), nf->pol->coeffs + 1))
return fmpz_cmpabs(LNF_ELEM_DENREF(a), nf->pol->coeffs) == 0
&& fmpz_sgn(LNF_ELEM_DENREF(a)) == -fmpz_sgn(nf->pol->coeffs);

/* slow path */
fmpz_init(t1);
fmpz_init(t2);

fmpz_mul(t1, LNF_ELEM_NUMREF(a), nf->pol->coeffs + 1);
fmpz_mul(t2, LNF_ELEM_DENREF(a), nf->pol->coeffs);
fmpz_neg(t1, t1);

is_gen = fmpz_equal(t1, t2);

fmpz_clear(t1);
fmpz_clear(t2);

return is_gen;
} else if (nf->flag & NF_QUADRATIC)
{
const fmpz * const anum = QNF_ELEM_NUMREF(a);

return fmpz_equal(anum + 1, QNF_ELEM_DENREF(a))
&& fmpz_is_zero(anum);
} else
return fmpq_poly_length(NF_ELEM(a)) == 2
&& fmpz_equal(NF_ELEM(a)->coeffs + 1, NF_ELEM(a)->den)
&& fmpz_is_zero(NF_ELEM(a)->coeffs);
}
FLINT_DLL int nf_elem_is_gen(const nf_elem_t a, const nf_t nf);

NF_ELEM_INLINE
int nf_elem_is_integer(const nf_elem_t a, const nf_t nf)
Expand Down Expand Up @@ -292,36 +255,11 @@ int nf_elem_equal_fmpq(const nf_elem_t a, const fmpq_t b, const nf_t nf)
******************************************************************************/

FLINT_DLL void nf_elem_print_pretty(const nf_elem_t a,
FLINT_DLL void nf_elem_print_pretty(const nf_elem_t a,
const nf_t nf, const char * var);

NF_ELEM_INLINE
char * nf_elem_get_str_pretty(const nf_elem_t a,
const char * var, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
const fmpz * const den = LNF_ELEM_DENREF(a);
const fmpz * const num = LNF_ELEM_NUMREF(a);
slong len = 1 - fmpz_is_zero(num);

return _fmpq_poly_get_str_pretty(num, den, len, var);
}
else if (nf->flag & NF_QUADRATIC)
{
const fmpz * const den = QNF_ELEM_DENREF(a);
const fmpz * const num = QNF_ELEM_NUMREF(a);
slong len = 3;

while (len != 0 && fmpz_is_zero(num + len - 1))
len--;

return _fmpq_poly_get_str_pretty(num, den, len, var);
} else
{
return fmpq_poly_get_str_pretty(NF_ELEM(a), var);
}
}
FLINT_DLL char * nf_elem_get_str_pretty(const nf_elem_t a,
const char * var, const nf_t nf);

/******************************************************************************
Expand Down Expand Up @@ -459,53 +397,7 @@ void nf_elem_set_fmpq(nf_elem_t a, const fmpq_t c, const nf_t nf)
fmpq_poly_set_fmpq(NF_ELEM(a), c);
}

NF_ELEM_INLINE
void nf_elem_set_fmpq_poly(nf_elem_t a, const fmpq_poly_t pol, const nf_t nf)
{
if (fmpq_poly_length(pol) >= fmpq_poly_length(nf->pol))
{
fmpq_poly_t r;
fmpq_poly_init(r);
fmpq_poly_rem(r, pol, nf->pol);
nf_elem_set_fmpq_poly(a, r, nf);
fmpq_poly_clear(r);
return;
}

if (nf->flag & NF_LINEAR)
{
if (pol->length == 0)
{
fmpz_zero(LNF_ELEM_NUMREF(a));
fmpz_one(LNF_ELEM_DENREF(a));
} else if (pol->length == 1)
{
fmpz_set(LNF_ELEM_NUMREF(a), fmpq_poly_numref(pol));
fmpz_set(LNF_ELEM_DENREF(a), fmpq_poly_denref(pol));
}
} else if (nf->flag & NF_QUADRATIC)
{
fmpz * const anum = QNF_ELEM_NUMREF(a);

if (pol->length == 0)
{
fmpz_zero(anum);
fmpz_zero(anum + 1);
fmpz_one(QNF_ELEM_DENREF(a));
} else if (pol->length == 1)
{
fmpz_zero(anum + 1);
fmpz_set(anum, fmpq_poly_numref(pol));
fmpz_set(QNF_ELEM_DENREF(a), fmpq_poly_denref(pol));
} else
{
fmpz_set(anum, fmpq_poly_numref(pol));
fmpz_set(anum + 1, fmpq_poly_numref(pol) + 1);
fmpz_set(QNF_ELEM_DENREF(a), fmpq_poly_denref(pol));
}
} else
fmpq_poly_set(NF_ELEM(a), pol);
}
FLINT_DLL void nf_elem_set_fmpq_poly(nf_elem_t a, const fmpq_poly_t pol, const nf_t nf);

/******************************************************************************
Expand All @@ -521,27 +413,8 @@ FLINT_DLL
void nf_elem_get_fmpz_mat_row(fmpz_mat_t M, const slong i, fmpz_t den,
const nf_elem_t b, const nf_t nf);

NF_ELEM_INLINE
void nf_elem_get_fmpq_poly(fmpq_poly_t pol, const nf_elem_t a, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
fmpq_poly_set_fmpz(pol, LNF_ELEM_NUMREF(a));
fmpz_set(fmpq_poly_denref(pol), LNF_ELEM_DENREF(a));
} else if (nf->flag & NF_QUADRATIC)
{
const fmpz * const anum = QNF_ELEM_NUMREF(a);

fmpq_poly_fit_length(pol, 2);
_fmpq_poly_set_length(pol, 2);
_fmpz_vec_set(pol->coeffs, anum, 2);
_fmpq_poly_normalise(pol);
fmpz_set(pol->den, QNF_ELEM_DENREF(a));
} else
{
fmpq_poly_set(pol, NF_ELEM(a));
}
}
FLINT_DLL
void nf_elem_get_fmpq_poly(fmpq_poly_t pol, const nf_elem_t a, const nf_t nf);

FLINT_DLL
void _nf_elem_get_nmod_poly(nmod_poly_t pol, const nf_elem_t a, const nf_t nf);
Expand Down Expand Up @@ -612,57 +485,11 @@ void nf_elem_set_den(nf_elem_t b, fmpz_t d, const nf_t nf)
}
}

NF_ELEM_INLINE
void nf_elem_get_coeff_fmpq(fmpq_t a, const nf_elem_t b,
slong i, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
if (i > 0)
fmpq_zero(a);
else
{
fmpz_set(fmpq_numref(a), LNF_ELEM_NUMREF(b));
fmpz_set(fmpq_denref(a), LNF_ELEM_DENREF(b));
}
} else if (nf->flag & NF_QUADRATIC)
{
const fmpz * const bnum = QNF_ELEM_NUMREF(b);

if (i > 2) /* element may be unreduced */
fmpq_zero(a);
else
{
fmpz_set(fmpq_numref(a), bnum + i);
fmpz_set(fmpq_denref(a), QNF_ELEM_DENREF(b));
}

fmpq_canonicalise(a);
} else
fmpq_poly_get_coeff_fmpq(a, NF_ELEM(b), i);
}
FLINT_DLL
void nf_elem_get_coeff_fmpq(fmpq_t a, const nf_elem_t b, slong i, const nf_t nf);

NF_ELEM_INLINE
void nf_elem_get_coeff_fmpz(fmpz_t a, const nf_elem_t b,
slong i, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
if (i > 0)
fmpz_zero(a);
else
fmpz_set(a, LNF_ELEM_NUMREF(b));
} else if (nf->flag & NF_QUADRATIC)
{
const fmpz * const bnum = QNF_ELEM_NUMREF(b);

if (i > 2) /* element may be unreduced */
fmpz_zero(a);
else
fmpz_set(a, bnum + i);
} else
fmpq_poly_get_coeff_fmpz(a, NF_ELEM(b), i);
}
FLINT_DLL
void nf_elem_get_coeff_fmpz(fmpz_t a, const nf_elem_t b, slong i, const nf_t nf);

NF_ELEM_INLINE
int nf_elem_den_is_one(const nf_elem_t a, const nf_t nf)
Expand All @@ -679,52 +506,8 @@ int nf_elem_den_is_one(const nf_elem_t a, const nf_t nf)
}
}

NF_ELEM_INLINE
void _nf_elem_set_coeff_num_fmpz(nf_elem_t a, slong i, const fmpz_t b, const nf_t nf)
{
if (i > 2*(fmpq_poly_degree(nf->pol) - 1))
{
flint_printf("Degree out of range\n");
flint_abort();
}

if (nf->flag & NF_LINEAR)
{
fmpz_set(LNF_ELEM_NUMREF(a), b);
nf_elem_canonicalise(a, nf);
} else if (nf->flag & NF_QUADRATIC)
{
fmpz_set(QNF_ELEM_NUMREF(a) + i, b);
nf_elem_canonicalise(a, nf);
} else
{
slong len = NF_ELEM(a)->length;
const int replace = (i < len && !fmpz_is_zero(NF_ELEM(a)->coeffs + i));

if (!replace && fmpz_is_zero(b))
return;

if (i + 1 > len)
{
fmpq_poly_fit_length(NF_ELEM(a), i + 1);
_fmpq_poly_set_length(NF_ELEM(a), i + 1);
flint_mpn_zero((mp_ptr) NF_ELEM(a)->coeffs + len, (i + 1) - len);
}

if (*NF_ELEM(a)->den == WORD(1))
{
fmpz_set(NF_ELEM(a)->coeffs + i, b);
if (replace)
_fmpq_poly_normalise(NF_ELEM(a));
}
else
{
fmpz_set(NF_ELEM(a)->coeffs + i, b);
if (replace)
fmpq_poly_canonicalise(NF_ELEM(a));
}
}
}
FLINT_DLL
void _nf_elem_set_coeff_num_fmpz(nf_elem_t a, slong i, const fmpz_t b, const nf_t nf);

/******************************************************************************
Expand Down Expand Up @@ -901,37 +684,7 @@ void nf_elem_sub(nf_elem_t a, const nf_elem_t b,
fmpq_poly_sub_can(NF_ELEM(a), NF_ELEM(b), NF_ELEM(c), 1);
}

NF_ELEM_INLINE
void nf_elem_mul_gen(nf_elem_t a, const nf_elem_t b, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
fmpz * den = LNF_ELEM_DENREF(a);
fmpz * num = LNF_ELEM_NUMREF(a);
_fmpq_mul(num, den, LNF_ELEM_NUMREF(b), LNF_ELEM_DENREF(b), fmpq_poly_numref(nf->pol), fmpq_poly_numref(nf->pol) + 1);
_fmpq_canonicalise(num, den);
fmpz_neg(num, num);
}
else if (nf->flag & NF_QUADRATIC)
{
fmpz * anum = QNF_ELEM_NUMREF(a);
fmpz const * bnum = QNF_ELEM_NUMREF(b);

fmpz_set(anum + 2, bnum + 1);
fmpz_set(anum + 1, bnum);
fmpz_zero(anum);
fmpz_set(QNF_ELEM_DENREF(a), QNF_ELEM_DENREF(b));

nf_elem_reduce(a, nf);
nf_elem_canonicalise(a, nf);
}
else
{
fmpq_poly_shift_left(NF_ELEM(a), NF_ELEM(b), 1);
nf_elem_reduce(a, nf);
nf_elem_canonicalise(a, nf);
}
}
FLINT_DLL void nf_elem_mul_gen(nf_elem_t a, const nf_elem_t b, const nf_t nf);

FLINT_DLL void _nf_elem_mul(nf_elem_t a, const nf_elem_t b,
const nf_elem_t c, const nf_t nf);
Expand Down
46 changes: 46 additions & 0 deletions nf_elem/get_coeff_fmpq.c
@@ -0,0 +1,46 @@
/*=============================================================================
This file is part of Antic.
Antic is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See <http://www.gnu.org/licenses/>.
=============================================================================*/
/******************************************************************************
Copyright (C) 2014 William Hart
******************************************************************************/

#include "nf_elem.h"

void nf_elem_get_coeff_fmpq(fmpq_t a, const nf_elem_t b,
slong i, const nf_t nf)
{
if (nf->flag & NF_LINEAR)
{
if (i > 0)
fmpq_zero(a);
else
{
fmpz_set(fmpq_numref(a), LNF_ELEM_NUMREF(b));
fmpz_set(fmpq_denref(a), LNF_ELEM_DENREF(b));
}
} else if (nf->flag & NF_QUADRATIC)
{
const fmpz * const bnum = QNF_ELEM_NUMREF(b);

if (i > 2) /* element may be unreduced */
fmpq_zero(a);
else
{
fmpz_set(fmpq_numref(a), bnum + i);
fmpz_set(fmpq_denref(a), QNF_ELEM_DENREF(b));
}

fmpq_canonicalise(a);
} else
fmpq_poly_get_coeff_fmpq(a, NF_ELEM(b), i);
}

0 comments on commit 80f5791

Please sign in to comment.