Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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);
}