Beispiel #1
0
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);
}
Beispiel #2
0
/*
 * 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);
}