You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
6.0 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This manual describes how to install and use the GNU multiple precision
arithmetic library, version 6.1.0.
Copyright 1991, 1993-2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.3 or any later
version published by the Free Software Foundation; with no Invariant Sections,
with the Front-Cover Texts being "A GNU Manual", and with the Back-Cover
Texts being "You have freedom to copy and modify this GNU Manual, like GNU
software". A copy of the license is included in
GNU Free Documentation License. -->
<!-- Created by GNU Texinfo 6.4, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Divide and Conquer Division (GNU MP 6.1.0)</title>
<meta name="description" content="How to install and use the GNU multiple precision arithmetic library, version 6.1.0.">
<meta name="keywords" content="Divide and Conquer Division (GNU MP 6.1.0)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="Division-Algorithms.html#Division-Algorithms" rel="up" title="Division Algorithms">
<link href="Block_002dWise-Barrett-Division.html#Block_002dWise-Barrett-Division" rel="next" title="Block-Wise Barrett Division">
<link href="Basecase-Division.html#Basecase-Division" rel="prev" title="Basecase Division">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en">
<a name="Divide-and-Conquer-Division"></a>
<div class="header">
<p>
Next: <a href="Block_002dWise-Barrett-Division.html#Block_002dWise-Barrett-Division" accesskey="n" rel="next">Block-Wise Barrett Division</a>, Previous: <a href="Basecase-Division.html#Basecase-Division" accesskey="p" rel="prev">Basecase Division</a>, Up: <a href="Division-Algorithms.html#Division-Algorithms" accesskey="u" rel="up">Division Algorithms</a> &nbsp; [<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Divide-and-Conquer-Division-1"></a>
<h4 class="subsection">15.2.3 Divide and Conquer Division</h4>
<p>For divisors larger than <code>DC_DIV_QR_THRESHOLD</code>, division is done by dividing.
Or to be precise by a recursive divide and conquer algorithm based on work by
Moenck and Borodin, Jebelean, and Burnikel and Ziegler (see <a href="References.html#References">References</a>).
</p>
<p>The algorithm consists essentially of recognising that a 2NxN division
can be done with the basecase division algorithm (see <a href="Basecase-Division.html#Basecase-Division">Basecase Division</a>),
but using N/2 limbs as a base, not just a single limb. This way the
multiplications that arise are (N/2)x(N/2) and can take advantage of
Karatsuba and higher multiplication algorithms (see <a href="Multiplication-Algorithms.html#Multiplication-Algorithms">Multiplication Algorithms</a>). The two &ldquo;digits&rdquo; of the quotient are formed by recursive
Nx(N/2) divisions.
</p>
<p>If the (N/2)x(N/2) multiplies are done with a basecase multiplication
then the work is about the same as a basecase division, but with more function
call overheads and with some subtractions separated from the multiplies.
These overheads mean that it&rsquo;s only when N/2 is above
<code>MUL_TOOM22_THRESHOLD</code> that divide and conquer is of use.
</p>
<p><code>DC_DIV_QR_THRESHOLD</code> is based on the divisor size N, so it will be somewhere
above twice <code>MUL_TOOM22_THRESHOLD</code>, but how much above depends on the
CPU. An optimized <code>mpn_mul_basecase</code> can lower <code>DC_DIV_QR_THRESHOLD</code> a
little by offering a ready-made advantage over repeated <code>mpn_submul_1</code>
calls.
</p>
<p>Divide and conquer is asymptotically <em>O(M(N)*log(N))</em> where
<em>M(N)</em> is the time for an NxN multiplication done with FFTs. The
actual time is a sum over multiplications of the recursed sizes, as can be
seen near the end of section 2.2 of Burnikel and Ziegler. For example, within
the Toom-3 range, divide and conquer is <em>2.63*M(N)</em>. With higher
algorithms the <em>M(N)</em> term improves and the multiplier tends to <em>log(N)</em>. In practice, at moderate to large sizes, a 2NxN division
is about 2 to 4 times slower than an NxN multiplication.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Block_002dWise-Barrett-Division.html#Block_002dWise-Barrett-Division" accesskey="n" rel="next">Block-Wise Barrett Division</a>, Previous: <a href="Basecase-Division.html#Basecase-Division" accesskey="p" rel="prev">Basecase Division</a>, Up: <a href="Division-Algorithms.html#Division-Algorithms" accesskey="u" rel="up">Division Algorithms</a> &nbsp; [<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>