]> www.ginac.de Git - cln.git/commitdiff
* src/polynomial/cl_UP_gen.h (gen_minus): Fix case where first
authorRichard Kreckel <kreckel@ginac.de>
Sat, 27 Dec 2003 19:04:30 +0000 (19:04 +0000)
committerRichard Kreckel <kreckel@ginac.de>
Sat, 27 Dec 2003 19:04:30 +0000 (19:04 +0000)
          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>.

ChangeLog
src/polynomial/elem/cl_UP_MI.h
src/polynomial/elem/cl_UP_gen.h
src/polynomial/elem/cl_UP_number.h

index 9e2fc93d5c694ef9ff34fbfba49a417403badd48..7cef72023e0efadbbb6edd44ee3ffc0e264f3546 100644 (file)
--- a/ChangeLog
+++ b/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.
index 19b6236e073b4c2a6926e8e4996a866d2e6f08ac..7e4faf330ba17f7b6503c1f2f5605a1d1ffb3b21 100644 (file)
@@ -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());
index 6d80faa2bd0a6ff83a83c06b2d26fe891e799955..6379a4c99d35ddd8049f40d3806511f6233ac3da 100644 (file)
@@ -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());
index ea78cb8bc1bcdf3b1d8813ea1cdea05bd88a0cd5..861e97669aed75c92620271b26c1512e40477982 100644 (file)
@@ -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));