/* * Degree of variable x in b * - return largest d such that x^d occurs in b * - return 0 if x does not occur in b */ uint32_t arith_buffer_var_degree(arith_buffer_t *b, int32_t x) { mlist_t *p; uint32_t d, e; d = 0; p = b->list; while (p->next != NULL) { assert(p->prod != end_pp); if (q_is_nonzero(&p->coeff)) { e = pprod_var_degree(p->prod, x); if (e > d) { d = e; } } p = p->next; } return d; }
int main() { pprod_t *p1, *p2; uint32_t i, j; int32_t cmp; p[0] = empty_pp; p[1] = var_pp(0); p[2] = var_pp(1); p[3] = var_pp(0x3fffffff); init_pp_buffer(&buffer, 0); p[4] = pp_buffer_getprod(&buffer); // empty pp_buffer_reset(&buffer); pp_buffer_mul_var(&buffer, 0); p[5] = pp_buffer_getprod(&buffer); // x_0 pp_buffer_reset(&buffer); pp_buffer_mul_var(&buffer, 0); pp_buffer_mul_var(&buffer, 1); pp_buffer_mul_var(&buffer, 0); p[6] = pp_buffer_getprod(&buffer); // x_0^2 x_1 pp_buffer_reset(&buffer); pp_buffer_mul_varexp(&buffer, 1, 2); pp_buffer_mul_varexp(&buffer, 4, 3); p[7] = pp_buffer_getprod(&buffer); // x_1^2 x_4^3 pp_buffer_set_varexp(&buffer, 3, 2); pp_buffer_mul_varexp(&buffer, 1, 4); p[8] = pp_buffer_getprod(&buffer); // x_3^2 x_1^4 pp_buffer_set_pprod(&buffer, p[7]); pp_buffer_mul_pprod(&buffer, p[1]); pp_buffer_mul_pprod(&buffer, p[8]); p[9] = pp_buffer_getprod(&buffer); for (i=0; i<NUM_PRODS; i++) { printf("p[%"PRIu32"] = ", i); print_pprod(stdout, p[i]); printf(" total degree = %"PRIu32"\n", pprod_degree(p[i])); for (j=0; j<5; j++) { printf(" degree of x_%"PRIu32" = %"PRIu32"\n", j, pprod_var_degree(p[i], j)); } printf("----\n"); } printf("\n"); for (i=0; i<NUM_PRODS; i++) { p1 = p[i]; for (j=0; j<NUM_PRODS; j++) { p2 = p[j]; printf("p1: "); print_pprod0(stdout, p1); printf("p2: "); print_pprod0(stdout, p2); if (pprod_equal(p1, p2)) { printf("equal products\n"); } if (pprod_divides(p1, p2)) { printf("p1 divides p2\n"); } if (pprod_divisor(&buffer, p1, p2)) { printf("p2/p1: "); print_pp_buffer0(stdout, &buffer); } if (pprod_divides(p2, p1)) { printf("p2 divides p1\n"); } if (pprod_divisor(&buffer, p2, p1)) { printf("p1/p2: "); print_pp_buffer0(stdout, &buffer); } cmp = pprod_lex_cmp(p1, p2); if (cmp < 0) { printf("p1 < p2 in lex order\n"); } else if (cmp > 0) { printf("p1 > p2 in lex order\n"); } else { printf("p1 = p2 in lex order\n"); } if (pprod_precedes(p1, p2)) { printf("p1 < p2 in deglex ordering\n"); } if (pprod_precedes(p2, p1)) { printf("p2 < p1 in deglex ordering\n"); } printf("----\n"); } } for (i=0; i<10; i++) { free_pprod(p[i]); } delete_pp_buffer(&buffer); return 0; }