From Wikipedia, the free encyclopedia - View original article

(Redirected from Division (digital))

This article is about algorithms for division. For the theorem proving the existence of a unique quotient and remainder, see Euclidean division.

A **division algorithm** is an algorithm which, given two integers N and D, computes their quotient and/or remainder, the result of division. Some are applied by hand, while others are employed by digital circuit designs and software.

Division algorithms fall into two main categories: slow division and fast division. Slow division algorithms produce one digit of the final quotient per iteration. Examples of slow division include restoring, non-performing restoring, non-restoring, and SRT division. Fast division methods start with a close approximation to the final quotient and produce twice as many digits of the final quotient on each iteration. Newton-Raphson and Goldschmidt fall into this category.

Discussion will refer to the form where

*Q*= Quotient*N*= Numerator (dividend)*D*= Denominator (divisor).

## Contents |

The proof that the quotient and remainder exist and are unique, described at Euclidean division, gives rise to a division algorithm using only additions, subtractions, and comparisons:

` `**function** divide(N, D): **if** D == 0 **then** **throw** DivisionByZeroException **end** **if** D < 0 **then** (Q,R) = divide(N, -D); **return** (-Q, R) **end** **if** N < 0 **then** (Q,R) = divide(-N, D); **return** (-Q - 1, D - R) **end** *// At this point, N ≥ 0 and D > 0* Q = 0; R = N **while** R' ≥ D **do** Q = Q + 1 R = R - D **end** **return** (Q, R) **end**

This procedure always produces R ≥ 0. Although very simple, it takes Ω(Q) steps, and so is exponentially slower than even slow division algorithms like long division. It is useful if Q is known to be small, and can serve as an executable specification.

Main article: Long division

Long division is the standard algorithm used for pen-and-paper division of multidigit numbers expressed in decimal notation. It shifts gradually from the left to the right end of the dividend, subtracting the largest possible multiple of the divisor at each stage; the multiples become the digits of the quotient, and the final difference is the remainder. When used with a binary radix, it forms the basis for the integer division (unsigned) with remainder algorithm below. Short division is an abbreviated form of long division suitable for one-digit divisors.

The following algorithm, the binary version of the famous long division, will divide *N* by *D*, placing the quotient in *Q* and the remainder in *R*. All values are treated as unsigned integers.^{[citation needed]}

` `**if** D == 0 **then** **throw** DivisionByZeroException **end** Q := 0 *initialize quotient and remainder to zero* R := 0 **for** i = n-1...0 **do** " where n is number of bits " R := R << 1 * left-shift R by 1 bit * R(0) := N(i) *set the least-significant bit of R equal to bit i of the numerator* **if** R >= D **then** R = R - D Q(i) := 1 **end** **end**

Slow division methods are all based on a standard recurrence equation:

where:

*P*_{j}= the partial remainder of the division*R*= the radix*q*_{n − (j + 1)}= the digit of the quotient in position*n-(j+1)*, where the digit positions are numbered from least-significant 0 to most significant*n*− 1*n*= number of digits in the quotient*D*= the denominator.

Restoring division operates on fixed-point fractional numbers and depends on the following assumptions:^{[citation needed]}

*D*<*N*- 0 <
*N*,*D*< 1.

The quotient digits *q* are formed from the digit set {0,1}.

The basic algorithm for binary (radix 2) restoring division is:

` ``P := N D := D << n `** P and D need twice the word width of N and Q* **for** i = n-1..0 **do** ** for example 31..0 for 32 bits* P := 2P - D ** trial subtraction from shifted value* **if** P >= 0 **then** q(i) := 1 ** result-bit 1* **else** q(i) := 0 ** result-bit 0* P := P + D ** new partial remainder is (restored) shifted value* **end** **end**

` `**where** *N=Numerator, D=Denominator, n=#bits, P=Partial remainder, q(i)=bit #i of quotient*

The above restoring division algorithm can avoid the restoring step by saving the shifted value 2*P* before the subtraction in an additional register *T* (i.e., *T* = *P* << 1) and copying register *T* to *P* when the result of the subtraction 2*P* − *D* is negative.

