+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)) 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--)
+ init1(_cl_ring_element, result[i]) (R->_uminus(x[i]));
+ return _cl_UP(UPR, result);
+}}
+