/* * 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); }
/* * Add - r * b1 to b */ void arith_buffer_sub_pp_times_buffer(arith_buffer_t *b, arith_buffer_t *b1, pprod_t *r) { mlist_t *p, *aux, *p1; mlist_t **q; pprod_t *r1; q = &b->list; p = *q; p1 = b1->list; while (p1->next != NULL) { r1 = pprod_mul(b->ptbl, p1->prod, r); while (pprod_precedes(p->prod, r1)) { q = &p->next; p = *q; } if (p->prod == r1) { q_sub(&p->coeff, &p1->coeff); q = &p->next; p = *q; } else { assert(pprod_precedes(r1, p->prod)); aux = alloc_list_elem(b->store); aux->next = p; q_set_neg(&aux->coeff, &p1->coeff); aux->prod = r1; *q = aux; q = &aux->next; b->nterms ++; } p1 = p1->next; } }
/* * Add -a * r to b */ void arith_buffer_sub_mono(arith_buffer_t *b, rational_t *a, pprod_t *r) { mlist_t *p, *aux; mlist_t **q; if (q_is_zero(a)) return; 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 &b->list if p is first in the list // q is &p0->next where p0 = predecessor of p otherwise. if (p->prod == r) { q_sub(&p->coeff, a); } else { assert(pprod_precedes(r, p->prod)); aux = alloc_list_elem(b->store); aux->next = p; q_set_neg(&aux->coeff, a); aux->prod = r; *q = aux; b->nterms ++; } }
/* * Check whether cnstr => var[k] = period * integer + phase */ static void check_period_and_phase(int_constraint_t *cnstr, uint32_t k, rational_t *period, rational_t *phase) { rational_t test_val; int32_t x, z; q_init(&test_val); x = int_constraint_get_var(cnstr, k); for (z = -10; z < 10; z++) { get_solution_for_var(cnstr, k, &test_val, z); q_sub(&test_val, phase); // value - phase if (q_divides(period, &test_val)) { printf(" passed test for %s = ", var[x].name); q_print(stdout, &test_val); printf("\n"); } else { printf("*** BUG ***"); printf(" failed test for %s = ", var[x].name); q_print(stdout, &test_val); printf("\n"); fflush(stdout); exit(1); } } q_clear(&test_val); }
/* * Subtract poly from buffer b */ void arith_buffer_sub_monarray(arith_buffer_t *b, monomial_t *poly, pprod_t **pp) { mlist_t *p, *aux; mlist_t **q; pprod_t *r1; assert(good_pprod_array(poly, pp)); q = &b->list; p = *q; while (poly->var < max_idx) { r1 = *pp; while (pprod_precedes(p->prod, r1)) { q = &p->next; p = *q; } // p points to monomial whose prod is >= r1 in the deg-lex order // q is either &b->list or &p0->next where p0 is the predecessor // of p in the list if (p->prod == r1) { q_sub(&p->coeff, &poly->coeff); q = &p->next; p = *q; } else { assert(pprod_precedes(r1, p->prod)); aux = alloc_list_elem(b->store); aux->next = p; q_set_neg(&aux->coeff, &poly->coeff); aux->prod = r1; *q = aux; q = &aux->next; b->nterms ++; } // move to next monomial of poly poly ++; pp ++; } }
void SeniorVMHandle::q_cmp(long _register1,long _register2) { q_sub(_register1,_register2); pop(T_EFLAG); pop(T_INVALID); }