From dbba474f3ebac0ecf1824ec68512bad6d2abe087 Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Sat, 27 Dec 2003 19:04:30 +0000 Subject: [PATCH] * 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 . --- ChangeLog | 8 ++++++ src/polynomial/elem/cl_UP_MI.h | 42 +++++++++++++++--------------- src/polynomial/elem/cl_UP_gen.h | 42 +++++++++++++++--------------- src/polynomial/elem/cl_UP_number.h | 42 +++++++++++++++--------------- 4 files changed, 71 insertions(+), 63 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9e2fc93..7cef720 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-12-27 Richard B. Kreckel + + * 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 . + 2003-12-02 Richard B. Kreckel * examples/perfnum.cc: update to presumed 40th Mersenne prime. diff --git a/src/polynomial/elem/cl_UP_MI.h b/src/polynomial/elem/cl_UP_MI.h index 19b6236..7e4faf3 100644 --- a/src/polynomial/elem/cl_UP_MI.h +++ b/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()); diff --git a/src/polynomial/elem/cl_UP_gen.h b/src/polynomial/elem/cl_UP_gen.h index 6d80faa..6379a4c 100644 --- a/src/polynomial/elem/cl_UP_gen.h +++ b/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()); diff --git a/src/polynomial/elem/cl_UP_number.h b/src/polynomial/elem/cl_UP_number.h index ea78cb8..861e976 100644 --- a/src/polynomial/elem/cl_UP_number.h +++ b/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& 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& 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& 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));