static void print_normal_form(offset_table_t *table, polynomial_t *p) { poly_buffer_t aux; offset_desc_t *d; uint32_t i, n; thvar_t x; int32_t j; init_poly_buffer(&aux); n = p->nterms; for (i=0; i<n; i++) { if (p->mono[i].var == const_idx) { assert(i == 0); poly_buffer_add_const(&aux, &p->mono[i].coeff); } else { x = p->mono[i].var; assert(0 <= x && x < table->var2offset_var.size); j = table->var2offset_var.data[x]; assert(0 < j && j < table->nvars); d = table->desc + j; poly_buffer_addmul_monomial(&aux, const_idx, &p->mono[i].coeff, &d->offset); if (d->root > 0) { poly_buffer_add_monomial(&aux, d->root, &p->mono[i].coeff); } } } normalize_poly_buffer(&aux); show_poly_buffer(&aux); delete_poly_buffer(&aux); }
/* * Apply s to a monomial array mono * - store the result in buffer b */ static void subst_poly(substitution_t *s, poly_buffer_t *b, monomial_t *mono) { offset_pair_t aux; rational_t q; int32_t x; q_init(&q); reset_poly_buffer(b); x = mono->var; while (x != max_idx) { if (x == const_idx) { poly_buffer_add_const(b, &mono->coeff); } else { aux.var = x; aux.delta = 0; subst_var(s, &aux); // aux constains S[x] = y + delta // add a * y + a * delta to b if (aux.var > 0) { poly_buffer_add_monomial(b, aux.var, &mono->coeff); } q_set32(&q, aux.delta); poly_buffer_addmul_monomial(b, const_idx, &mono->coeff, &q); } mono ++; x = mono->var; } normalize_poly_buffer(b); q_clear(&q); }