|
|
1.1 ! root 1: #include "mprec.h" ! 2: #include <assert.h> ! 3: ! 4: ! 5: /* ! 6: * Sdiv divides the mint pointed to by "a" by the int "n". It sets ! 7: * the mint pointed to by "q" to the quotient and the int pointed to ! 8: * by "r" to the remainder. ! 9: * Note that it is assumed that 1 <= "n" <= BASE. ! 10: * The division is performed such that the following two properties ! 11: * hold : ! 12: * 1. r + q * n = a. ! 13: * 2. the sign of r = the sign of q. ! 14: * 3. the abs. value of r < the abs. value of b. ! 15: * Note that "a" == "q" is permissable. ! 16: */ ! 17: ! 18: void ! 19: sdiv(a, n, q, r) ! 20: mint *a, *q; ! 21: register int n; ! 22: int *r; ! 23: { ! 24: register char *qp, *ap; ! 25: char *res; ! 26: int npfl; /* numerator positive flag */ ! 27: char dmfl; /* denominator minus flag */ ! 28: mint al; ! 29: register int rem; ! 30: ! 31: if (n == 0) ! 32: mperr("division by zero attempted"); ! 33: if (dmfl = n < 0) ! 34: n = -n; ! 35: assert(1 <= n && n <= BASE); ! 36: ! 37: /* set npfl and negate a if necessary */ ! 38: npfl = ispos(a); ! 39: if (!npfl) { ! 40: minit(&al); ! 41: mneg(a, &al); ! 42: a = &al; ! 43: } ! 44: ! 45: /* allocate space for result */ ! 46: res = (char *)mpalc(a->len); ! 47: ! 48: /* compute quotient, most sig. digit first */ ! 49: qp = res + a->len; ! 50: ap = a->val + a->len; ! 51: rem = 0; ! 52: while (qp > res) { ! 53: rem = BASE * rem + *--ap; ! 54: *--qp = rem / n; ! 55: rem %= n; ! 56: } ! 57: mpfree(q->val); ! 58: q->val = res; ! 59: q->len = a->len; ! 60: norm(q); ! 61: ! 62: /* fix up sign if a was negative */ ! 63: if (npfl ? dmfl : !dmfl) { ! 64: rem = -rem; ! 65: mneg(q, q); ! 66: } ! 67: if (!npfl) ! 68: mpfree(al.val); ! 69: *r = rem; ! 70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.