304 if(topOrder < order) {
309 binom = Array1D < FArray1D < int, N + 1 > > (topOrder + 2);
311 for(
int var = N + 1; var-- > 0;) binom[0][var] = 0;
312 for(
int ord = 1; ord <= topOrder + 1; ord++) {
315 for(
int var = N; var-- > 0;)
316 binom[ord][var] = binom[ord-1][var] + binom[ord][var+1];
321 for(
int i = 0; i < topOrder + 2; i++) bin[i] = binom[i][0];
326 topSize = bin[topOrder+1];
327 expon = Array1D < FMonomial<N> >(topSize);
331 for(
int index = 1; index < topSize; index++) expon[index][0] = index;
333 for(
int index = 1; index < topSize; index++) {
334 int carry = power[N-1];
337 while(power[lastnz] == 0 && lastnz-- > 0) {}
339 if(lastnz == -1) power[0] = 1 + carry;
342 power[lastnz+1] += 1 + carry;
345 expon[index] = power;
352 prod = Array1D < Array1D<int> >(topSize);
353 for(
int xord = 0; xord <= topOrder; xord++) {
354 int yord = topOrder - xord;
355 int ysize = bin[yord+1];
356 for(
int i = bin[xord]; i < bin[xord+1]; i++) {
359 for(
int j = 0; j < std::min(i, ysize); j++) {
362 for(
int j = i; j < ysize; j++) {
363 power = expon[i] * expon[j];
366 for(
int vv = N; vv-- > 0;) {
368 ind += binom[ord][vv];
380 int *vars =
new int[topOrder];
382 int j = 1, N1 = N - 1;
384 for(
int ord = 1; ord <= topOrder; ord++) {
387 std::fill(vars, vars + ord,
int(0));
389 int last_j = bin[ord+1];
390 int *vlast = vars + ord;
392 while(++j < last_j) {
395 while(*--vi == N1) {};
397 std::fill(vi, vlast, k);
400 std::copy(vars, vars + ord, vrblList[j].
begin());
411 fillSubst(0, 1, power, next);