Macaulay2 Engine
Loading...
Searching...
No Matches

◆ translate_gbvector_to_vec_QQ()

vec PolyRing::translate_gbvector_to_vec_QQ ( const FreeModule * F,
const gbvector * v,
const ring_elem denom ) const

Definition at line 2576 of file poly.cpp.

2579{
2580 if (v == nullptr) return nullptr;
2581
2582 GBRing *GR = get_gb_ring();
2583
2584 int firstcomp = v->comp;
2585 int lastcomp = firstcomp;
2586 for (const gbvector *t = v->next; t != nullptr; t = t->next)
2587 {
2588 if (firstcomp > t->comp)
2589 firstcomp = t->comp;
2590 else if (lastcomp < t->comp)
2591 lastcomp = t->comp;
2592 }
2593
2594 Nterm **vec_comps = newarray(Nterm *, lastcomp - firstcomp + 1);
2595 Nterm **vec_last = newarray(Nterm *, lastcomp - firstcomp + 1);
2596 for (int i = 0; i < lastcomp - firstcomp + 1; i++)
2597 {
2598 vec_comps[i] = nullptr;
2599 vec_last[i] = nullptr;
2600 }
2601
2602 // Now make a list of Nterm's, copy gbvectors in (except comps)
2603 for (const gbvector *t = v; t != nullptr; t = t->next)
2604 {
2605 Nterm *s = new_term();
2606 GR->gbvector_get_lead_monomial(F, t, s->monom);
2607 s->coeff = globalQQ->fraction(t->coeff, denom);
2608 s->next = nullptr;
2609 int x = t->comp - firstcomp;
2610 if (!vec_comps[x])
2611 {
2612 vec_comps[x] = s;
2613 vec_last[x] = s;
2614 }
2615 else
2616 {
2617 vec_last[x]->next = s;
2618 vec_last[x] = s;
2619 }
2620 }
2621
2622 // Now create the vecs
2623 vec result = nullptr;
2624 for (int x = 0; x < lastcomp - firstcomp + 1; x++)
2625 if (vec_comps[x])
2626 {
2627 vec w = make_vec(x + firstcomp - 1, vec_comps[x]);
2628 w->next = result;
2629 result = w;
2630 }
2631
2632 // Finally, free vec_last, vec_comps;
2633 freemem(vec_comps);
2634 freemem(vec_last);
2635
2636 return result;
2637}
const RingQQ * globalQQ
Definition aring.cpp:24
void gbvector_get_lead_monomial(const FreeModule *F, const gbvector *f, int *result)
Definition gbring.cpp:528
ring_elem fraction(ring_elem top, ring_elem bottom) const
Nterm * new_term() const
Definition poly.cpp:146
virtual GBRing * get_gb_ring() const
Definition polyring.hpp:276
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
void freemem(void *s)
Definition m2-mem.cpp:103
void size_t s
Definition m2-mem.cpp:271
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define newarray(T, len)
Definition newdelete.hpp:82
volatile int x
Nterm * next
Definition ringelem.hpp:157
gbvector * next
Definition gbring.hpp:80
int comp
Definition gbring.hpp:82

References gbvector::comp, freemem(), FreeModule, GBRing::gbvector_get_lead_monomial(), PolynomialRing::get_gb_ring(), globalQQ, Ring::make_vec(), new_term(), newarray, gbvector::next, Nterm::next, result(), s, and x.

Referenced by translate_gbvector_to_vec(), and translate_gbvector_to_vec_denom().