Non-performing restoring division is similar to restoring division except that the value of `2*P[i]`

is saved, so *D* does not need to be added back in for the case of `TP[i] ≤ 0`

.

Non-restoring division uses the digit set {−1,1} for the quotient digits instead of {0,1}. The basic algorithm for binary (radix 2) non-restoring division is:

P[0] := N i := 0whilei < ndoifP[i] >= 0thenq[n-(i+1)] := 1 P[i+1] := 2*P[i] - Delseq[n-(i+1)] := -1 P[i+1] := 2*P[i] + Dend ifi := i + 1end while

Following this algorithm, the quotient is in a non-standard form consisting of digits of −1 and +1. This form needs to be converted to binary to form the final quotient. Example:

Convert the following quotient to the digit set {0,1}: | |

Steps: | |

1. Mask the negative term: | |

2. Form the two's complement of N: | |

3. Mask the positive term: | |

4. Sum and : |

Named for its creators (Sweeney, Robertson, and Tocher), SRT division is a popular method for division in many microprocessor implementations. SRT division is similar to non-restoring division, but it uses a lookup table based on the dividend and the divisor to determine each quotient digit. The Intel Pentium processor's infamous floating-point division bug was caused by an incorrectly coded lookup table. Five entries that were believed to be theoretically unreachable had been omitted from more than one thousand table entries.^{[1]}

Newton–Raphson uses Newton's method to find the reciprocal of , and multiply that reciprocal by to find the final quotient .

The steps of Newton–Raphson are:

- Calculate an estimate for the reciprocal of the divisor (): .
- Compute successively more accurate estimates of the reciprocal:
- Compute the quotient by multiplying the dividend by the reciprocal of the divisor: .

In order to apply Newton's method to find the reciprocal of , it is necessary to find a function which has a zero at . The obvious such function is , but the Newton–Raphson iteration for this is unhelpful since it cannot be computed without already knowing the reciprocal of . Moreover multiple iterations for refining reciprocal are not possible since higher order derivatives do not exist for . A function which does work is , for which the Newton–Raphson iteration gives

which can be calculated from using only multiplication and subtraction, or using two fused multiply–adds.

From a computation point of view the expressions and are not equivalent. To obtain a result with a precision of n bits while making use of the second expression one must compute the product between and with double the required precision (2n bits). In contrast the product between and need only be computed with a precision of n bits.

If the error is defined as then

Apply a bit-shift to the divisor *D* to scale it so that 0.5 ≤ *D* ≤ 1 . The same bit-shift should be applied to the numerator *N* so that the quotient does not change. Then one could use a linear approximation in the form

to initialize Newton–Raphson. To minimize the maximum of the absolute value of the error of this approximation on interval one should use

^{[citation needed]}

Using this approximation, the error of the initial value is less than

Since for this method the convergence is exactly quadratic, it follows that

steps is enough to calculate the value up to binary places.

Goldschmidt (after Robert Elliott Goldschmidt)^{[2]} division uses an iterative process to repeatedly multiply both the dividend and divisor by a common factor *F*_{i} to converge the divisor, *D*, to 1 as the dividend, *N*, converges to the quotient *Q*:

The steps for Goldschmidt division are:

- Generate an estimate for the multiplication factor
*F*._{i} - Multiply the dividend and divisor by
*F*._{i} - If the divisor is sufficiently close to 1, return the dividend, otherwise, loop to step 1.

