- for ( ; deg>=0; --deg ) {
- p.set_coeff(deg, UPR->basering()->zero());
+
+ p.erase(p.begin() + i, p.end());
+}
+
+// END COPY FROM UPOLY.HPP
+
+static void expt_pos(const umodpoly& a, unsigned int q, umodpoly& b)
+{
+ throw runtime_error("expt_pos: not implemented!");
+ // code below is not correct!
+// b.clear();
+// if ( a.empty() ) return;
+// b.resize(degree(a)*q+1, a[0].ring()->zero());
+// cl_MI norm = recip(a[0]);
+// umodpoly an = a;
+// for ( size_t i=0; i<an.size(); ++i ) {
+// an[i] = an[i] * norm;
+// }
+// b[0] = a[0].ring()->one();
+// for ( size_t i=1; i<b.size(); ++i ) {
+// for ( size_t j=1; j<i; ++j ) {
+// b[i] = b[i] + ((i-j+1)*q-i-1) * a[i-j] * b[j-1];
+// }
+// b[i] = b[i] / i;
+// }
+// cl_MI corr = expt_pos(a[0], q);
+// for ( size_t i=0; i<b.size(); ++i ) {
+// b[i] = b[i] * corr;
+// }
+}
+
+static umodpoly operator+(const umodpoly& a, const umodpoly& b)
+{
+ int sa = a.size();
+ int sb = b.size();
+ if ( sa >= sb ) {
+ umodpoly r(sa);
+ int i = 0;
+ for ( ; i<sb; ++i ) {
+ r[i] = a[i] + b[i];
+ }
+ for ( ; i<sa; ++i ) {
+ r[i] = a[i];
+ }
+ canonicalize(r);
+ return r;
+ }
+ else {
+ umodpoly r(sb);
+ int i = 0;
+ for ( ; i<sa; ++i ) {
+ r[i] = a[i] + b[i];
+ }
+ for ( ; i<sb; ++i ) {
+ r[i] = b[i];
+ }
+ canonicalize(r);
+ return r;