int main() { mscalar ma, mb, mc, md, me; struct polynomial A, B, C, D, E, F, G, H; make_scalar(ma); make_scalar(mb); make_scalar(mc); make_scalar(md); make_scalar(me); A.leading = NULL; B.leading = NULL; C.leading = NULL; D.leading = NULL; E.leading = NULL; F.leading = NULL; G.leading = NULL; H.leading = NULL; printf("The prime is: %d.\n", p); printf("The power is: %d.\n", r); setup_scalars(); set_seed(0); sc_zero(ma); printf("The number 0 is: "); printmscalar(ma); printf(".\n"); sc_one(mb); printf("The number 1 is: "); printmscalar(mb); printf(".\n"); ito_sc(541, mc); printf("The number 541 is: "); printmscalar(mc); printf(".\n"); sc_inv(mc, md); printf("The inverse of 541 is: "); printmscalar(md); printf(".\n"); sc_mult(md, mc, me); printf("The number 1 is: "); printmscalar(me); printf(".\n"); A = make_random(10); F = copy_pol(A); /* print_pol(A); printf("\n"); */ B = make_random(11); H = copy_pol(B); /* print_pol(B); printf("\n"); */ C = pol_mult(A, B); /* print_pol(C); printf("\n"); */ D = pol_mult(B, A); /* print_pol(D); printf("\n"); */ times_int(-1, &D); E = pol_add(C, D); print_pol(E); printf("\n"); times_int(-1, &F); G = pol_add(A, F); print_pol(G); printf("\n"); times_int(-1, &H); G = pol_add(B, H); print_pol(G); exit(0); }
/* Optimized for dividing by myf. */ struct polynomial *myf_division(struct polynomial *pp) { struct polynomial save_the_spot, uit; struct term test; struct polynomial myf_rest; struct polynomial *aa; struct polynomial *ppp; struct term **ptraa; struct term **ptrterm; int first; mscalar c; myf_rest.degree = myf.degree; myf_rest.leading = myf.leading->next; make_scalar(c); sc_inv(myf.leading->c, c); ppp = NULL; make_pol(&ppp); aa = NULL; make_pol(&aa); aa->degree = pp->degree - myf.degree; ptraa = &(aa->leading); save_the_spot.degree = aa->degree; /* Copy pp into ppp. */ ppp->degree = pp->degree; ppp->leading = pp->leading; /* Set pp equal to ``zero'' */ pp->leading = NULL; ptrterm = &pp->leading; while (ppp->leading) { if (deelbaar(myf.leading, ppp->leading)) { save_the_spot.leading = ppp->leading; first = 1; do { /* No sign in front of pppterm->c */ sc_mult_replace(c, ppp->leading->c); /* Change sign mon.c */ sc_negate(ppp->leading->c); *ptraa = ppp->leading; ppp->leading->n1 -= myf.leading->n1; ppp->leading->n2 -= myf.leading->n2; ppp->leading->n3 -= myf.leading->n3; ppp->leading->n4 -= myf.leading->n4; ppp->leading = ppp->leading->next; (*ptraa)->next = NULL; if (first) { test.n1 = (*ptraa)->n1 + myf_rest.leading->n1; test.n2 = (*ptraa)->n2 + myf_rest.leading->n2; test.n3 = (*ptraa)->n3 + myf_rest.leading->n3; test.n4 = (*ptraa)->n4 + myf_rest.leading->n4; first = 0; } ptraa = &((*ptraa)->next); } while ((ppp->leading) && deelbaar(myf.leading, ppp->leading) && (GROTER == kleiner(ppp->leading, &test))); uit = pol_mult(save_the_spot, myf_rest); merge_add(ppp, uit); } else { *ptrterm = ppp->leading; ptrterm = &((*ptrterm)->next); /* Move on to the next one. */ ppp->leading = ppp->leading->next; /* Terminate pp. */ *ptrterm = NULL; } } free(ppp); free_scalar(c); return(aa); }