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

◆ translate_gbvector_to_vec()

vec PolyRing::translate_gbvector_to_vec ( const FreeModule * F,
const gbvector * v ) const
virtual

Implements PolynomialRing.

Definition at line 2639 of file poly.cpp.

2641{
2642 if (v == nullptr) return nullptr;
2643
2644 if (getCoefficients() == globalQQ)
2645 return translate_gbvector_to_vec_QQ(F, v, globalZZ->one());
2646 GBRing *GR = get_gb_ring();
2647
2648 int firstcomp = v->comp;
2649 int lastcomp = firstcomp;
2650 for (const gbvector *t = v->next; t != nullptr; t = t->next)
2651 {
2652 if (firstcomp > t->comp)
2653 firstcomp = t->comp;
2654 else if (lastcomp < t->comp)
2655 lastcomp = t->comp;
2656 }
2657
2658 Nterm **vec_comps = newarray(Nterm *, lastcomp - firstcomp + 1);
2659 Nterm **vec_last = newarray(Nterm *, lastcomp - firstcomp + 1);
2660 for (int i = 0; i < lastcomp - firstcomp + 1; i++)
2661 {
2662 vec_comps[i] = nullptr;
2663 vec_last[i] = nullptr;
2664 }
2665
2666 // Now make a list of Nterm's, copy gbvectors in (except comps)
2667 for (const gbvector *t = v; t != nullptr; t = t->next)
2668 {
2669 Nterm *s = new_term();
2670 GR->gbvector_get_lead_monomial(F, t, s->monom);
2671 s->coeff = t->coeff;
2672 s->next = nullptr;
2673 int x = t->comp - firstcomp;
2674 if (!vec_comps[x])
2675 {
2676 vec_comps[x] = s;
2677 vec_last[x] = s;
2678 }
2679 else
2680 {
2681 vec_last[x]->next = s;
2682 vec_last[x] = s;
2683 }
2684 }
2685
2686 // Now create the vecs
2687 vec result = nullptr;
2688 for (int x = 0; x < lastcomp - firstcomp + 1; x++)
2689 if (vec_comps[x])
2690 {
2691 vec w = make_vec(x + firstcomp - 1, vec_comps[x]);
2692 w->next = result;
2693 result = w;
2694 }
2695
2696 // Finally, free vec_last, vec_comps;
2697 freemem(vec_comps);
2698 freemem(vec_last);
2699
2700 return result;
2701}
const RingQQ * globalQQ
Definition aring.cpp:24
void gbvector_get_lead_monomial(const FreeModule *F, const gbvector *f, int *result)
Definition gbring.cpp:528
Nterm * new_term() const
Definition poly.cpp:146
vec translate_gbvector_to_vec_QQ(const FreeModule *F, const gbvector *v, const ring_elem denom) const
Definition poly.cpp:2576
virtual GBRing * get_gb_ring() const
Definition polyring.hpp:276
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
ring_elem one() const
Definition ring.hpp:357
RingZZ * globalZZ
Definition relem.cpp:13
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(), PolynomialRing::getCoefficients(), globalQQ, globalZZ, Ring::make_vec(), new_term(), newarray, gbvector::next, Nterm::next, result(), s, translate_gbvector_to_vec_QQ(), and x.

Referenced by translate_gbvector_to_vec_denom().