argument is zero.
* src/polynomial/cl_UP_MI.h (modint_minus): Likewise.
* src/polynomial/cl_UP_number.h (num_minus): Likewise.
Reported by Munagala Ramanath <amberarrow@yahoo.com>.
+2003-12-27 Richard B. Kreckel <kreckel@ginac.de>
+
+ * src/polynomial/cl_UP_gen.h (gen_minus): Fix case where first
+ argument is zero.
+ * src/polynomial/cl_UP_MI.h (modint_minus): Likewise.
+ * src/polynomial/cl_UP_number.h (num_minus): Likewise.
+ Reported by Munagala Ramanath <amberarrow@yahoo.com>.
+
2003-12-02 Richard B. Kreckel <kreckel@ginac.de>
* examples/perfnum.cc: update to presumed 40th Mersenne prime.
return _cl_UP(UPR, cl_null_GV_I);
}}
+static const _cl_UP modint_uminus (cl_heap_univpoly_ring* UPR, const _cl_UP& x)
+{{
+ DeclarePoly(cl_GV_MI,x);
+ var cl_heap_modint_ring* R = TheModintRing(UPR->basering());
+ var sintL xlen = x.length();
+ if (xlen == 0)
+ return _cl_UP(UPR, x);
+ // Now xlen > 0.
+ // Negate. No normalization necessary, since the degree doesn't change.
+ var sintL i = xlen-1;
+ var _cl_MI hicoeff = R->_uminus(x[i]);
+ if (R->_zerop(hicoeff)) cl_abort();
+ var cl_GV_MI result = cl_GV_MI(xlen,R);
+ result[i] = hicoeff;
+ for (i-- ; i >= 0; i--)
+ result[i] = R->_uminus(x[i]);
+ return _cl_UP(UPR, result);
+}}
+
static const _cl_UP modint_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const _cl_UP& y)
{{
DeclarePoly(cl_GV_MI,x);
var cl_heap_modint_ring* R = TheModintRing(UPR->basering());
var sintL xlen = x.length();
var sintL ylen = y.length();
- if (xlen == 0)
- return _cl_UP(UPR, y);
if (ylen == 0)
return _cl_UP(UPR, x);
+ if (xlen == 0)
+ return modint_uminus(UPR, _cl_UP(UPR, y));
// Now xlen > 0, ylen > 0.
if (xlen > ylen) {
var cl_GV_MI result = cl_GV_MI(xlen,R);
return _cl_UP(UPR, cl_null_GV_I);
}}
-static const _cl_UP modint_uminus (cl_heap_univpoly_ring* UPR, const _cl_UP& x)
-{{
- DeclarePoly(cl_GV_MI,x);
- var cl_heap_modint_ring* R = TheModintRing(UPR->basering());
- var sintL xlen = x.length();
- if (xlen == 0)
- return _cl_UP(UPR, x);
- // Now xlen > 0.
- // Negate. No normalization necessary, since the degree doesn't change.
- var sintL i = xlen-1;
- var _cl_MI hicoeff = R->_uminus(x[i]);
- if (R->_zerop(hicoeff)) cl_abort();
- var cl_GV_MI result = cl_GV_MI(xlen,R);
- result[i] = hicoeff;
- for (i-- ; i >= 0; i--)
- result[i] = R->_uminus(x[i]);
- return _cl_UP(UPR, result);
-}}
-
static const _cl_UP modint_one (cl_heap_univpoly_ring* UPR)
{
var cl_heap_modint_ring* R = TheModintRing(UPR->basering());
return _cl_UP(UPR, cl_null_SV_ringelt);
}}
+static const _cl_UP gen_uminus (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();
+ if (xlen == 0)
+ return _cl_UP(UPR, x);
+ // Now xlen > 0.
+ // 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();
+ 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--)
+ init1(_cl_ring_element, result[i]) (R->_uminus(x[i]));
+ return _cl_UP(UPR, result);
+}}
+
static const _cl_UP gen_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const _cl_UP& y)
{{
DeclarePoly(cl_SV_ringelt,x);
var cl_heap_ring* R = TheRing(UPR->basering());
var sintL xlen = x.length();
var sintL ylen = y.length();
- if (xlen == 0)
- return _cl_UP(UPR, y);
if (ylen == 0)
return _cl_UP(UPR, x);
+ if (xlen == 0)
+ return gen_uminus(UPR,_cl_UP(UPR, y));
// Now xlen > 0, ylen > 0.
if (xlen > ylen) {
var cl_SV_ringelt result = cl_SV_ringelt(cl_make_heap_SV_ringelt_uninit(xlen));
return _cl_UP(UPR, cl_null_SV_ringelt);
}}
-static const _cl_UP gen_uminus (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();
- if (xlen == 0)
- return _cl_UP(UPR, x);
- // Now xlen > 0.
- // 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();
- 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--)
- init1(_cl_ring_element, result[i]) (R->_uminus(x[i]));
- return _cl_UP(UPR, result);
-}}
-
static const _cl_UP gen_one (cl_heap_univpoly_ring* UPR)
{
var cl_heap_ring* R = TheRing(UPR->basering());
return _cl_UP(UPR, cl_null_SV_number);
}}
+static const _cl_UP num_uminus (cl_heap_univpoly_ring* UPR, const _cl_UP& x)
+{{
+ DeclarePoly(cl_SV_number,x);
+ var cl_number_ring_ops<cl_number>& ops = *TheNumberRing(UPR->basering())->ops;
+ var sintL xlen = x.length();
+ if (xlen == 0)
+ return _cl_UP(UPR, x);
+ // Now xlen > 0.
+ // Negate. No normalization necessary, since the degree doesn't change.
+ var sintL i = xlen-1;
+ var cl_number hicoeff = ops.uminus(x[i]);
+ if (ops.zerop(hicoeff)) cl_abort();
+ var cl_SV_number result = cl_SV_number(cl_make_heap_SV_number_uninit(xlen));
+ init1(cl_number, result[i]) (hicoeff);
+ for (i-- ; i >= 0; i--)
+ init1(cl_number, result[i]) (ops.uminus(x[i]));
+ return _cl_UP(UPR, result);
+}}
+
static const _cl_UP num_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const _cl_UP& y)
{{
DeclarePoly(cl_SV_number,x);
var cl_number_ring_ops<cl_number>& ops = *TheNumberRing(UPR->basering())->ops;
var sintL xlen = x.length();
var sintL ylen = y.length();
- if (xlen == 0)
- return _cl_UP(UPR, y);
if (ylen == 0)
return _cl_UP(UPR, x);
+ if (xlen == 0)
+ return num_uminus(UPR, _cl_UP(UPR, y));
// Now xlen > 0, ylen > 0.
if (xlen > ylen) {
var cl_SV_number result = cl_SV_number(cl_make_heap_SV_number_uninit(xlen));
return _cl_UP(UPR, cl_null_SV_number);
}}
-static const _cl_UP num_uminus (cl_heap_univpoly_ring* UPR, const _cl_UP& x)
-{{
- DeclarePoly(cl_SV_number,x);
- var cl_number_ring_ops<cl_number>& ops = *TheNumberRing(UPR->basering())->ops;
- var sintL xlen = x.length();
- if (xlen == 0)
- return _cl_UP(UPR, x);
- // Now xlen > 0.
- // Negate. No normalization necessary, since the degree doesn't change.
- var sintL i = xlen-1;
- var cl_number hicoeff = ops.uminus(x[i]);
- if (ops.zerop(hicoeff)) cl_abort();
- var cl_SV_number result = cl_SV_number(cl_make_heap_SV_number_uninit(xlen));
- init1(cl_number, result[i]) (hicoeff);
- for (i-- ; i >= 0; i--)
- init1(cl_number, result[i]) (ops.uminus(x[i]));
- return _cl_UP(UPR, result);
-}}
-
static const _cl_UP num_one (cl_heap_univpoly_ring* UPR)
{
var cl_SV_number result = cl_SV_number(cl_make_heap_SV_number_uninit(1));