Exemple #1
0
/* Warning: destroys aa! */
void test_split(struct polynomial **aa, struct polynomial orig)
{
	int i, j, aalen;
	struct polynomial tmp;
	tmp.leading = NULL;
	
	if (orig.degree != aa[0]->degree) {
		printf("Wrong degrees! Stop.");
		exit(1);
	}
	
	aalen = 1 + aa[0]->degree/d;
	
	for (i = 1; i + 1 <= aalen; i++) {
		printf(" %d \n", i);
		tmp = pol_mult(myf, *aa[i]);
		free_tail(aa[i]->leading);
		merge_add(aa[0], tmp);
		for (j = i + 1; j + 1 <= aalen; j++) {
			tmp = pol_mult(myf, *aa[j]);
			free_tail(aa[j]->leading);
			*aa[j] = tmp;
		}
	}
	times_int(-1, aa[0]);
	printf("Here is the test result: \n");
	print_pol(pol_add(*aa[0], orig));
	return;
}
Exemple #2
0
/* Computes p*Delta.							*
 * This will only be run once!						*/
struct polynomial compute_delta(void)
{
	int i;
	struct polynomial A, B, C;
	A.leading = NULL;
	B.leading = NULL;
	C.leading = NULL;

	A = copy_pol(myf);
	B = copy_pol(myf);
	for (i = 2; i <= p; i++)
	{
		C = pol_mult(A, B);
		free_tail(B.leading);
		B = C;
		C.leading = NULL;
		C.degree = 0;
	}
	free_tail(A.leading);
	A.leading = NULL;
	A.degree = 0;
	A = frobenius(myf);

	/* Replace A by negative. */
	times_int(-1, &A);

	/* Add -F(f) + f^p */
	C = pol_add(A, B);

	free_tail(A.leading);
	free_tail(B.leading);
	
	return(C);
}
Exemple #3
0
static void op_mult()
        {
        int i1,i2;
        struct polynom pol,pol1,pol2;
// RS REM        extern struct polynom *pol_mult_real();
// RS REM        extern struct polynom *pol_mult();

        *q++=EOS;
        i1=muste_pol_load(p,&pol1); if (i1<0) return;
        i2=muste_pol_load(q,&pol2); if (i2<0) return;
        if (i1==1 && i2==1) pol_mult_real(&pol,&pol1,&pol2);
        else pol_mult(&pol,&pol1,&pol2);
        muste_pol_save(xx,&pol);
        }
Exemple #4
0
struct polynom *pol_product(struct polynom *p,struct polynom *q)
        {
        int i,j;
        struct polynom t,u;

        t.n=1;
        t.a[0].x=-(q->a[0].x); t.a[0].y=-(q->a[0].y);
        t.a[1].x=1.0; t.a[1].y=0.0;

        for (i=1; i<=q->n; ++i)
            {
            u.n=1;
            u.a[0].x=-(q->a[i].x); u.a[0].y=-(q->a[i].y);
            u.a[1].x=1.0; u.a[1].y=0.0;
            pol_mult(p,&u,&t);
            t.n=p->n;
            for (j=0; j<=t.n; ++j) { t.a[j].x=p->a[j].x; t.a[j].y=p->a[j].y; }
            }
        return(p);
        }
Exemple #5
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);
}
/* 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);
}