X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=src%2Fpolynomial%2Felem%2Fcl_UP_gen.h;h=e827afdc571af218265a1ace457e7aacad22c14b;hb=8b3d91dec77438c0fe679b10869ab29e6cdeba58;hp=6379a4c99d35ddd8049f40d3806511f6233ac3da;hpb=dbba474f3ebac0ecf1824ec68512bad6d2abe087;p=cln.git diff --git a/src/polynomial/elem/cl_UP_gen.h b/src/polynomial/elem/cl_UP_gen.h index 6379a4c..e827afd 100644 --- a/src/polynomial/elem/cl_UP_gen.h +++ b/src/polynomial/elem/cl_UP_gen.h @@ -2,7 +2,7 @@ #include "cln/SV_ringelt.h" #include "cln/integer.h" -#include "cln/abort.h" +#include "cln/exception.h" namespace cln { @@ -56,7 +56,7 @@ static void gen_fprint (cl_heap_univpoly_ring* UPR, std::ostream& stream, const } }} -static cl_boolean gen_equal (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const _cl_UP& y) +static bool gen_equal (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const _cl_UP& y) {{ DeclarePoly(cl_SV_ringelt,x); DeclarePoly(cl_SV_ringelt,y); @@ -64,11 +64,11 @@ static cl_boolean gen_equal (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const var sintL xlen = x.length(); var sintL ylen = y.length(); if (!(xlen == ylen)) - return cl_false; + return false; for (var sintL i = xlen-1; i >= 0; i--) if (!R->_equal(x[i],y[i])) - return cl_false; - return cl_true; + return false; + return true; }} static const _cl_UP gen_zero (cl_heap_univpoly_ring* UPR) @@ -76,15 +76,15 @@ static const _cl_UP gen_zero (cl_heap_univpoly_ring* UPR) return _cl_UP(UPR, cl_null_SV_ringelt); } -static cl_boolean gen_zerop (cl_heap_univpoly_ring* UPR, const _cl_UP& x) +static bool gen_zerop (cl_heap_univpoly_ring* UPR, const _cl_UP& x) { unused UPR; { DeclarePoly(cl_SV_ringelt,x); var sintL xlen = x.length(); if (xlen == 0) - return cl_true; + return true; else - return cl_false; + return false; }} static const _cl_UP gen_plus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const _cl_UP& y) @@ -142,7 +142,7 @@ static const _cl_UP gen_uminus (cl_heap_univpoly_ring* UPR, const _cl_UP& x) // Negate. No normalization necessary, since the degree doesn't change. var sintL i = xlen-1; var _cl_ring_element hicoeff = R->_uminus(x[i]); - if (R->_zerop(hicoeff)) cl_abort(); + if (R->_zerop(hicoeff)) throw runtime_exception(); var cl_SV_ringelt result = cl_SV_ringelt(cl_make_heap_SV_ringelt_uninit(xlen)); init1(_cl_ring_element, result[i]) (hicoeff); for (i-- ; i >= 0; i--) @@ -253,7 +253,7 @@ static const _cl_UP gen_mul (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const } // Normalize (not necessary in integral domains). //gen_normalize(R,result,len); - if (R->_zerop(result[len-1])) cl_abort(); + if (R->_zerop(result[len-1])) throw runtime_exception(); return _cl_UP(UPR, result); }} @@ -292,7 +292,7 @@ static const _cl_UP gen_square (cl_heap_univpoly_ring* UPR, const _cl_UP& x) init1(_cl_ring_element, result[0]) (R->_square(x[0])); // Normalize (not necessary in integral domains). //gen_normalize(R,result,len); - if (R->_zerop(result[len-1])) cl_abort(); + if (R->_zerop(result[len-1])) throw runtime_exception(); return _cl_UP(UPR, result); }} @@ -312,7 +312,7 @@ static const _cl_UP gen_exptpos (cl_heap_univpoly_ring* UPR, const _cl_UP& x, co static const _cl_UP gen_scalmul (cl_heap_univpoly_ring* UPR, const cl_ring_element& x, const _cl_UP& y) { - if (!(UPR->basering() == x.ring())) cl_abort(); + if (!(UPR->basering() == x.ring())) throw runtime_exception(); { DeclarePoly(cl_SV_ringelt,y); var cl_heap_ring* R = TheRing(UPR->basering()); @@ -326,7 +326,7 @@ static const _cl_UP gen_scalmul (cl_heap_univpoly_ring* UPR, const cl_ring_eleme init1(_cl_ring_element, result[i]) (R->_mul(x,y[i])); // Normalize (not necessary in integral domains). //gen_normalize(R,result,ylen); - if (R->_zerop(result[ylen-1])) cl_abort(); + if (R->_zerop(result[ylen-1])) throw runtime_exception(); return _cl_UP(UPR, result); }} @@ -337,9 +337,20 @@ static sintL gen_degree (cl_heap_univpoly_ring* UPR, const _cl_UP& x) return (sintL) x.length() - 1; }} +static sintL gen_ldegree (cl_heap_univpoly_ring* UPR, const _cl_UP& x) +{{ DeclarePoly(cl_SV_ringelt,x); + var cl_heap_ring* R = TheRing(UPR->basering()); + var sintL xlen = x.length(); + for (sintL i = 0; i < xlen; i++) { + if (!R->_zerop(x[i])) + return i; + } + return -1; +}} + static const _cl_UP gen_monomial (cl_heap_univpoly_ring* UPR, const cl_ring_element& x, uintL e) { - if (!(UPR->basering() == x.ring())) cl_abort(); + if (!(UPR->basering() == x.ring())) throw runtime_exception(); var cl_heap_ring* R = TheRing(UPR->basering()); if (R->_zerop(x)) return _cl_UP(UPR, cl_null_SV_ringelt); @@ -374,8 +385,8 @@ static const _cl_UP gen_create (cl_heap_univpoly_ring* UPR, sintL deg) static void gen_set_coeff (cl_heap_univpoly_ring* UPR, _cl_UP& x, uintL index, const cl_ring_element& y) {{ DeclareMutablePoly(cl_SV_ringelt,x); - if (!(UPR->basering() == y.ring())) cl_abort(); - if (!(index < x.length())) cl_abort(); + if (!(UPR->basering() == y.ring())) throw runtime_exception(); + if (!(index < x.length())) throw runtime_exception(); x[index] = y; }} @@ -396,7 +407,7 @@ static const cl_ring_element gen_eval (cl_heap_univpoly_ring* UPR, const _cl_UP& // Else compute (...(x[len-1]*y+x[len-2])*y ...)*y + x[0]. DeclarePoly(cl_SV_ringelt,x); var cl_heap_ring* R = TheRing(UPR->basering()); - if (!(y.ring() == R)) cl_abort(); + if (!(y.ring() == R)) throw runtime_exception(); var uintL len = x.length(); if (len==0) return R->zero(); @@ -436,6 +447,7 @@ static cl_univpoly_modulops gen_modulops = { static cl_univpoly_polyops gen_polyops = { gen_degree, + gen_ldegree, gen_monomial, gen_coeff, gen_create, @@ -448,8 +460,26 @@ class cl_heap_gen_univpoly_ring : public cl_heap_univpoly_ring { SUBCLASS_cl_heap_univpoly_ring() public: // Constructor. - cl_heap_gen_univpoly_ring (const cl_ring& r) - : cl_heap_univpoly_ring (r, &gen_setops, &gen_addops, &gen_mulops, &gen_modulops, &gen_polyops) {} + cl_heap_gen_univpoly_ring (const cl_ring& r); + // Destructor + ~cl_heap_gen_univpoly_ring () {} }; +static void cl_heap_gen_univpoly_ring_destructor (cl_heap* pointer) +{ + (*(cl_heap_gen_univpoly_ring*)pointer).~cl_heap_gen_univpoly_ring(); +} + +cl_class cl_class_gen_univpoly_ring = { + cl_heap_gen_univpoly_ring_destructor, + cl_class_flags_univpoly_ring +}; + +// Constructor. +inline cl_heap_gen_univpoly_ring::cl_heap_gen_univpoly_ring (const cl_ring& r) + : cl_heap_univpoly_ring (r, &gen_setops, &gen_addops, &gen_mulops, &gen_modulops, &gen_polyops) +{ + type = &cl_class_gen_univpoly_ring; +} + } // namespace cln