/* * 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); }
/* * 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); }
/* * 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); }
/* * Add -r to b */ void arith_buffer_sub_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_sub_one(&p->coeff); } else { assert(pprod_precedes(r, p->prod)); aux = alloc_list_elem(b->store); aux->next = p; q_set_minus_one(&aux->coeff); aux->prod = r; *q = aux; b->nterms ++; } }