Browse Source

* 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>.
master
Richard Kreckel 21 years ago
parent
commit
dbba474f3e
  1. 8
      ChangeLog
  2. 42
      src/polynomial/elem/cl_UP_MI.h
  3. 42
      src/polynomial/elem/cl_UP_gen.h
  4. 42
      src/polynomial/elem/cl_UP_number.h

8
ChangeLog

@ -1,3 +1,11 @@
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.

42
src/polynomial/elem/cl_UP_MI.h

@ -143,6 +143,25 @@ static const _cl_UP modint_plus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, co
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);
@ -150,10 +169,10 @@ static const _cl_UP modint_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, c
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);
@ -191,25 +210,6 @@ static const _cl_UP modint_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, c
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());

42
src/polynomial/elem/cl_UP_gen.h

@ -131,6 +131,25 @@ static const _cl_UP gen_plus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const
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);
@ -138,10 +157,10 @@ static const _cl_UP gen_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, cons
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));
@ -175,25 +194,6 @@ static const _cl_UP gen_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, cons
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());

42
src/polynomial/elem/cl_UP_number.h

@ -131,6 +131,25 @@ static const _cl_UP num_plus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, const
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);
@ -138,10 +157,10 @@ static const _cl_UP num_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, cons
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));
@ -175,25 +194,6 @@ static const _cl_UP num_minus (cl_heap_univpoly_ring* UPR, const _cl_UP& x, cons
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));

Loading…
Cancel
Save