Assuming *N*/*D* has been scaled so that 0 < *D* < 1, each *F _{i}* is based on

Multiplying the dividend and divisor by the factor yields:

After a sufficient number of iterations *k*:

The Goldschmidt method is used in AMD Athlon CPUs and later models.^{[3]}^{[4]}

The Goldschmidt method can be used with factors that allow simplifications by the binomial theorem. Assuming N/D has been scaled by a power of two such that . We choose and . This yields

Since after steps we can round to 1 with a relative error of at most and thus we obtain binary digits precision. This algorithm is referred to as the IBM method in.^{[5]}

Methods designed for hardware implementation generally do not scale to integers with thousands or millions of decimal digits; these frequently occur, for example, in modular reductions in cryptography. For these large integers, more efficient division algorithms transform the problem to use a small number of multiplications, which can then be done using an asymptotically efficient multiplication algorithm such as Toom–Cook multiplication or the Schönhage–Strassen algorithm. Examples include reduction to multiplication by Newton's method as described above^{[6]} as well as the slightly faster Barrett reduction algorithm.^{[7]} Newton's method's is particularly efficient in scenarios where one must divide by the same divisor many times, since after the initial Newton inversion only one (truncated) multiplication is needed for each division.

Division by a constant is equivalent to multiplication by its reciprocal. Since the denominator *D* is constant, so is its reciprocal (1/*D*). Thus it is possible to compute the value of (1/*D*) once at compile time, and at run time perform the multiplication *N*·(1/*D*) rather than the division *N/D*. In floating point arithmetic the use of (1/*D*) presents no problem, but in integer the reciprocal will always evaluate to zero, assuming |*D*| > 1.

Note that it is not necessary to use specifically (1/*D*), as any value (*X*/*Y*) that reduces to the same is equivalent. For example, for division by 3 you could multiply by 1/3, 2/6, 3/9, or 194/582. This way, you can choose *Y* to be any power of two, and replace the division step with a fast right bit shift. The effect of calculating *N*/*D* as (*N*·*X*)/*Y* is replacing a division by a multiply and a shift. Note that the parentheses are important, as *N*·(*X*/*Y*) will evaluate to zero.

However, unless *D* itself is a power of two, there is no *X* and *Y* that satisfies the conditions above. But it is not necessary for (*X*/*Y*) to be exactly equal to 1/*D*, only that it is "close enough" and such that the error introduced by this approximation is in the bits that are discarded by the shift operation. For further details see the reference.^{[8]}

As a concrete example, for 32 bit unsigned integers, division by 3 can be replaced with a multiply by , a multiplication by 2863311531 followed by a 33 right bit shift. This value is equal to .

In some cases, division by a constant can be accomplished in even less time by converting the "multiply by a constant" into a series of shifts and adds or subtracts.^{[9]} Of particular interest is division by 10, for which the exact quotient is obtained, with remainder if required.^{[10]}

Round-off error can be introduced by division operations due to limited precision.

Further information: Floating point

**^**Intel Corporation, 1994, Retrieved 2011-10-19,"Statistical Analysis of Floating Point Flaw"**^**Robert E. Goldschmidt, Applications of Division by Convergence, MSc dissertation, M.I.T., 1964**^**Stuart F. Oberman, "Floating Point Division and Square Root Algorithms and Implementation in the AMD-K7 Microprocessor",*in Proc. IEEE Symposium on Computer Arithmetic*, pp. 106–115, 1999**^**Peter Soderquist and Miriam Leeser, "Division and Square Root: Choosing the Right Implementation",*IEEE Micro*, Vol.17 No.4, pp.56–66, July/August 1997**^**Paul Molitor, "Entwurf digitaler Systeme mit VHDL"**^**Hasselström, Karl (2003).*Fast Division of Large Integers: A Comparison of Algorithms*(Master's in Computer Science thesis). Royal Institute of Technology. http://www.treskal.com/kalle/exjobb/original-report.pdf. Retrieved 2011-03-23.**^**Paul Barrett (1987). "Implementing the Rivest Shamir and Adleman public key encryption algorithm on a standard digital signal processor".*Proceedings on Advances in cryptology---CRYPTO '86*. London, UK: Springer-Verlag. pp. 311–323. ISBN 0-387-18047-8. http://portal.acm.org/citation.cfm?id=36688.**^**Division by Invariant Integers using Multiplication Torbjörn Granlund and Peter L. Montgomery. ACM SIGPLAN Notices Vol 29 Issue 6 (June 1994) 61–72**^**Massmind: "Binary Division by a Constant"**^**R. A. Vowels, "Divide by 10", Australian Computer Journal (24), 1992, pp. 81-85.

- Computer Arithmetic Algorithms JavaScript Simulator – contains simulators for many different division algorithms