| Division |
| |
| This describes the division algorithm used by the MPI library. |
| |
| Input: a, b; a > b |
| Compute: Q, R; a = Qb + R |
| |
| The input numbers are normalized so that the high-order digit of b is |
| at least half the radix. This guarantees that we have a reasonable |
| way to guess at the digits of the quotient (this method was taken from |
| Knuth, vol. 2, with adaptations). |
| |
| To normalize, test the high-order digit of b. If it is less than half |
| the radix, multiply both a and b by d, where: |
| |
| radix - 1 |
| d = ----------- |
| bmax + 1 |
| |
| ...where bmax is the high-order digit of b. Otherwise, set d = 1. |
| |
| Given normalize values for a and b, let the notation a[n] denote the |
| nth digit of a. Let #a be the number of significant figures of a (not |
| including any leading zeroes). |
| |
| Let R = 0 |
| Let p = #a - 1 |
| |
| while(p >= 0) |
| do |
| R = (R * radix) + a[p] |
| p = p - 1 |
| while(R < b and p >= 0) |
| |
| if(R < b) |
| break |
| |
| q = (R[#R - 1] * radix) + R[#R - 2] |
| q = q / b[#b - 1] |
| |
| T = b * q |
| |
| while(T > L) |
| q = q - 1 |
| T = T - b |
| endwhile |
| |
| L = L - T |
| |
| Q = (Q * radix) + q |
| |
| endwhile |
| |
| At this point, Q is the quotient, and R is the normalized remainder. |
| To denormalize R, compute: |
| |
| R = (R / d) |
| |
| At this point, you are finished. |
| |
| ------------------------------------------------------------------ |
| This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |