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

◆ reduce()

void HermiteComputation::reduce ( hm_elem *& p,
hm_elem * q )
private

Definition at line 210 of file hermite.cpp.

211{
212 // compute (u,v) s.t. u lead(p) + v lead(q) = gcd
213 // set p <- u*p + v*q;
214 // set q <- lead(q)/gcd * p - lead(p)/gcd * q
215 // DOn't forget to also reset the 'lead' fields!
216 ring_elem u, v;
217 ring_elem g = globalZZ->gcd_extended(p->f->coeff, q->f->coeff, u, v);
218 ring_elem a = globalZZ->divide(q->f->coeff, g); // exact
219 ring_elem b = globalZZ->divide(p->f->coeff, g); // exact
221
222 vec p1 = globalZZ->mult_vec(u, p->f);
223 vec p2 = globalZZ->mult_vec(v, q->f);
224 globalZZ->add_vec_to(p1, p2);
225
226 vec syz1 = globalZZ->mult_vec(u, p->fsyz);
227 vec syz2 = globalZZ->mult_vec(v, q->fsyz);
228 globalZZ->add_vec_to(syz1, syz2);
229
230 vec q1 = globalZZ->mult_vec(a, p->f);
231 vec q2 = globalZZ->mult_vec(b, q->f);
232 globalZZ->add_vec_to(q1, q2);
233
234 vec qsyz1 = globalZZ->mult_vec(a, p->fsyz);
235 vec qsyz2 = globalZZ->mult_vec(b, q->fsyz);
236 globalZZ->add_vec_to(qsyz1, qsyz2);
237
238 globalZZ->remove_vec(p->f);
239 globalZZ->remove_vec(q->f);
240 globalZZ->remove_vec(p->fsyz);
242 globalZZ->remove(a);
243 globalZZ->remove(b);
244 globalZZ->remove(g);
245 globalZZ->remove(u);
246 globalZZ->remove(v);
247
248 // Now that the arithmetic has been done, put back into 'p', 'q':
249 p->f = p1;
250 p->fsyz = syz1;
251 mpz_set(p->lead, p->f->coeff.get_mpz());
252
253 q->f = q1;
254 q->fsyz = qsyz1;
255 if (q->f != nullptr) mpz_abs(q->lead, q->f->coeff.get_mpz());
256
257 insert(q);
258}
void insert(hm_elem *p)
Definition hermite.cpp:42
vec mult_vec(int n, vec v) const
void negate_to(ring_elem &f) const
Definition ring.cpp:210
void remove_vec(vec v) const
void add_vec_to(vec &v, vec &w) const
virtual void remove(ring_elem &f) const
Definition ZZ.cpp:194
virtual ring_elem divide(const ring_elem f, const ring_elem g) const
Definition ZZ.cpp:304
ring_elem gcd_extended(const ring_elem f, const ring_elem g, ring_elem &u, ring_elem &v) const
Definition ZZ.cpp:369
RingZZ * globalZZ
Definition relem.cpp:13
int p
int p1
vec f
Definition hermite.hpp:46
mpz_t lead
Definition hermite.hpp:45
vec fsyz
Definition hermite.hpp:47

References hm_elem::f, hm_elem::fsyz, globalZZ, insert(), hm_elem::lead, p, and p1.

Referenced by start_computation().