void toVarpower(const_schur_partition a, intarray &result) { int len = a[0]; int *result_vp = result.alloc(2*len); int *orig_result_vp = result_vp; result_vp++; if (len > 1) { int v = a[1]; int e = 1; for (int i=2; i<len; i++) { if (v == a[i]) e++; else { *result_vp++ = v; *result_vp++ = e; v = a[i]; e = 1; } } *result_vp++ = v; *result_vp++ = e; } int newlen = static_cast<int>(result_vp - orig_result_vp); *orig_result_vp = newlen; result.shrink(newlen); }
void varpower::mult(const int *a, const int *b, intarray &result) { int len = *a + *b; // potential length int *result_vp = result.alloc(len); int *orig_result_vp = result_vp; result_vp++; index_varpower i = a; index_varpower j = b; // merge the two varpowers to staticVP int va = (i.valid() ? i.var() : -1); int vb = (j.valid() ? j.var() : -1); for (;;) { if (va > vb) { *result_vp++ = va; *result_vp++ = i.exponent(); ++i; va = (i.valid() ? i.var() : -1); } else if (vb > va) { *result_vp++ = vb; *result_vp++ = j.exponent(); ++j; vb = (j.valid() ? j.var() : -1); } else { if (va == -1) break; int x = i.exponent(); int y = j.exponent(); int z = x+y; if ((x < 0) == (y < 0) && (x < 0) != (z < 0)) { ERROR("monomial overflow"); } else { if (z != 0) { *result_vp++ = va; *result_vp++ = z; } } ++i; ++j; va = (i.valid() ? i.var() : -1); vb = (j.valid() ? j.var() : -1); } } int newlen = static_cast<int>(result_vp - orig_result_vp); *orig_result_vp = newlen; result.shrink(newlen); }