void mpolunit(MPOL *p, MINT *coef, MPOL *q) { register i; MINT *resco,rem; MPOL res; if (p->nterms==0) { mpolfree(q); mset(0,coef); return; }; MINIT(&rem); MFREE(coef); MCOPY(&(p->coefs[0]),coef); for (i=1;i<p->nterms;i++) mgcd(coef,&(p->coefs[i]),coef); MPOLINIT(&res); res.nterms = p->nterms; POL_ALLOC(&res,p->nterms); resco = res.coefs; for (i=0;i<p->nterms;i++){ MINIT(resco); mdiv(&(p->coefs[i]),coef,(resco++),&rem); expocopy(MEXPO(p,i),MEXPO(&res,i)); } mpolfree(q); MPOLMOVEFREE(&res,q); MFREE(&rem); }
void gcd_numbers(void) { save(); p2 = pop(); p1 = pop(); // if (!isinteger(p1) || !isinteger(p2)) // stop("integer args expected for gcd"); p3 = alloc(); p3->k = NUM; p3->u.q.a = mgcd(p1->u.q.a, p2->u.q.a); p3->u.q.b = mgcd(p1->u.q.b, p2->u.q.b); MSIGN(p3->u.q.a) = 1; push(p3); restore(); }
void qsub(void) { unsigned int *a, *ab, *b, *ba, *c; save(); p2 = pop(); p1 = pop(); ab = mmul(p1->u.q.a, p2->u.q.b); ba = mmul(p1->u.q.b, p2->u.q.a); a = msub(ab, ba); mfree(ab); mfree(ba); // zero? if (MZERO(a)) { mfree(a); push(zero); restore(); return; } b = mmul(p1->u.q.b, p2->u.q.b); c = mgcd(a, b); MSIGN(c) = MSIGN(b); p1 = alloc(); p1->k = NUM; p1->u.q.a = mdiv(a, c); p1->u.q.b = mdiv(b, c); mfree(a); mfree(b); mfree(c); push(p1); restore(); }