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

◆ merge()

hm_elem * HermiteComputation::merge ( hm_elem * f,
hm_elem * g )
private

Definition at line 124 of file hermite.cpp.

125{
126 if (g == nullptr) return f;
127 if (f == nullptr) return g;
128 hm_elem head;
129 hm_elem *result = &head;
130 hm_elem *h;
131 while (1) switch (compare_elems(f, g))
132 {
133 case 1:
134 result->next = g;
135 result = result->next;
136 g = g->next;
137 if (g == nullptr)
138 {
139 result->next = f;
140 return head.next;
141 }
142 break;
143 case 0:
144 // In this case, we remove one, and re-insert:
145 if (mpz_cmp(f->f->coeff.get_mpz(), g->f->coeff.get_mpz()) == 0)
146 {
147 vec f1 = globalZZ->copy_vec(f->f);
148 vec f2 = globalZZ->copy_vec(f->fsyz);
149 globalZZ->subtract_vec_to(g->f, f1);
151 }
152 else
153 {
154 vec f1 = globalZZ->copy_vec(f->f);
155 vec f2 = globalZZ->copy_vec(f->fsyz);
156 globalZZ->add_vec_to(g->f, f1);
157 globalZZ->add_vec_to(g->fsyz, f2);
158 }
159
160 h = g;
161 // We need to reset the lead term
162 if (g->f != nullptr) mpz_abs(h->lead, g->f->coeff.get_mpz());
163 g = g->next;
164 insert(h);
165 if (g == nullptr)
166 {
167 result->next = f;
168 return head.next;
169 }
170 // Now fall through to merge f into the result:
171 [[fallthrough]];
172 case -1:
173 result->next = f;
174 result = result->next;
175 f = f->next;
176 if (f == nullptr)
177 {
178 result->next = g;
179 return head.next;
180 }
181 break;
182 }
183}
void insert(hm_elem *p)
Definition hermite.cpp:42
int compare_elems(hm_elem *f, hm_elem *g) const
Definition hermite.cpp:116
void subtract_vec_to(vec &v, vec &w) const
void add_vec_to(vec &v, vec &w) const
vec copy_vec(const vecterm *v) const
Definition ring-vecs.cpp:91
RingZZ * globalZZ
Definition relem.cpp:13
VALGRIND_MAKE_MEM_DEFINED & result(result)
vec f
Definition hermite.hpp:46
mpz_t lead
Definition hermite.hpp:45
hm_elem * next
Definition hermite.hpp:44
vec fsyz
Definition hermite.hpp:47

References compare_elems(), hm_elem::f, hm_elem::fsyz, globalZZ, insert(), hm_elem::lead, hm_elem::next, and result().

Referenced by sort().