/* * Test 4: construct 1/(2^n-1) */ static void test4(void) { rational_t r, aux, aux2; uint32_t i; printf("\nTest 4\n\n"); q_init(&r); q_init(&aux); q_init(&aux2); q_set32(&aux, 2); q_set_one(&aux2); q_set_one(&r); for (i=0; i<68; i++) { q_inv(&r); test_conversions(&r); q_inv(&r); q_mul(&r, &aux); q_add(&r, &aux2); } q_set_minus_one(&r); for (i=0; i<68; i++) { q_inv(&r); test_conversions(&r); q_inv(&r); q_mul(&r, &aux); q_sub(&r, &aux2); } q_clear(&aux); q_clear(&aux2); q_clear(&r); }
/* * Test 3: inverses of powers of two */ static void test3(void) { rational_t r, aux; uint32_t i; printf("\nTest 3\n\n"); q_init(&r); q_init(&aux); q_set_int32(&aux, 1, 2); // 1/2 q_set_one(&r); for (i=0; i<68; i++) { test_conversions(&r); q_mul(&r, &aux); } q_set_minus_one(&r); for (i=0; i<68; i++) { test_conversions(&r); q_mul(&r, &aux); } q_clear(&aux); q_clear(&r); }
/* * Test1: construct powers of two */ static void test1(void) { rational_t r, aux; uint32_t i; printf("\nTest 1\n\n"); q_init(&r); q_init(&aux); q_set32(&aux, 2); q_set_one(&r); for (i=0; i<68; i++) { test_conversions(&r); q_mul(&r, &aux); } // negative powers q_set_minus_one(&r); for (i=0; i<68; i++) { test_conversions(&r); q_mul(&r, &aux); } q_clear(&aux); q_clear(&r); }
/* * Add r to b */ void arith_buffer_add_pp(arith_buffer_t *b, pprod_t *r) { mlist_t *p, *aux; mlist_t **q; q = &b->list; p = *q; assert(p == b->list); while (pprod_precedes(p->prod, r)) { q = &p->next; p = *q; } // p points to a monomial with p->prod >= r // q is either &p->list or &p0->next where p0 is p's predecessor if (p->prod == r) { q_add_one(&p->coeff); } else { assert(pprod_precedes(r, p->prod)); aux = alloc_list_elem(b->store); aux->next = p; q_set_one(&aux->coeff); aux->prod = r; *q = aux; b->nterms ++; } }
/* * Set b to the constant 1 */ void arith_buffer_set_one(arith_buffer_t *b) { mlist_t *p; arith_buffer_reset(b); p = alloc_list_elem(b->store); p->next = b->list; p->prod = empty_pp; q_set_one(&p->coeff); b->list = p; b->nterms = 1; }
/* * Apply s to poly[i] * - store the result in buffer b */ static void subst_poly_idx(substitution_t *s, poly_table_t *table, poly_buffer_t *b, int32_t i) { monomial_t aux[2]; polynomial_t *p; assert(0 < i && i < table->npolys); p = table->poly[i]; if (p == NULL) { // build the polynomial 1.i in aux aux[0].var = i; q_init(&aux[0].coeff); q_set_one(&aux[0].coeff); aux[1].var = max_idx; subst_poly(s, b, aux); q_clear(&aux[0].coeff); } else { subst_poly(s, b, p->mono); } }