19 std::vector<long> poly;
25 for (
long i = poly.size() - 1; i >= 0; i--)
36 for (
long i=0; i<poly.size(); i++)
37 printf(
" %ld", poly[i]);
43 for (
long i = poly.size() - 1; i >= 0; i--)
44 if (poly[i] != 0) nmod_poly_set_coeff_ui(mMinPoly, i, poly[i]);
46 fq_zech_ctx_init_modulus(
mContext, mMinPoly,
"a");
47 fq_nmod_ctx_init_modulus(
mBigContext, mMinPoly,
"a");
51 nmod_poly_clear(mMinPoly);
74 std::vector<long>& poly)
const
79 fq_zech_get_fq_nmod(f, &a,
mContext);
80 long deg = nmod_poly_degree(f);
82 for (
long i = deg; i >= 0; i--) poly[i] = nmod_poly_get_coeff_ui(f, i);
88 const std::vector<long>& poly)
const
96 for (
long i=0; i<poly.size(); i++)
97 printf(
"%ld ", poly[i]);
100 for (
long i = poly.size() - 1; i >= 0; i--)
103 if (a == 0)
continue;
105 nmod_poly_set_coeff_ui(f, i, a);
108 printf(
" result before reduction = ");
114 printf(
" result = ");
120 printf(
" zech result = %lu",
result.value);
147 std::vector<long> poly;
157 std::vector<long> poly;
210 if (f.value > g.value)
return GT;
211 if (f.value < g.value)
return LT;
M2::ARingGFFlint — small GF(p^k) via FLINT Zech-logarithm tables.
#define FLINT_RAND_INIT(x)
#define FLINT_RAND_CLEAR(x)
void getGenerator(ElementType &result_gen) const
void getSmallIntegerCoefficients(const ElementType &a, std::vector< long > &poly) const
void text_out(buffer &o) const
fq_zech_struct ElementType
void copy(ElementType &result, const ElementType &a) const
bool promote(const Ring *Rf, const ring_elem f, ElementType &result) const
ARingGFFlint(const PolynomialRing &R, const ring_elem a)
void elem_text_out(buffer &o, const ElementType &a, bool p_one=true, bool p_plus=false, bool p_parens=false) const
void eval(const RingMap *map, const ElementType &f, int first_var, ring_elem &result) const
fq_nmod_ctx_t mBigContext
flint_rand_t mRandomState
bool is_zero(const ElementType &f) const
const RingElement * mPrimitiveElement
const PolynomialRing & originalRing() const
void set_from_long(ElementType &result, long a) const
int compare_elems(const ElementType &f, const ElementType &g) const
void lift_to_original_ring(ring_elem &result, const ElementType &f) const
long characteristic() const
ElementType mCachedGenerator
void fromSmallIntegerCoefficients(ElementType &result, const std::vector< long > &poly) const
const PolynomialRing & mOriginalRing
bool lift(const Ring *Rg, const ElementType &f, ring_elem &result) const
ring_elem fromSmallIntegerCoefficients(const std::vector< long > &coeffs, int var) const
virtual const PolyRing * getNumeratorRing() const
Abstract base for the engine's polynomial-ring hierarchy.
virtual void elem_text_out(buffer &o, const ring_elem f, bool p_one=true, bool p_plus=false, bool p_parens=false) const =0
long characteristic() const
virtual ring_elem copy(const ring_elem f) const =0
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
static RingElement * make_raw(const Ring *R, ring_elem f)
bool getSmallIntegerCoefficients(std::vector< long > &result_coeffs) const
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
const ring_elem elem(int i) const
const Ring * get_ring() const
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define newarray_atomic(T, len)
Concrete commutative PolyRing — standard polynomial ring inheriting from PolyRingFlat.
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
RingMap — engine representation of a ring homomorphism.