/* 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; }
/* 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); }
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); }
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); }
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); }