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

◆ gcd_extended()

ring_elem PolyRing::gcd_extended ( const ring_elem f,
const ring_elem g,
ring_elem & u,
ring_elem & v ) const

Definition at line 1083 of file poly.cpp.

1088{
1089 u = from_long(1);
1090 ring_elem result = copy(f);
1091
1092 if (is_zero(g))
1093 {
1094 v = from_long(0);
1095 return result;
1096 }
1097 ring_elem v1 = ZERO_RINGELEM;
1098 ring_elem v3 = copy(g);
1099 ring_elem t1, t3;
1100 ring_elem temp1, temp2, temp3;
1101 while (!is_zero(v3))
1102 {
1103 ring_elem q;
1104 t3 = remainderAndQuotient(result, v3, q);
1105
1106 // The following is: t1 = u - q*v1
1107 temp1 = mult(q, v1);
1108 subtract_to(u, temp1);
1109 t1 = u;
1110
1111 u = v1;
1112 result = v3;
1113 v1 = t1;
1114 v3 = t3;
1115 }
1116
1117 // make 'result' monic. (and divide 'u' by this as well)
1118 if (!is_zero(result))
1119 {
1120 Nterm *t = result;
1121 ring_elem c = K_->invert(t->coeff);
1123 mult_coeff_to(c, u);
1124 }
1125
1126 // The following is v = (result - f*u)/g
1127 temp1 = mult(f, u);
1128 temp2 = subtract(result, temp1);
1129 temp3 = remainderAndQuotient(temp2, g, v);
1130
1131 return result;
1132}
virtual ring_elem from_long(long n) const
Definition poly.cpp:169
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
Definition poly.cpp:821
virtual void mult_coeff_to(ring_elem a, ring_elem &f) const
Definition poly.cpp:799
virtual ring_elem copy(const ring_elem f) const
Definition poly.cpp:653
virtual ring_elem remainderAndQuotient(const ring_elem f, const ring_elem g, ring_elem &quot) const
Definition poly.cpp:1163
virtual ring_elem subtract(const ring_elem f, const ring_elem g) const
Definition poly.cpp:773
virtual bool is_zero(const ring_elem f) const
Definition poly.cpp:487
const Ring * K_
Definition polyring.hpp:123
void subtract_to(ring_elem &f, const ring_elem &g) const
Definition ring.cpp:206
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ZERO_RINGELEM
Definition ring.hpp:677
ring_elem coeff
Definition ringelem.hpp:158

References Nterm::coeff, copy(), from_long(), is_zero(), PolynomialRing::K_, mult(), mult_coeff_to(), remainderAndQuotient(), result(), subtract(), Ring::subtract_to(), and ZERO_RINGELEM.