gmp.texi
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:420k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. @math{X(t)} and @math{Y(t)} are evaluated and multiplied at 7 points, giving
  2. values of @math{W(t)} at those points.  In GMP the following points are used,
  3. @quotation
  4. @multitable {@m{t=-1/2,t=inf}M} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM}
  5. @item Point              @tab Value
  6. @item @math{t=0}         @tab @m{x_0y_0,x0 * y0}, which gives @ms{w,0} immediately
  7. @item @math{t=1/2}       @tab @m{(x_3+2x_2+4x_1+8x_0)(y_3+2y_2+4y_1+8y_0),(x3+2*x2+4*x1+8*x0) * (y3+2*y2+4*y1+8*y0)}
  8. @item @math{t=-1/2}      @tab @m{(-x_3+2x_2-4x_1+8x_0)(-y_3+2y_2-4y_1+8y_0),(-x3+2*x2-4*x1+8*x0) * (-y3+2*y2-4*y1+8*y0)}
  9. @item @math{t=1}         @tab @m{(x_3+x_2+x_1+x_0)(y_3+y_2+y_1+y_0),(x3+x2+x1+x0) * (y3+y2+y1+y0)}
  10. @item @math{t=-1}        @tab @m{(-x_3+x_2-x_1+x_0)(-y_3+y_2-y_1+y_0),(-x3+x2-x1+x0) * (-y3+y2-y1+y0)}
  11. @item @math{t=2}         @tab @m{(8x_3+4x_2+2x_1+x_0)(8y_3+4y_2+2y_1+y_0),(8*x3+4*x2+2*x1+x0) * (8*y3+4*y2+2*y1+y0)}
  12. @item @m{t=infty,t=inf} @tab @m{x_3y_3,x3 * y3}, which gives @ms{w,6} immediately
  13. @end multitable
  14. @end quotation
  15. The number of additions and subtractions for Toom-4 is much larger than for Toom-3.
  16. But several subexpressions occur multiple times, for example @m{x_2+x_0,x2+x0}, occurs
  17. for both @math{t=1} and @math{t=-1}.
  18. Toom-4 is asymptotically @math{O(N^@W{1.404})}, the exponent being
  19. @m{log7/log4,log(7)/log(4)}, representing 7 recursive multiplies of 1/4 the
  20. original size each.
  21. @node FFT Multiplication, Other Multiplication, Toom 4-Way Multiplication, Multiplication Algorithms
  22. @subsection FFT Multiplication
  23. @cindex FFT multiplication
  24. @cindex Fast Fourier Transform
  25. At large to very large sizes a Fermat style FFT multiplication is used,
  26. following Sch@"onhage and Strassen (@pxref{References}).  Descriptions of FFTs
  27. in various forms can be found in many textbooks, for instance Knuth section
  28. 4.3.3 part C or Lipson chapter IX@.  A brief description of the form used in
  29. GMP is given here.
  30. The multiplication done is @m{xy bmod 2^N+1, x*y mod 2^N+1}, for a given
  31. @math{N}.  A full product @m{xy,x*y} is obtained by choosing @m{N ge
  32. mathop{rm bits}(x)+mathop{rm bits}(y), N>=bits(x)+bits(y)} and padding
  33. @math{x} and @math{y} with high zero limbs.  The modular product is the native
  34. form for the algorithm, so padding to get a full product is unavoidable.
  35. The algorithm follows a split, evaluate, pointwise multiply, interpolate and
  36. combine similar to that described above for Karatsuba and Toom-3.  A @math{k}
  37. parameter controls the split, with an FFT-@math{k} splitting into @math{2^k}
  38. pieces of @math{M=N/2^k} bits each.  @math{N} must be a multiple of
  39. @m{2^ktimes@code{mp_bits_per_limb}, (2^k)*@nicode{mp_bits_per_limb}} so
  40. the split falls on limb boundaries, avoiding bit shifts in the split and
  41. combine stages.
  42. The evaluations, pointwise multiplications, and interpolation, are all done
  43. modulo @m{2^{N'}+1, 2^N'+1} where @math{N'} is @math{2M+k+3} rounded up to a
  44. multiple of @math{2^k} and of @code{mp_bits_per_limb}.  The results of
  45. interpolation will be the following negacyclic convolution of the input
  46. pieces, and the choice of @math{N'} ensures these sums aren't truncated.
  47. @tex
  48. $$ w_n = sum_{{i+j = b2^k+n}atop{b=0,1}} (-1)^b x_i y_j $$
  49. @end tex
  50. @ifnottex
  51. @example
  52.            ---
  53.                     b
  54. w[n] =     /     (-1) * x[i] * y[j]
  55.            ---
  56.        i+j==b*2^k+n
  57.           b=0,1
  58. @end example
  59. @end ifnottex
  60. The points used for the evaluation are @math{g^i} for @math{i=0} to
  61. @math{2^k-1} where @m{g=2^{2N'/2^k}, g=2^(2N'/2^k)}.  @math{g} is a
  62. @m{2^k,2^k'}th root of unity mod @m{2^{N'}+1,2^N'+1}, which produces necessary
  63. cancellations at the interpolation stage, and it's also a power of 2 so the
  64. fast Fourier transforms used for the evaluation and interpolation do only
  65. shifts, adds and negations.
  66. The pointwise multiplications are done modulo @m{2^{N'}+1, 2^N'+1} and either
  67. recurse into a further FFT or use a plain multiplication (Toom-3, Karatsuba or
  68. basecase), whichever is optimal at the size @math{N'}.  The interpolation is
  69. an inverse fast Fourier transform.  The resulting set of sums of @m{x_iy_j,
  70. x[i]*y[j]} are added at appropriate offsets to give the final result.
  71. Squaring is the same, but @math{x} is the only input so it's one transform at
  72. the evaluate stage and the pointwise multiplies are squares.  The
  73. interpolation is the same.
  74. For a mod @math{2^N+1} product, an FFT-@math{k} is an @m{O(N^{k/(k-1)}),
  75. O(N^(k/(k-1)))} algorithm, the exponent representing @math{2^k} recursed
  76. modular multiplies each @m{1/2^{k-1},1/2^(k-1)} the size of the original.
  77. Each successive @math{k} is an asymptotic improvement, but overheads mean each
  78. is only faster at bigger and bigger sizes.  In the code, @code{MUL_FFT_TABLE}
  79. and @code{SQR_FFT_TABLE} are the thresholds where each @math{k} is used.  Each
  80. new @math{k} effectively swaps some multiplying for some shifts, adds and
  81. overheads.
  82. A mod @math{2^N+1} product can be formed with a normal
  83. @math{N@cross{}N@rightarrow{}2N} bit multiply plus a subtraction, so an FFT
  84. and Toom-3 etc can be compared directly.  A @math{k=4} FFT at
  85. @math{O(N^@W{1.333})} can be expected to be the first faster than Toom-3 at
  86. @math{O(N^@W{1.465})}.  In practice this is what's found, with
  87. @code{MUL_FFT_MODF_THRESHOLD} and @code{SQR_FFT_MODF_THRESHOLD} being between
  88. 300 and 1000 limbs, depending on the CPU@.  So far it's been found that only
  89. very large FFTs recurse into pointwise multiplies above these sizes.
  90. When an FFT is to give a full product, the change of @math{N} to @math{2N}
  91. doesn't alter the theoretical complexity for a given @math{k}, but for the
  92. purposes of considering where an FFT might be first used it can be assumed
  93. that the FFT is recursing into a normal multiply and that on that basis it's
  94. doing @math{2^k} recursed multiplies each @m{1/2^{k-2},1/2^(k-2)} the size of
  95. the inputs, making it @m{O(N^{k/(k-2)}), O(N^(k/(k-2)))}.  This would mean
  96. @math{k=7} at @math{O(N^@W{1.4})} would be the first FFT faster than Toom-3.
  97. In practice @code{MUL_FFT_THRESHOLD} and @code{SQR_FFT_THRESHOLD} have been
  98. found to be in the @math{k=8} range, somewhere between 3000 and 10000 limbs.
  99. The way @math{N} is split into @math{2^k} pieces and then @math{2M+k+3} is
  100. rounded up to a multiple of @math{2^k} and @code{mp_bits_per_limb} means that
  101. when @math{2^k@ge{}@nicode{mp_bits_per_limb}} the effective @math{N} is a
  102. multiple of @m{2^{2k-1},2^(2k-1)} bits.  The @math{+k+3} means some values of
  103. @math{N} just under such a multiple will be rounded to the next.  The
  104. complexity calculations above assume that a favourable size is used, meaning
  105. one which isn't padded through rounding, and it's also assumed that the extra
  106. @math{+k+3} bits are negligible at typical FFT sizes.
  107. The practical effect of the @m{2^{2k-1},2^(2k-1)} constraint is to introduce a
  108. step-effect into measured speeds.  For example @math{k=8} will round @math{N}
  109. up to a multiple of 32768 bits, so for a 32-bit limb there'll be 512 limb
  110. groups of sizes for which @code{mpn_mul_n} runs at the same speed.  Or for
  111. @math{k=9} groups of 2048 limbs, @math{k=10} groups of 8192 limbs, etc.  In
  112. practice it's been found each @math{k} is used at quite small multiples of its
  113. size constraint and so the step effect is quite noticeable in a time versus
  114. size graph.
  115. The threshold determinations currently measure at the mid-points of size
  116. steps, but this is sub-optimal since at the start of a new step it can happen
  117. that it's better to go back to the previous @math{k} for a while.  Something
  118. more sophisticated for @code{MUL_FFT_TABLE} and @code{SQR_FFT_TABLE} will be
  119. needed.
  120. @node Other Multiplication, Unbalanced Multiplication, FFT Multiplication, Multiplication Algorithms
  121. @subsection Other Multiplication
  122. @cindex Toom multiplication
  123. The Toom algorithms described above (@pxref{Toom 3-Way Multiplication},
  124. @pxref{Toom 4-Way Multiplication}) generalizes to split into an arbitrary
  125. number of pieces, as per Knuth section 4.3.3 algorithm C@.  This is not
  126. currently used.  The notes here are merely for interest.
  127. In general a split into @math{r+1} pieces is made, and evaluations and
  128. pointwise multiplications done at @m{2r+1,2*r+1} points.  A 4-way split does 7
  129. pointwise multiplies, 5-way does 9, etc.  Asymptotically an @math{(r+1)}-way
  130. algorithm is @m{O(N^{log(2r+1)/log(r+1)}, O(N^(log(2*r+1)/log(r+1)))}.  Only
  131. the pointwise multiplications count towards big-@math{O} complexity, but the
  132. time spent in the evaluate and interpolate stages grows with @math{r} and has
  133. a significant practical impact, with the asymptotic advantage of each @math{r}
  134. realized only at bigger and bigger sizes.  The overheads grow as
  135. @m{O(Nr),O(N*r)}, whereas in an @math{r=2^k} FFT they grow only as @m{O(N log
  136. r), O(N*log(r))}.
  137. Knuth algorithm C evaluates at points 0,1,2,@dots{},@m{2r,2*r}, but exercise 4
  138. uses @math{-r},@dots{},0,@dots{},@math{r} and the latter saves some small
  139. multiplies in the evaluate stage (or rather trades them for additions), and
  140. has a further saving of nearly half the interpolate steps.  The idea is to
  141. separate odd and even final coefficients and then perform algorithm C steps C7
  142. and C8 on them separately.  The divisors at step C7 become @math{j^2} and the
  143. multipliers at C8 become @m{2tj-j^2,2*t*j-j^2}.
  144. Splitting odd and even parts through positive and negative points can be
  145. thought of as using @math{-1} as a square root of unity.  If a 4th root of
  146. unity was available then a further split and speedup would be possible, but no
  147. such root exists for plain integers.  Going to complex integers with
  148. @m{i=sqrt{-1}, i=sqrt(-1)} doesn't help, essentially because in Cartesian
  149. form it takes three real multiplies to do a complex multiply.  The existence
  150. of @m{2^k,2^k'}th roots of unity in a suitable ring or field lets the fast
  151. Fourier transform keep splitting and get to @m{O(N log r), O(N*log(r))}.
  152. Floating point FFTs use complex numbers approximating Nth roots of unity.
  153. Some processors have special support for such FFTs.  But these are not used in
  154. GMP since it's very difficult to guarantee an exact result (to some number of
  155. bits).  An occasional difference of 1 in the last bit might not matter to a
  156. typical signal processing algorithm, but is of course of vital importance to
  157. GMP.
  158. @node Unbalanced Multiplication,  , Other Multiplication, Multiplication Algorithms
  159. @subsection Unbalanced Multiplication
  160. @cindex Unbalanced multiplication
  161. Multiplication of operands with different sizes, both below
  162. @code{MUL_TOOM22_THRESHOLD} are done with plain schoolbook multiplication
  163. (@pxref{Basecase Multiplication}).
  164. For really large operands, we invoke FFT directly.
  165. For operands between these sizes, we use Toom inspired algorithms suggested by
  166. Alberto Zanoni and Marco Bodrato.  The idea is to split the operands into
  167. polynomials of different degree.  GMP currently splits the smaller operand
  168. onto 2 coefficients, i.e., a polynomial of degree 1, but the larger operand
  169. can be split into 2, 3, or 4 coefficients, i.e., a polynomial of degree 1 to
  170. 3.
  171. @c FIXME: This is mighty ugly, but a cleaner @need triggers texinfo bugs that
  172. @c screws up layout here and there in the rest of the manual.
  173. @c @tex
  174. @c goodbreak
  175. @c @end tex
  176. @node Division Algorithms, Greatest Common Divisor Algorithms, Multiplication Algorithms, Algorithms
  177. @section Division Algorithms
  178. @cindex Division algorithms
  179. @menu
  180. * Single Limb Division::
  181. * Basecase Division::
  182. * Divide and Conquer Division::
  183. * Block-Wise Barrett Division::
  184. * Exact Division::
  185. * Exact Remainder::
  186. * Small Quotient Division::
  187. @end menu
  188. @node Single Limb Division, Basecase Division, Division Algorithms, Division Algorithms
  189. @subsection Single Limb Division
  190. N@cross{}1 division is implemented using repeated 2@cross{}1 divisions from
  191. high to low, either with a hardware divide instruction or a multiplication by
  192. inverse, whichever is best on a given CPU.
  193. The multiply by inverse follows ``Improved division by invariant integers'' by
  194. M@"oller and Granlund (@pxref{References}) and is implemented as
  195. @code{udiv_qrnnd_preinv} in @file{gmp-impl.h}.  The idea is to have a
  196. fixed-point approximation to @math{1/d} (see @code{invert_limb}) and then
  197. multiply by the high limb (plus one bit) of the dividend to get a quotient
  198. @math{q}.  With @math{d} normalized (high bit set), @math{q} is no more than 1
  199. too small.  Subtracting @m{qd,q*d} from the dividend gives a remainder, and
  200. reveals whether @math{q} or @math{q-1} is correct.
  201. The result is a division done with two multiplications and four or five
  202. arithmetic operations.  On CPUs with low latency multipliers this can be much
  203. faster than a hardware divide, though the cost of calculating the inverse at
  204. the start may mean it's only better on inputs bigger than say 4 or 5 limbs.
  205. When a divisor must be normalized, either for the generic C
  206. @code{__udiv_qrnnd_c} or the multiply by inverse, the division performed is
  207. actually @m{a2^k,a*2^k} by @m{d2^k,d*2^k} where @math{a} is the dividend and
  208. @math{k} is the power necessary to have the high bit of @m{d2^k,d*2^k} set.
  209. The bit shifts for the dividend are usually accomplished ``on the fly''
  210. meaning by extracting the appropriate bits at each step.  Done this way the
  211. quotient limbs come out aligned ready to store.  When only the remainder is
  212. wanted, an alternative is to take the dividend limbs unshifted and calculate
  213. @m{r = a bmod d2^k, r = a mod d*2^k} followed by an extra final step @m{r2^k
  214. bmod d2^k, r*2^k mod d*2^k}.  This can help on CPUs with poor bit shifts or
  215. few registers.
  216. The multiply by inverse can be done two limbs at a time.  The calculation is
  217. basically the same, but the inverse is two limbs and the divisor treated as if
  218. padded with a low zero limb.  This means more work, since the inverse will
  219. need a 2@cross{}2 multiply, but the four 1@cross{}1s to do that are
  220. independent and can therefore be done partly or wholly in parallel.  Likewise
  221. for a 2@cross{}1 calculating @m{qd,q*d}.  The net effect is to process two
  222. limbs with roughly the same two multiplies worth of latency that one limb at a
  223. time gives.  This extends to 3 or 4 limbs at a time, though the extra work to
  224. apply the inverse will almost certainly soon reach the limits of multiplier
  225. throughput.
  226. A similar approach in reverse can be taken to process just half a limb at a
  227. time if the divisor is only a half limb.  In this case the 1@cross{}1 multiply
  228. for the inverse effectively becomes two @m{{1over2}times1, (1/2)x1} for each
  229. limb, which can be a saving on CPUs with a fast half limb multiply, or in fact
  230. if the only multiply is a half limb, and especially if it's not pipelined.
  231. @node Basecase Division, Divide and Conquer Division, Single Limb Division, Division Algorithms
  232. @subsection Basecase Division
  233. Basecase N@cross{}M division is like long division done by hand, but in base
  234. @m{2GMPraise{@code{mp_bits_per_limb}}, 2^mp_bits_per_limb}.  See Knuth
  235. section 4.3.1 algorithm D, and @file{mpn/generic/sb_divrem_mn.c}.
  236. Briefly stated, while the dividend remains larger than the divisor, a high
  237. quotient limb is formed and the N@cross{}1 product @m{qd,q*d} subtracted at
  238. the top end of the dividend.  With a normalized divisor (most significant bit
  239. set), each quotient limb can be formed with a 2@cross{}1 division and a
  240. 1@cross{}1 multiplication plus some subtractions.  The 2@cross{}1 division is
  241. by the high limb of the divisor and is done either with a hardware divide or a
  242. multiply by inverse (the same as in @ref{Single Limb Division}) whichever is
  243. faster.  Such a quotient is sometimes one too big, requiring an addback of the
  244. divisor, but that happens rarely.
  245. With Q=N@minus{}M being the number of quotient limbs, this is an
  246. @m{O(QM),O(Q*M)} algorithm and will run at a speed similar to a basecase
  247. Q@cross{}M multiplication, differing in fact only in the extra multiply and
  248. divide for each of the Q quotient limbs.
  249. @node Divide and Conquer Division, Block-Wise Barrett Division, Basecase Division, Division Algorithms
  250. @subsection Divide and Conquer Division
  251. For divisors larger than @code{DC_DIV_QR_THRESHOLD}, division is done by dividing.
  252. Or to be precise by a recursive divide and conquer algorithm based on work by
  253. Moenck and Borodin, Jebelean, and Burnikel and Ziegler (@pxref{References}).
  254. The algorithm consists essentially of recognising that a 2N@cross{}N division
  255. can be done with the basecase division algorithm (@pxref{Basecase Division}),
  256. but using N/2 limbs as a base, not just a single limb.  This way the
  257. multiplications that arise are (N/2)@cross{}(N/2) and can take advantage of
  258. Karatsuba and higher multiplication algorithms (@pxref{Multiplication
  259. Algorithms}).  The two ``digits'' of the quotient are formed by recursive
  260. N@cross{}(N/2) divisions.
  261. If the (N/2)@cross{}(N/2) multiplies are done with a basecase multiplication
  262. then the work is about the same as a basecase division, but with more function
  263. call overheads and with some subtractions separated from the multiplies.
  264. These overheads mean that it's only when N/2 is above
  265. @code{MUL_TOOM22_THRESHOLD} that divide and conquer is of use.
  266. @code{DC_DIV_QR_THRESHOLD} is based on the divisor size N, so it will be somewhere
  267. above twice @code{MUL_TOOM22_THRESHOLD}, but how much above depends on the
  268. CPU@.  An optimized @code{mpn_mul_basecase} can lower @code{DC_DIV_QR_THRESHOLD} a
  269. little by offering a ready-made advantage over repeated @code{mpn_submul_1}
  270. calls.
  271. Divide and conquer is asymptotically @m{O(M(N)log N),O(M(N)*log(N))} where
  272. @math{M(N)} is the time for an N@cross{}N multiplication done with FFTs.  The
  273. actual time is a sum over multiplications of the recursed sizes, as can be
  274. seen near the end of section 2.2 of Burnikel and Ziegler.  For example, within
  275. the Toom-3 range, divide and conquer is @m{2.63M(N), 2.63*M(N)}.  With higher
  276. algorithms the @math{M(N)} term improves and the multiplier tends to @m{log
  277. N, log(N)}.  In practice, at moderate to large sizes, a 2N@cross{}N division
  278. is about 2 to 4 times slower than an N@cross{}N multiplication.
  279. @node Block-Wise Barrett Division, Exact Division, Divide and Conquer Division, Division Algorithms
  280. @subsection Block-Wise Barrett Division
  281. For the largest divisions, a block-wise Barrett division algorithm is used.
  282. Here, the divisor is inverted to a precision determined by the relative size of
  283. the dividend and divisor.  Blocks of quotient limbs are then generated by
  284. multiplying blocks from the dividend by the inverse.
  285. Our block-wise algorithm computes a smaller inverse than in the plain Barrett
  286. algorithm.  For a @math{2n/n} division, the inverse will be just @m{lceil n/2
  287. rceil, ceil(n/2)} limbs.
  288. @node Exact Division, Exact Remainder, Block-Wise Barrett Division, Division Algorithms
  289. @subsection Exact Division
  290. A so-called exact division is when the dividend is known to be an exact
  291. multiple of the divisor.  Jebelean's exact division algorithm uses this
  292. knowledge to make some significant optimizations (@pxref{References}).
  293. The idea can be illustrated in decimal for example with 368154 divided by
  294. 543.  Because the low digit of the dividend is 4, the low digit of the
  295. quotient must be 8.  This is arrived at from @m{4 mathord{times} 7 bmod 10,
  296. 4*7 mod 10}, using the fact 7 is the modular inverse of 3 (the low digit of
  297. the divisor), since @m{3 mathord{times} 7 mathop{equiv} 1 bmod 10, 3*7
  298. @equiv{} 1 mod 10}.  So @m{8mathord{times}543 = 4344,8*543=4344} can be
  299. subtracted from the dividend leaving 363810.  Notice the low digit has become
  300. zero.
  301. The procedure is repeated at the second digit, with the next quotient digit 7
  302. (@m{1 mathord{times} 7 bmod 10, 7 @equiv{} 1*7 mod 10}), subtracting
  303. @m{7mathord{times}543 = 3801,7*543=3801}, leaving 325800.  And finally at
  304. the third digit with quotient digit 6 (@m{8 mathord{times} 7 bmod 10, 8*7
  305. mod 10}), subtracting @m{6mathord{times}543 = 3258,6*543=3258} leaving 0.
  306. So the quotient is 678.
  307. Notice however that the multiplies and subtractions don't need to extend past
  308. the low three digits of the dividend, since that's enough to determine the
  309. three quotient digits.  For the last quotient digit no subtraction is needed
  310. at all.  On a 2N@cross{}N division like this one, only about half the work of
  311. a normal basecase division is necessary.
  312. For an N@cross{}M exact division producing Q=N@minus{}M quotient limbs, the
  313. saving over a normal basecase division is in two parts.  Firstly, each of the
  314. Q quotient limbs needs only one multiply, not a 2@cross{}1 divide and
  315. multiply.  Secondly, the crossproducts are reduced when @math{Q>M} to
  316. @m{QM-M(M+1)/2,Q*M-M*(M+1)/2}, or when @math{Q@le{}M} to @m{Q(Q-1)/2,
  317. Q*(Q-1)/2}.  Notice the savings are complementary.  If Q is big then many
  318. divisions are saved, or if Q is small then the crossproducts reduce to a small
  319. number.
  320. The modular inverse used is calculated efficiently by @code{binvert_limb} in
  321. @file{gmp-impl.h}.  This does four multiplies for a 32-bit limb, or six for a
  322. 64-bit limb.  @file{tune/modlinv.c} has some alternate implementations that
  323. might suit processors better at bit twiddling than multiplying.
  324. The sub-quadratic exact division described by Jebelean in ``Exact Division
  325. with Karatsuba Complexity'' is not currently implemented.  It uses a
  326. rearrangement similar to the divide and conquer for normal division
  327. (@pxref{Divide and Conquer Division}), but operating from low to high.  A
  328. further possibility not currently implemented is ``Bidirectional Exact Integer
  329. Division'' by Krandick and Jebelean which forms quotient limbs from both the
  330. high and low ends of the dividend, and can halve once more the number of
  331. crossproducts needed in a 2N@cross{}N division.
  332. A special case exact division by 3 exists in @code{mpn_divexact_by3},
  333. supporting Toom-3 multiplication and @code{mpq} canonicalizations.  It forms
  334. quotient digits with a multiply by the modular inverse of 3 (which is
  335. @code{0xAA..AAB}) and uses two comparisons to determine a borrow for the next
  336. limb.  The multiplications don't need to be on the dependent chain, as long as
  337. the effect of the borrows is applied, which can help chips with pipelined
  338. multipliers.
  339. @node Exact Remainder, Small Quotient Division, Exact Division, Division Algorithms
  340. @subsection Exact Remainder
  341. @cindex Exact remainder
  342. If the exact division algorithm is done with a full subtraction at each stage
  343. and the dividend isn't a multiple of the divisor, then low zero limbs are
  344. produced but with a remainder in the high limbs.  For dividend @math{a},
  345. divisor @math{d}, quotient @math{q}, and @m{b = 2
  346. GMPraise{@code{mp_bits_per_limb}}, b = 2^mp_bits_per_limb}, this remainder
  347. @math{r} is of the form
  348. @tex
  349. $$ a = qd + r b^n $$
  350. @end tex
  351. @ifnottex
  352. @example
  353. a = q*d + r*b^n
  354. @end example
  355. @end ifnottex
  356. @math{n} represents the number of zero limbs produced by the subtractions,
  357. that being the number of limbs produced for @math{q}.  @math{r} will be in the
  358. range @math{0@le{}r<d} and can be viewed as a remainder, but one shifted up by
  359. a factor of @math{b^n}.
  360. Carrying out full subtractions at each stage means the same number of cross
  361. products must be done as a normal division, but there's still some single limb
  362. divisions saved.  When @math{d} is a single limb some simplifications arise,
  363. providing good speedups on a number of processors.
  364. @code{mpn_divexact_by3}, @code{mpn_modexact_1_odd} and the @code{mpn_redc_X}
  365. functions differ subtly in how they return @math{r}, leading to some negations
  366. in the above formula, but all are essentially the same.
  367. @cindex Divisibility algorithm
  368. @cindex Congruence algorithm
  369. Clearly @math{r} is zero when @math{a} is a multiple of @math{d}, and this
  370. leads to divisibility or congruence tests which are potentially more efficient
  371. than a normal division.
  372. The factor of @math{b^n} on @math{r} can be ignored in a GCD when @math{d} is
  373. odd, hence the use of @code{mpn_modexact_1_odd} by @code{mpn_gcd_1} and
  374. @code{mpz_kronecker_ui} etc (@pxref{Greatest Common Divisor Algorithms}).
  375. Montgomery's REDC method for modular multiplications uses operands of the form
  376. of @m{xb^{-n}, x*b^-n} and @m{yb^{-n}, y*b^-n} and on calculating @m{(xb^{-n})
  377. (yb^{-n}), (x*b^-n)*(y*b^-n)} uses the factor of @math{b^n} in the exact
  378. remainder to reach a product in the same form @m{(xy)b^{-n}, (x*y)*b^-n}
  379. (@pxref{Modular Powering Algorithm}).
  380. Notice that @math{r} generally gives no useful information about the ordinary
  381. remainder @math{a @bmod d} since @math{b^n @bmod d} could be anything.  If
  382. however @math{b^n @equiv{} 1 @bmod d}, then @math{r} is the negative of the
  383. ordinary remainder.  This occurs whenever @math{d} is a factor of
  384. @math{b^n-1}, as for example with 3 in @code{mpn_divexact_by3}.  For a 32 or
  385. 64 bit limb other such factors include 5, 17 and 257, but no particular use
  386. has been found for this.
  387. @node Small Quotient Division,  , Exact Remainder, Division Algorithms
  388. @subsection Small Quotient Division
  389. An N@cross{}M division where the number of quotient limbs Q=N@minus{}M is
  390. small can be optimized somewhat.
  391. An ordinary basecase division normalizes the divisor by shifting it to make
  392. the high bit set, shifting the dividend accordingly, and shifting the
  393. remainder back down at the end of the calculation.  This is wasteful if only a
  394. few quotient limbs are to be formed.  Instead a division of just the top
  395. @m{rm2Q,2*Q} limbs of the dividend by the top Q limbs of the divisor can be
  396. used to form a trial quotient.  This requires only those limbs normalized, not
  397. the whole of the divisor and dividend.
  398. A multiply and subtract then applies the trial quotient to the M@minus{}Q
  399. unused limbs of the divisor and N@minus{}Q dividend limbs (which includes Q
  400. limbs remaining from the trial quotient division).  The starting trial
  401. quotient can be 1 or 2 too big, but all cases of 2 too big and most cases of 1
  402. too big are detected by first comparing the most significant limbs that will
  403. arise from the subtraction.  An addback is done if the quotient still turns
  404. out to be 1 too big.
  405. This whole procedure is essentially the same as one step of the basecase
  406. algorithm done in a Q limb base, though with the trial quotient test done only
  407. with the high limbs, not an entire Q limb ``digit'' product.  The correctness
  408. of this weaker test can be established by following the argument of Knuth
  409. section 4.3.1 exercise 20 but with the @m{v_2 GMPhat q > b GMPhat r
  410. + u_2, v2*q>b*r+u2} condition appropriately relaxed.
  411. @need 1000
  412. @node Greatest Common Divisor Algorithms, Powering Algorithms, Division Algorithms, Algorithms
  413. @section Greatest Common Divisor
  414. @cindex Greatest common divisor algorithms
  415. @cindex GCD algorithms
  416. @menu
  417. * Binary GCD::
  418. * Lehmer's Algorithm::
  419. * Subquadratic GCD::
  420. * Extended GCD::
  421. * Jacobi Symbol::
  422. @end menu
  423. @node Binary GCD, Lehmer's Algorithm, Greatest Common Divisor Algorithms, Greatest Common Divisor Algorithms
  424. @subsection Binary GCD
  425. At small sizes GMP uses an @math{O(N^2)} binary style GCD@.  This is described
  426. in many textbooks, for example Knuth section 4.5.2 algorithm B@.  It simply
  427. consists of successively reducing odd operands @math{a} and @math{b} using
  428. @quotation
  429. @math{a,b = @abs{}(a-b),@min{}(a,b)} @*
  430. strip factors of 2 from @math{a}
  431. @end quotation
  432. The Euclidean GCD algorithm, as per Knuth algorithms E and A, repeatedly
  433. computes the quotient @m{q = lfloor a/b rfloor, q = floor(a/b)} and replaces
  434. @math{a,b} by @math{v, u - q v}. The binary algorithm has so far been found to
  435. be faster than the Euclidean algorithm everywhere.  One reason the binary
  436. method does well is that the implied quotient at each step is usually small,
  437. so often only one or two subtractions are needed to get the same effect as a
  438. division.  Quotients 1, 2 and 3 for example occur 67.7% of the time, see Knuth
  439. section 4.5.3 Theorem E.
  440. When the implied quotient is large, meaning @math{b} is much smaller than
  441. @math{a}, then a division is worthwhile.  This is the basis for the initial
  442. @math{a @bmod b} reductions in @code{mpn_gcd} and @code{mpn_gcd_1} (the latter
  443. for both N@cross{}1 and 1@cross{}1 cases).  But after that initial reduction,
  444. big quotients occur too rarely to make it worth checking for them.
  445. @sp 1
  446. The final @math{1@cross{}1} GCD in @code{mpn_gcd_1} is done in the generic C
  447. code as described above.  For two N-bit operands, the algorithm takes about
  448. 0.68 iterations per bit.  For optimum performance some attention needs to be
  449. paid to the way the factors of 2 are stripped from @math{a}.
  450. Firstly it may be noted that in twos complement the number of low zero bits on
  451. @math{a-b} is the same as @math{b-a}, so counting or testing can begin on
  452. @math{a-b} without waiting for @math{@abs{}(a-b)} to be determined.
  453. A loop stripping low zero bits tends not to branch predict well, since the
  454. condition is data dependent.  But on average there's only a few low zeros, so
  455. an option is to strip one or two bits arithmetically then loop for more (as
  456. done for AMD K6).  Or use a lookup table to get a count for several bits then
  457. loop for more (as done for AMD K7).  An alternative approach is to keep just
  458. one of @math{a} or @math{b} odd and iterate
  459. @quotation
  460. @math{a,b = @abs{}(a-b), @min{}(a,b)} @*
  461. @math{a = a/2} if even @*
  462. @math{b = b/2} if even
  463. @end quotation
  464. This requires about 1.25 iterations per bit, but stripping of a single bit at
  465. each step avoids any branching.  Repeating the bit strip reduces to about 0.9
  466. iterations per bit, which may be a worthwhile tradeoff.
  467. Generally with the above approaches a speed of perhaps 6 cycles per bit can be
  468. achieved, which is still not terribly fast with for instance a 64-bit GCD
  469. taking nearly 400 cycles.  It's this sort of time which means it's not usually
  470. advantageous to combine a set of divisibility tests into a GCD.
  471. Currently, the binary algorithm is used for GCD only when @math{N < 3}.
  472. @node Lehmer's Algorithm, Subquadratic GCD, Binary GCD, Greatest Common Divisor Algorithms
  473. @comment  node-name,  next,  previous,  up
  474. @subsection Lehmer's algorithm
  475. Lehmer's improvement of the Euclidean algorithms is based on the observation
  476. that the initial part of the quotient sequence depends only on the most
  477. significant parts of the inputs. The variant of Lehmer's algorithm used in GMP
  478. splits off the most significant two limbs, as suggested, e.g., in ``A
  479. Double-Digit Lehmer-Euclid Algorithm'' by Jebelean (@pxref{References}). The
  480. quotients of two double-limb inputs are collected as a 2 by 2 matrix with
  481. single-limb elements. This is done by the function @code{mpn_hgcd2}. The
  482. resulting matrix is applied to the inputs using @code{mpn_mul_1} and
  483. @code{mpn_submul_1}. Each iteration usually reduces the inputs by almost one
  484. limb. In the rare case of a large quotient, no progress can be made by
  485. examining just the most significant two limbs, and the quotient is computing
  486. using plain division.
  487. The resulting algorithm is asymptotically @math{O(N^2)}, just as the Euclidean
  488. algorithm and the binary algorithm. The quadratic part of the work are
  489. the calls to @code{mpn_mul_1} and @code{mpn_submul_1}. For small sizes, the
  490. linear work is also significant. There are roughly @math{N} calls to the
  491. @code{mpn_hgcd2} function. This function uses a couple of important
  492. optimizations:
  493. @itemize
  494. @item
  495. It uses the same relaxed notion of correctness as @code{mpn_hgcd} (see next
  496. section). This means that when called with the most significant two limbs of
  497. two large numbers, the returned matrix does not always correspond exactly to
  498. the initial quotient sequence for the two large numbers; the final quotient
  499. may sometimes be one off.
  500. @item
  501. It takes advantage of the fact the quotients are usually small. The division
  502. operator is not used, since the corresponding assembler instruction is very
  503. slow on most architectures. (This code could probably be improved further, it
  504. uses many branches that are unfriendly to prediction).
  505. @item
  506. It switches from double-limb calculations to single-limb calculations half-way
  507. through, when the input numbers have been reduced in size from two limbs to
  508. one and a half.
  509. @end itemize
  510. @node Subquadratic GCD, Extended GCD, Lehmer's Algorithm, Greatest Common Divisor Algorithms
  511. @subsection Subquadratic GCD
  512. For inputs larger than @code{GCD_DC_THRESHOLD}, GCD is computed via the HGCD
  513. (Half GCD) function, as a generalization to Lehmer's algorithm.
  514. Let the inputs @math{a,b} be of size @math{N} limbs each. Put @m{S=lfloor N/2
  515. rfloor + 1, S = floor(N/2) + 1}. Then HGCD(a,b) returns a transformation
  516. matrix @math{T} with non-negative elements, and reduced numbers @math{(c;d) =
  517. T^{-1} (a;b)}. The reduced numbers @math{c,d} must be larger than @math{S}
  518. limbs, while their difference @math{abs(c-d)} must fit in @math{S} limbs. The
  519. matrix elements will also be of size roughly @math{N/2}.
  520. The HGCD base case uses Lehmer's algorithm, but with the above stop condition
  521. that returns reduced numbers and the corresponding transformation matrix
  522. half-way through. For inputs larger than @code{HGCD_THRESHOLD}, HGCD is
  523. computed recursively, using the divide and conquer algorithm in ``On
  524. Sch@"onhage's algorithm and subquadratic integer GCD computation'' by M@"oller
  525. (@pxref{References}). The recursive algorithm consists of these main
  526. steps.
  527. @itemize
  528. @item
  529. Call HGCD recursively, on the most significant @math{N/2} limbs. Apply the
  530. resulting matrix @math{T_1} to the full numbers, reducing them to a size just
  531. above @math{3N/2}.
  532. @item
  533. Perform a small number of division or subtraction steps to reduce the numbers
  534. to size below @math{3N/2}. This is essential mainly for the unlikely case of
  535. large quotients.
  536. @item
  537. Call HGCD recursively, on the most significant @math{N/2} limbs of the reduced
  538. numbers. Apply the resulting matrix @math{T_2} to the full numbers, reducing
  539. them to a size just above @math{N/2}.
  540. @item
  541. Compute @math{T = T_1 T_2}.
  542. @item
  543. Perform a small number of division and subtraction steps to satisfy the
  544. requirements, and return.
  545. @end itemize
  546. GCD is then implemented as a loop around HGCD, similarly to Lehmer's
  547. algorithm. Where Lehmer repeatedly chops off the top two limbs, calls
  548. @code{mpn_hgcd2}, and applies the resulting matrix to the full numbers, the
  549. subquadratic GCD chops off the most significant third of the limbs (the
  550. proportion is a tuning parameter, and @math{1/3} seems to be more efficient
  551. than, e.g, @math{1/2}), calls @code{mpn_hgcd}, and applies the resulting
  552. matrix. Once the input numbers are reduced to size below
  553. @code{GCD_DC_THRESHOLD}, Lehmer's algorithm is used for the rest of the work.
  554. The asymptotic running time of both HGCD and GCD is @m{O(M(N)log N),O(M(N)*log(N))},
  555. where @math{M(N)} is the time for multiplying two @math{N}-limb numbers.
  556. @comment  node-name,  next,  previous,  up
  557. @node Extended GCD, Jacobi Symbol, Subquadratic GCD, Greatest Common Divisor Algorithms
  558. @subsection Extended GCD
  559. The extended GCD function, or GCDEXT, calculates @math{@gcd{}(a,b)} and also
  560. cofactors @math{x} and @math{y} satisfying @m{ax+by=gcd(a@C{}b),
  561. a*x+b*y=gcd(a@C{}b)}. All the algorithms used for plain GCD are extended to
  562. handle this case. The binary algorithm is used only for single-limb GCDEXT.
  563. Lehmer's algorithm is used for sizes up to @code{GCDEXT_DC_THRESHOLD}. Above
  564. this threshold, GCDEXT is implemented as a loop around HGCD, but with more
  565. book-keeping to keep track of the cofactors. This gives the same asymptotic
  566. running time as for GCD and HGCD, @m{O(M(N)log N),O(M(N)*log(N))}
  567. One difference to plain GCD is that while the inputs @math{a} and @math{b} are
  568. reduced as the algorithm proceeds, the cofactors @math{x} and @math{y} grow in
  569. size. This makes the tuning of the chopping-point more difficult. The current
  570. code chops off the most significant half of the inputs for the call to HGCD in
  571. the first iteration, and the most significant two thirds for the remaining
  572. calls. This strategy could surely be improved. Also the stop condition for the
  573. loop, where Lehmer's algorithm is invoked once the inputs are reduced below
  574. @code{GCDEXT_DC_THRESHOLD}, could maybe be improved by taking into account the
  575. current size of the cofactors.
  576. @node Jacobi Symbol,  , Extended GCD, Greatest Common Divisor Algorithms
  577. @subsection Jacobi Symbol
  578. @cindex Jacobi symbol algorithm
  579. @code{mpz_jacobi} and @code{mpz_kronecker} are currently implemented with a
  580. simple binary algorithm similar to that described for the GCDs (@pxref{Binary
  581. GCD}).  They're not very fast when both inputs are large.  Lehmer's multi-step
  582. improvement or a binary based multi-step algorithm is likely to be better.
  583. When one operand fits a single limb, and that includes @code{mpz_kronecker_ui}
  584. and friends, an initial reduction is done with either @code{mpn_mod_1} or
  585. @code{mpn_modexact_1_odd}, followed by the binary algorithm on a single limb.
  586. The binary algorithm is well suited to a single limb, and the whole
  587. calculation in this case is quite efficient.
  588. In all the routines sign changes for the result are accumulated using some bit
  589. twiddling, avoiding table lookups or conditional jumps.
  590. @need 1000
  591. @node Powering Algorithms, Root Extraction Algorithms, Greatest Common Divisor Algorithms, Algorithms
  592. @section Powering Algorithms
  593. @cindex Powering algorithms
  594. @menu
  595. * Normal Powering Algorithm::
  596. * Modular Powering Algorithm::
  597. @end menu
  598. @node Normal Powering Algorithm, Modular Powering Algorithm, Powering Algorithms, Powering Algorithms
  599. @subsection Normal Powering
  600. Normal @code{mpz} or @code{mpf} powering uses a simple binary algorithm,
  601. successively squaring and then multiplying by the base when a 1 bit is seen in
  602. the exponent, as per Knuth section 4.6.3.  The ``left to right''
  603. variant described there is used rather than algorithm A, since it's just as
  604. easy and can be done with somewhat less temporary memory.
  605. @node Modular Powering Algorithm,  , Normal Powering Algorithm, Powering Algorithms
  606. @subsection Modular Powering
  607. Modular powering is implemented using a @math{2^k}-ary sliding window
  608. algorithm, as per ``Handbook of Applied Cryptography'' algorithm 14.85
  609. (@pxref{References}).  @math{k} is chosen according to the size of the
  610. exponent.  Larger exponents use larger values of @math{k}, the choice being
  611. made to minimize the average number of multiplications that must supplement
  612. the squaring.
  613. The modular multiplies and squares use either a simple division or the REDC
  614. method by Montgomery (@pxref{References}).  REDC is a little faster,
  615. essentially saving N single limb divisions in a fashion similar to an exact
  616. remainder (@pxref{Exact Remainder}).
  617. @node Root Extraction Algorithms, Radix Conversion Algorithms, Powering Algorithms, Algorithms
  618. @section Root Extraction Algorithms
  619. @cindex Root extraction algorithms
  620. @menu
  621. * Square Root Algorithm::
  622. * Nth Root Algorithm::
  623. * Perfect Square Algorithm::
  624. * Perfect Power Algorithm::
  625. @end menu
  626. @node Square Root Algorithm, Nth Root Algorithm, Root Extraction Algorithms, Root Extraction Algorithms
  627. @subsection Square Root
  628. @cindex Square root algorithm
  629. @cindex Karatsuba square root algorithm
  630. Square roots are taken using the ``Karatsuba Square Root'' algorithm by Paul
  631. Zimmermann (@pxref{References}).
  632. An input @math{n} is split into four parts of @math{k} bits each, so with
  633. @math{b=2^k} we have @m{n = a_3b^3 + a_2b^2 + a_1b + a_0, n = a3*b^3 + a2*b^2
  634. + a1*b + a0}.  Part @ms{a,3} must be ``normalized'' so that either the high or
  635. second highest bit is set.  In GMP, @math{k} is kept on a limb boundary and
  636. the input is left shifted (by an even number of bits) to normalize.
  637. The square root of the high two parts is taken, by recursive application of
  638. the algorithm (bottoming out in a one-limb Newton's method),
  639. @tex
  640. $$ s',r' = mathop{rm sqrtrem} > (a_3b + a_2) $$
  641. @end tex
  642. @ifnottex
  643. @example
  644. s1,r1 = sqrtrem (a3*b + a2)
  645. @end example
  646. @end ifnottex
  647. This is an approximation to the desired root and is extended by a division to
  648. give @math{s},@math{r},
  649. @tex
  650. $$eqalign{
  651. q,u &= mathop{rm divrem} > (r'b + a_1, 2s') cr
  652. s &= s'b + q cr
  653. r &= ub + a_0 - q^2
  654. }$$
  655. @end tex
  656. @ifnottex
  657. @example
  658. q,u = divrem (r1*b + a1, 2*s1)
  659. s = s1*b + q
  660. r = u*b + a0 - q^2
  661. @end example
  662. @end ifnottex
  663. The normalization requirement on @ms{a,3} means at this point @math{s} is
  664. either correct or 1 too big.  @math{r} is negative in the latter case, so
  665. @tex
  666. $$eqalign{
  667. mathop{rm if} ; r &< 0 ; mathop{rm then} cr
  668. r &leftarrow r + 2s - 1 cr
  669. s &leftarrow s - 1
  670. }$$
  671. @end tex
  672. @ifnottex
  673. @example
  674. if r < 0 then
  675.   r = r + 2*s - 1
  676.   s = s - 1
  677. @end example
  678. @end ifnottex
  679. The algorithm is expressed in a divide and conquer form, but as noted in the
  680. paper it can also be viewed as a discrete variant of Newton's method, or as a
  681. variation on the schoolboy method (no longer taught) for square roots two
  682. digits at a time.
  683. If the remainder @math{r} is not required then usually only a few high limbs
  684. of @math{r} and @math{u} need to be calculated to determine whether an
  685. adjustment to @math{s} is required.  This optimization is not currently
  686. implemented.
  687. In the Karatsuba multiplication range this algorithm is @m{O({3over2}
  688. M(N/2)),O(1.5*M(N/2))}, where @math{M(n)} is the time to multiply two numbers
  689. of @math{n} limbs.  In the FFT multiplication range this grows to a bound of
  690. @m{O(6 M(N/2)),O(6*M(N/2))}.  In practice a factor of about 1.5 to 1.8 is
  691. found in the Karatsuba and Toom-3 ranges, growing to 2 or 3 in the FFT range.
  692. The algorithm does all its calculations in integers and the resulting
  693. @code{mpn_sqrtrem} is used for both @code{mpz_sqrt} and @code{mpf_sqrt}.
  694. The extended precision given by @code{mpf_sqrt_ui} is obtained by
  695. padding with zero limbs.
  696. @node Nth Root Algorithm, Perfect Square Algorithm, Square Root Algorithm, Root Extraction Algorithms
  697. @subsection Nth Root
  698. @cindex Root extraction algorithm
  699. @cindex Nth root algorithm
  700. Integer Nth roots are taken using Newton's method with the following
  701. iteration, where @math{A} is the input and @math{n} is the root to be taken.
  702. @tex
  703. $$a_{i+1} = {1over n} left({A over a_i^{n-1}} + (n-1)a_i right)$$
  704. @end tex
  705. @ifnottex
  706. @example
  707.          1         A
  708. a[i+1] = - * ( --------- + (n-1)*a[i] )
  709.          n     a[i]^(n-1)
  710. @end example
  711. @end ifnottex
  712. The initial approximation @m{a_1,a[1]} is generated bitwise by successively
  713. powering a trial root with or without new 1 bits, aiming to be just above the
  714. true root.  The iteration converges quadratically when started from a good
  715. approximation.  When @math{n} is large more initial bits are needed to get
  716. good convergence.  The current implementation is not particularly well
  717. optimized.
  718. @node Perfect Square Algorithm, Perfect Power Algorithm, Nth Root Algorithm, Root Extraction Algorithms
  719. @subsection Perfect Square
  720. @cindex Perfect square algorithm
  721. A significant fraction of non-squares can be quickly identified by checking
  722. whether the input is a quadratic residue modulo small integers.
  723. @code{mpz_perfect_square_p} first tests the input mod 256, which means just
  724. examining the low byte.  Only 44 different values occur for squares mod 256,
  725. so 82.8% of inputs can be immediately identified as non-squares.
  726. On a 32-bit system similar tests are done mod 9, 5, 7, 13 and 17, for a total
  727. 99.25% of inputs identified as non-squares.  On a 64-bit system 97 is tested
  728. too, for a total 99.62%.
  729. These moduli are chosen because they're factors of @math{2^@W{24}-1} (or
  730. @math{2^@W{48}-1} for 64-bits), and such a remainder can be quickly taken just
  731. using additions (see @code{mpn_mod_34lsub1}).
  732. When nails are in use moduli are instead selected by the @file{gen-psqr.c}
  733. program and applied with an @code{mpn_mod_1}.  The same @math{2^@W{24}-1} or
  734. @math{2^@W{48}-1} could be done with nails using some extra bit shifts, but
  735. this is not currently implemented.
  736. In any case each modulus is applied to the @code{mpn_mod_34lsub1} or
  737. @code{mpn_mod_1} remainder and a table lookup identifies non-squares.  By
  738. using a ``modexact'' style calculation, and suitably permuted tables, just one
  739. multiply each is required, see the code for details.  Moduli are also combined
  740. to save operations, so long as the lookup tables don't become too big.
  741. @file{gen-psqr.c} does all the pre-calculations.
  742. A square root must still be taken for any value that passes these tests, to
  743. verify it's really a square and not one of the small fraction of non-squares
  744. that get through (ie.@: a pseudo-square to all the tested bases).
  745. Clearly more residue tests could be done, @code{mpz_perfect_square_p} only
  746. uses a compact and efficient set.  Big inputs would probably benefit from more
  747. residue testing, small inputs might be better off with less.  The assumed
  748. distribution of squares versus non-squares in the input would affect such
  749. considerations.
  750. @node Perfect Power Algorithm,  , Perfect Square Algorithm, Root Extraction Algorithms
  751. @subsection Perfect Power
  752. @cindex Perfect power algorithm
  753. Detecting perfect powers is required by some factorization algorithms.
  754. Currently @code{mpz_perfect_power_p} is implemented using repeated Nth root
  755. extractions, though naturally only prime roots need to be considered.
  756. (@xref{Nth Root Algorithm}.)
  757. If a prime divisor @math{p} with multiplicity @math{e} can be found, then only
  758. roots which are divisors of @math{e} need to be considered, much reducing the
  759. work necessary.  To this end divisibility by a set of small primes is checked.
  760. @node Radix Conversion Algorithms, Other Algorithms, Root Extraction Algorithms, Algorithms
  761. @section Radix Conversion
  762. @cindex Radix conversion algorithms
  763. Radix conversions are less important than other algorithms.  A program
  764. dominated by conversions should probably use a different data representation.
  765. @menu
  766. * Binary to Radix::
  767. * Radix to Binary::
  768. @end menu
  769. @node Binary to Radix, Radix to Binary, Radix Conversion Algorithms, Radix Conversion Algorithms
  770. @subsection Binary to Radix
  771. Conversions from binary to a power-of-2 radix use a simple and fast
  772. @math{O(N)} bit extraction algorithm.
  773. Conversions from binary to other radices use one of two algorithms.  Sizes
  774. below @code{GET_STR_PRECOMPUTE_THRESHOLD} use a basic @math{O(N^2)} method.
  775. Repeated divisions by @math{b^n} are made, where @math{b} is the radix and
  776. @math{n} is the biggest power that fits in a limb.  But instead of simply
  777. using the remainder @math{r} from such divisions, an extra divide step is done
  778. to give a fractional limb representing @math{r/b^n}.  The digits of @math{r}
  779. can then be extracted using multiplications by @math{b} rather than divisions.
  780. Special case code is provided for decimal, allowing multiplications by 10 to
  781. optimize to shifts and adds.
  782. Above @code{GET_STR_PRECOMPUTE_THRESHOLD} a sub-quadratic algorithm is used.
  783. For an input @math{t}, powers @m{b^{n2^i},b^(n*2^i)} of the radix are
  784. calculated, until a power between @math{t} and @m{sqrt{t},sqrt(t)} is
  785. reached.  @math{t} is then divided by that largest power, giving a quotient
  786. which is the digits above that power, and a remainder which is those below.
  787. These two parts are in turn divided by the second highest power, and so on
  788. recursively.  When a piece has been divided down to less than
  789. @code{GET_STR_DC_THRESHOLD} limbs, the basecase algorithm described above is
  790. used.
  791. The advantage of this algorithm is that big divisions can make use of the
  792. sub-quadratic divide and conquer division (@pxref{Divide and Conquer
  793. Division}), and big divisions tend to have less overheads than lots of
  794. separate single limb divisions anyway.  But in any case the cost of
  795. calculating the powers @m{b^{n2^i},b^(n*2^i)} must first be overcome.
  796. @code{GET_STR_PRECOMPUTE_THRESHOLD} and @code{GET_STR_DC_THRESHOLD} represent
  797. the same basic thing, the point where it becomes worth doing a big division to
  798. cut the input in half.  @code{GET_STR_PRECOMPUTE_THRESHOLD} includes the cost
  799. of calculating the radix power required, whereas @code{GET_STR_DC_THRESHOLD}
  800. assumes that's already available, which is the case when recursing.
  801. Since the base case produces digits from least to most significant but they
  802. want to be stored from most to least, it's necessary to calculate in advance
  803. how many digits there will be, or at least be sure not to underestimate that.
  804. For GMP the number of input bits is multiplied by @code{chars_per_bit_exactly}
  805. from @code{mp_bases}, rounding up.  The result is either correct or one too
  806. big.
  807. Examining some of the high bits of the input could increase the chance of
  808. getting the exact number of digits, but an exact result every time would not
  809. be practical, since in general the difference between numbers 100@dots{} and
  810. 99@dots{} is only in the last few bits and the work to identify 99@dots{}
  811. might well be almost as much as a full conversion.
  812. @code{mpf_get_str} doesn't currently use the algorithm described here, it
  813. multiplies or divides by a power of @math{b} to move the radix point to the
  814. just above the highest non-zero digit (or at worst one above that location),
  815. then multiplies by @math{b^n} to bring out digits.  This is @math{O(N^2)} and
  816. is certainly not optimal.
  817. The @math{r/b^n} scheme described above for using multiplications to bring out
  818. digits might be useful for more than a single limb.  Some brief experiments
  819. with it on the base case when recursing didn't give a noticeable improvement,
  820. but perhaps that was only due to the implementation.  Something similar would
  821. work for the sub-quadratic divisions too, though there would be the cost of
  822. calculating a bigger radix power.
  823. Another possible improvement for the sub-quadratic part would be to arrange
  824. for radix powers that balanced the sizes of quotient and remainder produced,
  825. ie.@: the highest power would be an @m{b^{nk},b^(n*k)} approximately equal to
  826. @m{sqrt{t},sqrt(t)}, not restricted to a @math{2^i} factor.  That ought to
  827. smooth out a graph of times against sizes, but may or may not be a net
  828. speedup.
  829. @node Radix to Binary,  , Binary to Radix, Radix Conversion Algorithms
  830. @subsection Radix to Binary
  831. @strong{This section needs to be rewritten, it currently describes the
  832. algorithms used before GMP 4.3.}
  833. Conversions from a power-of-2 radix into binary use a simple and fast
  834. @math{O(N)} bitwise concatenation algorithm.
  835. Conversions from other radices use one of two algorithms.  Sizes below
  836. @code{SET_STR_PRECOMPUTE_THRESHOLD} use a basic @math{O(N^2)} method.  Groups
  837. of @math{n} digits are converted to limbs, where @math{n} is the biggest
  838. power of the base @math{b} which will fit in a limb, then those groups are
  839. accumulated into the result by multiplying by @math{b^n} and adding.  This
  840. saves multi-precision operations, as per Knuth section 4.4 part E
  841. (@pxref{References}).  Some special case code is provided for decimal, giving
  842. the compiler a chance to optimize multiplications by 10.
  843. Above @code{SET_STR_PRECOMPUTE_THRESHOLD} a sub-quadratic algorithm is used.
  844. First groups of @math{n} digits are converted into limbs.  Then adjacent
  845. limbs are combined into limb pairs with @m{xb^n+y,x*b^n+y}, where @math{x}
  846. and @math{y} are the limbs.  Adjacent limb pairs are combined into quads
  847. similarly with @m{xb^{2n}+y,x*b^(2n)+y}.  This continues until a single block
  848. remains, that being the result.
  849. The advantage of this method is that the multiplications for each @math{x} are
  850. big blocks, allowing Karatsuba and higher algorithms to be used.  But the cost
  851. of calculating the powers @m{b^{n2^i},b^(n*2^i)} must be overcome.
  852. @code{SET_STR_PRECOMPUTE_THRESHOLD} usually ends up quite big, around 5000 digits, and on
  853. some processors much bigger still.
  854. @code{SET_STR_PRECOMPUTE_THRESHOLD} is based on the input digits (and tuned
  855. for decimal), though it might be better based on a limb count, so as to be
  856. independent of the base.  But that sort of count isn't used by the base case
  857. and so would need some sort of initial calculation or estimate.
  858. The main reason @code{SET_STR_PRECOMPUTE_THRESHOLD} is so much bigger than the
  859. corresponding @code{GET_STR_PRECOMPUTE_THRESHOLD} is that @code{mpn_mul_1} is
  860. much faster than @code{mpn_divrem_1} (often by a factor of 5, or more).
  861. @need 1000
  862. @node Other Algorithms, Assembly Coding, Radix Conversion Algorithms, Algorithms
  863. @section Other Algorithms
  864. @menu
  865. * Prime Testing Algorithm::
  866. * Factorial Algorithm::
  867. * Binomial Coefficients Algorithm::
  868. * Fibonacci Numbers Algorithm::
  869. * Lucas Numbers Algorithm::
  870. * Random Number Algorithms::
  871. @end menu
  872. @node Prime Testing Algorithm, Factorial Algorithm, Other Algorithms, Other Algorithms
  873. @subsection Prime Testing
  874. @cindex Prime testing algorithms
  875. The primality testing in @code{mpz_probab_prime_p} (@pxref{Number Theoretic
  876. Functions}) first does some trial division by small factors and then uses the
  877. Miller-Rabin probabilistic primality testing algorithm, as described in Knuth
  878. section 4.5.4 algorithm P (@pxref{References}).
  879. For an odd input @math{n}, and with @math{n = q@GMPmultiply{}2^k+1} where
  880. @math{q} is odd, this algorithm selects a random base @math{x} and tests
  881. whether @math{x^q @bmod{} n} is 1 or @math{-1}, or an @m{x^{q2^j} bmod n,
  882. x^(q*2^j) mod n} is @math{1}, for @math{1@le{}j@le{}k}.  If so then @math{n}
  883. is probably prime, if not then @math{n} is definitely composite.
  884. Any prime @math{n} will pass the test, but some composites do too.  Such
  885. composites are known as strong pseudoprimes to base @math{x}.  No @math{n} is
  886. a strong pseudoprime to more than @math{1/4} of all bases (see Knuth exercise
  887. 22), hence with @math{x} chosen at random there's no more than a @math{1/4}
  888. chance a ``probable prime'' will in fact be composite.
  889. In fact strong pseudoprimes are quite rare, making the test much more
  890. powerful than this analysis would suggest, but @math{1/4} is all that's proven
  891. for an arbitrary @math{n}.
  892. @node Factorial Algorithm, Binomial Coefficients Algorithm, Prime Testing Algorithm, Other Algorithms
  893. @subsection Factorial
  894. @cindex Factorial algorithm
  895. Factorials are calculated by a combination of removal of twos, powering, and
  896. binary splitting.  The procedure can be best illustrated with an example,
  897. @quotation
  898. @math{23! = 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23}
  899. @end quotation
  900. @noindent
  901. has factors of two removed,
  902. @quotation
  903. @math{23! = 2^{19}.1.1.3.1.5.3.7.1.9.5.11.3.13.7.15.1.17.9.19.5.21.11.23}
  904. @end quotation
  905. @noindent
  906. and the resulting terms collected up according to their multiplicity,
  907. @quotation
  908. @math{23! = 2^{19}.(3.5)^3.(7.9.11)^2.(13.15.17.19.21.23)}
  909. @end quotation
  910. Each sequence such as @math{13.15.17.19.21.23} is evaluated by splitting into
  911. every second term, as for instance @math{(13.17.21).(15.19.23)}, and the same
  912. recursively on each half.  This is implemented iteratively using some bit
  913. twiddling.
  914. Such splitting is more efficient than repeated N@cross{}1 multiplies since it
  915. forms big multiplies, allowing Karatsuba and higher algorithms to be used.
  916. And even below the Karatsuba threshold a big block of work can be more
  917. efficient for the basecase algorithm.
  918. Splitting into subsequences of every second term keeps the resulting products
  919. more nearly equal in size than would the simpler approach of say taking the
  920. first half and second half of the sequence.  Nearly equal products are more
  921. efficient for the current multiply implementation.
  922. @node Binomial Coefficients Algorithm, Fibonacci Numbers Algorithm, Factorial Algorithm, Other Algorithms
  923. @subsection Binomial Coefficients
  924. @cindex Binomial coefficient algorithm
  925. Binomial coefficients @m{left({n}atop{k}right), C(n@C{}k)} are calculated
  926. by first arranging @math{k @le{} n/2} using @m{left({n}atop{k}right) =
  927. left({n}atop{n-k}right), C(n@C{}k) = C(n@C{}n-k)} if necessary, and then
  928. evaluating the following product simply from @math{i=2} to @math{i=k}.
  929. @tex
  930. $$ left({n}atop{k}right) = (n-k+1) prod_{i=2}^{k} {{n-k+i} over i} $$
  931. @end tex
  932. @ifnottex
  933. @example
  934.                       k  (n-k+i)
  935. C(n,k) =  (n-k+1) * prod -------
  936.                      i=2    i
  937. @end example
  938. @end ifnottex
  939. It's easy to show that each denominator @math{i} will divide the product so
  940. far, so the exact division algorithm is used (@pxref{Exact Division}).
  941. The numerators @math{n-k+i} and denominators @math{i} are first accumulated
  942. into as many fit a limb, to save multi-precision operations, though for
  943. @code{mpz_bin_ui} this applies only to the divisors, since @math{n} is an
  944. @code{mpz_t} and @math{n-k+i} in general won't fit in a limb at all.
  945. @node Fibonacci Numbers Algorithm, Lucas Numbers Algorithm, Binomial Coefficients Algorithm, Other Algorithms
  946. @subsection Fibonacci Numbers
  947. @cindex Fibonacci number algorithm
  948. The Fibonacci functions @code{mpz_fib_ui} and @code{mpz_fib2_ui} are designed
  949. for calculating isolated @m{F_n,F[n]} or @m{F_n,F[n]},@m{F_{n-1},F[n-1]}
  950. values efficiently.
  951. For small @math{n}, a table of single limb values in @code{__gmp_fib_table} is
  952. used.  On a 32-bit limb this goes up to @m{F_{47},F[47]}, or on a 64-bit limb
  953. up to @m{F_{93},F[93]}.  For convenience the table starts at @m{F_{-1},F[-1]}.
  954. Beyond the table, values are generated with a binary powering algorithm,
  955. calculating a pair @m{F_n,F[n]} and @m{F_{n-1},F[n-1]} working from high to
  956. low across the bits of @math{n}.  The formulas used are
  957. @tex
  958. $$eqalign{
  959.   F_{2k+1} &= 4F_k^2 - F_{k-1}^2 + 2(-1)^k cr
  960.   F_{2k-1} &=  F_k^2 + F_{k-1}^2           cr
  961.   F_{2k}   &= F_{2k+1} - F_{2k-1}
  962. }$$
  963. @end tex
  964. @ifnottex
  965. @example
  966. F[2k+1] = 4*F[k]^2 - F[k-1]^2 + 2*(-1)^k
  967. F[2k-1] =   F[k]^2 + F[k-1]^2
  968. F[2k] = F[2k+1] - F[2k-1]
  969. @end example
  970. @end ifnottex
  971. At each step, @math{k} is the high @math{b} bits of @math{n}.  If the next bit
  972. of @math{n} is 0 then @m{F_{2k},F[2k]},@m{F_{2k-1},F[2k-1]} is used, or if
  973. it's a 1 then @m{F_{2k+1},F[2k+1]},@m{F_{2k},F[2k]} is used, and the process
  974. repeated until all bits of @math{n} are incorporated.  Notice these formulas
  975. require just two squares per bit of @math{n}.
  976. It'd be possible to handle the first few @math{n} above the single limb table
  977. with simple additions, using the defining Fibonacci recurrence @m{F_{k+1} =
  978. F_k + F_{k-1}, F[k+1]=F[k]+F[k-1]}, but this is not done since it usually
  979. turns out to be faster for only about 10 or 20 values of @math{n}, and
  980. including a block of code for just those doesn't seem worthwhile.  If they
  981. really mattered it'd be better to extend the data table.
  982. Using a table avoids lots of calculations on small numbers, and makes small
  983. @math{n} go fast.  A bigger table would make more small @math{n} go fast, it's
  984. just a question of balancing size against desired speed.  For GMP the code is
  985. kept compact, with the emphasis primarily on a good powering algorithm.
  986. @code{mpz_fib2_ui} returns both @m{F_n,F[n]} and @m{F_{n-1},F[n-1]}, but
  987. @code{mpz_fib_ui} is only interested in @m{F_n,F[n]}.  In this case the last
  988. step of the algorithm can become one multiply instead of two squares.  One of
  989. the following two formulas is used, according as @math{n} is odd or even.
  990. @tex
  991. $$eqalign{
  992.   F_{2k}   &= F_k (F_k + 2F_{k-1}) cr
  993.   F_{2k+1} &= (2F_k + F_{k-1}) (2F_k - F_{k-1}) + 2(-1)^k
  994. }$$
  995. @end tex
  996. @ifnottex
  997. @example
  998. F[2k]   = F[k]*(F[k]+2F[k-1])
  999. F[2k+1] = (2F[k]+F[k-1])*(2F[k]-F[k-1]) + 2*(-1)^k
  1000. @end example
  1001. @end ifnottex
  1002. @m{F_{2k+1},F[2k+1]} here is the same as above, just rearranged to be a
  1003. multiply.  For interest, the @m{2(-1)^k, 2*(-1)^k} term both here and above
  1004. can be applied just to the low limb of the calculation, without a carry or
  1005. borrow into further limbs, which saves some code size.  See comments with
  1006. @code{mpz_fib_ui} and the internal @code{mpn_fib2_ui} for how this is done.
  1007. @node Lucas Numbers Algorithm, Random Number Algorithms, Fibonacci Numbers Algorithm, Other Algorithms
  1008. @subsection Lucas Numbers
  1009. @cindex Lucas number algorithm
  1010. @code{mpz_lucnum2_ui} derives a pair of Lucas numbers from a pair of Fibonacci
  1011. numbers with the following simple formulas.
  1012. @tex
  1013. $$eqalign{
  1014.   L_k     &=  F_k + 2F_{k-1} cr
  1015.   L_{k-1} &= 2F_k -  F_{k-1}
  1016. }$$
  1017. @end tex
  1018. @ifnottex
  1019. @example
  1020. L[k]   =   F[k] + 2*F[k-1]
  1021. L[k-1] = 2*F[k] -   F[k-1]
  1022. @end example
  1023. @end ifnottex
  1024. @code{mpz_lucnum_ui} is only interested in @m{L_n,L[n]}, and some work can be
  1025. saved.  Trailing zero bits on @math{n} can be handled with a single square
  1026. each.
  1027. @tex
  1028. $$ L_{2k} = L_k^2 - 2(-1)^k $$
  1029. @end tex
  1030. @ifnottex
  1031. @example
  1032. L[2k] = L[k]^2 - 2*(-1)^k
  1033. @end example
  1034. @end ifnottex
  1035. And the lowest 1 bit can be handled with one multiply of a pair of Fibonacci
  1036. numbers, similar to what @code{mpz_fib_ui} does.
  1037. @tex
  1038. $$ L_{2k+1} = 5F_{k-1} (2F_k + F_{k-1}) - 4(-1)^k $$
  1039. @end tex
  1040. @ifnottex
  1041. @example
  1042. L[2k+1] = 5*F[k-1]*(2*F[k]+F[k-1]) - 4*(-1)^k
  1043. @end example
  1044. @end ifnottex
  1045. @node Random Number Algorithms,  , Lucas Numbers Algorithm, Other Algorithms
  1046. @subsection Random Numbers
  1047. @cindex Random number algorithms
  1048. For the @code{urandomb} functions, random numbers are generated simply by
  1049. concatenating bits produced by the generator.  As long as the generator has
  1050. good randomness properties this will produce well-distributed @math{N} bit
  1051. numbers.
  1052. For the @code{urandomm} functions, random numbers in a range @math{0@le{}R<N}
  1053. are generated by taking values @math{R} of @m{lceil log_2 N rceil,
  1054. ceil(log2(N))} bits each until one satisfies @math{R<N}.  This will normally
  1055. require only one or two attempts, but the attempts are limited in case the
  1056. generator is somehow degenerate and produces only 1 bits or similar.
  1057. @cindex Mersenne twister algorithm
  1058. The Mersenne Twister generator is by Matsumoto and Nishimura
  1059. (@pxref{References}).  It has a non-repeating period of @math{2^@W{19937}-1},
  1060. which is a Mersenne prime, hence the name of the generator.  The state is 624
  1061. words of 32-bits each, which is iterated with one XOR and shift for each
  1062. 32-bit word generated, making the algorithm very fast.  Randomness properties
  1063. are also very good and this is the default algorithm used by GMP.
  1064. @cindex Linear congruential algorithm
  1065. Linear congruential generators are described in many text books, for instance
  1066. Knuth volume 2 (@pxref{References}).  With a modulus @math{M} and parameters
  1067. @math{A} and @math{C}, a integer state @math{S} is iterated by the formula
  1068. @math{S @leftarrow{} A@GMPmultiply{}S+C @bmod{} M}.  At each step the new
  1069. state is a linear function of the previous, mod @math{M}, hence the name of
  1070. the generator.
  1071. In GMP only moduli of the form @math{2^N} are supported, and the current
  1072. implementation is not as well optimized as it could be.  Overheads are
  1073. significant when @math{N} is small, and when @math{N} is large clearly the
  1074. multiply at each step will become slow.  This is not a big concern, since the
  1075. Mersenne Twister generator is better in every respect and is therefore
  1076. recommended for all normal applications.
  1077. For both generators the current state can be deduced by observing enough
  1078. output and applying some linear algebra (over GF(2) in the case of the
  1079. Mersenne Twister).  This generally means raw output is unsuitable for
  1080. cryptographic applications without further hashing or the like.
  1081. @node Assembly Coding,  , Other Algorithms, Algorithms
  1082. @section Assembly Coding
  1083. @cindex Assembly coding
  1084. The assembly subroutines in GMP are the most significant source of speed at
  1085. small to moderate sizes.  At larger sizes algorithm selection becomes more
  1086. important, but of course speedups in low level routines will still speed up
  1087. everything proportionally.
  1088. Carry handling and widening multiplies that are important for GMP can't be
  1089. easily expressed in C@.  GCC @code{asm} blocks help a lot and are provided in
  1090. @file{longlong.h}, but hand coding low level routines invariably offers a
  1091. speedup over generic C by a factor of anything from 2 to 10.
  1092. @menu
  1093. * Assembly Code Organisation::
  1094. * Assembly Basics::
  1095. * Assembly Carry Propagation::
  1096. * Assembly Cache Handling::
  1097. * Assembly Functional Units::
  1098. * Assembly Floating Point::
  1099. * Assembly SIMD Instructions::
  1100. * Assembly Software Pipelining::
  1101. * Assembly Loop Unrolling::
  1102. * Assembly Writing Guide::
  1103. @end menu
  1104. @node Assembly Code Organisation, Assembly Basics, Assembly Coding, Assembly Coding
  1105. @subsection Code Organisation
  1106. @cindex Assembly code organisation
  1107. @cindex Code organisation
  1108. The various @file{mpn} subdirectories contain machine-dependent code, written
  1109. in C or assembly.  The @file{mpn/generic} subdirectory contains default code,
  1110. used when there's no machine-specific version of a particular file.
  1111. Each @file{mpn} subdirectory is for an ISA family.  Generally 32-bit and
  1112. 64-bit variants in a family cannot share code and have separate directories.
  1113. Within a family further subdirectories may exist for CPU variants.
  1114. In each directory a @file{nails} subdirectory may exist, holding code with
  1115. nails support for that CPU variant.  A @code{NAILS_SUPPORT} directive in each
  1116. file indicates the nails values the code handles.  Nails code only exists
  1117. where it's faster, or promises to be faster, than plain code.  There's no
  1118. effort put into nails if they're not going to enhance a given CPU.
  1119. @node Assembly Basics, Assembly Carry Propagation, Assembly Code Organisation, Assembly Coding
  1120. @subsection Assembly Basics
  1121. @code{mpn_addmul_1} and @code{mpn_submul_1} are the most important routines
  1122. for overall GMP performance.  All multiplications and divisions come down to
  1123. repeated calls to these.  @code{mpn_add_n}, @code{mpn_sub_n},
  1124. @code{mpn_lshift} and @code{mpn_rshift} are next most important.
  1125. On some CPUs assembly versions of the internal functions
  1126. @code{mpn_mul_basecase} and @code{mpn_sqr_basecase} give significant speedups,
  1127. mainly through avoiding function call overheads.  They can also potentially
  1128. make better use of a wide superscalar processor, as can bigger primitives like
  1129. @code{mpn_addmul_2} or @code{mpn_addmul_4}.
  1130. The restrictions on overlaps between sources and destinations
  1131. (@pxref{Low-level Functions}) are designed to facilitate a variety of
  1132. implementations.  For example, knowing @code{mpn_add_n} won't have partly
  1133. overlapping sources and destination means reading can be done far ahead of
  1134. writing on superscalar processors, and loops can be vectorized on a vector
  1135. processor, depending on the carry handling.
  1136. @node Assembly Carry Propagation, Assembly Cache Handling, Assembly Basics, Assembly Coding
  1137. @subsection Carry Propagation
  1138. @cindex Assembly carry propagation
  1139. The problem that presents most challenges in GMP is propagating carries from
  1140. one limb to the next.  In functions like @code{mpn_addmul_1} and
  1141. @code{mpn_add_n}, carries are the only dependencies between limb operations.
  1142. On processors with carry flags, a straightforward CISC style @code{adc} is
  1143. generally best.  AMD K6 @code{mpn_addmul_1} however is an example of an
  1144. unusual set of circumstances where a branch works out better.
  1145. On RISC processors generally an add and compare for overflow is used.  This
  1146. sort of thing can be seen in @file{mpn/generic/aors_n.c}.  Some carry
  1147. propagation schemes require 4 instructions, meaning at least 4 cycles per
  1148. limb, but other schemes may use just 1 or 2.  On wide superscalar processors
  1149. performance may be completely determined by the number of dependent
  1150. instructions between carry-in and carry-out for each limb.
  1151. On vector processors good use can be made of the fact that a carry bit only
  1152. very rarely propagates more than one limb.  When adding a single bit to a
  1153. limb, there's only a carry out if that limb was @code{0xFF@dots{}FF} which on
  1154. random data will be only 1 in @m{2GMPraise{@code{mp_bits_per_limb}},
  1155. 2^mp_bits_per_limb}.  @file{mpn/cray/add_n.c} is an example of this, it adds
  1156. all limbs in parallel, adds one set of carry bits in parallel and then only
  1157. rarely needs to fall through to a loop propagating further carries.
  1158. On the x86s, GCC (as of version 2.95.2) doesn't generate particularly good code
  1159. for the RISC style idioms that are necessary to handle carry bits in
  1160. C@.  Often conditional jumps are generated where @code{adc} or @code{sbb} forms
  1161. would be better.  And so unfortunately almost any loop involving carry bits
  1162. needs to be coded in assembly for best results.
  1163. @node Assembly Cache Handling, Assembly Functional Units, Assembly Carry Propagation, Assembly Coding
  1164. @subsection Cache Handling
  1165. @cindex Assembly cache handling
  1166. GMP aims to perform well both on operands that fit entirely in L1 cache and
  1167. those which don't.
  1168. Basic routines like @code{mpn_add_n} or @code{mpn_lshift} are often used on
  1169. large operands, so L2 and main memory performance is important for them.
  1170. @code{mpn_mul_1} and @code{mpn_addmul_1} are mostly used for multiply and
  1171. square basecases, so L1 performance matters most for them, unless assembly
  1172. versions of @code{mpn_mul_basecase} and @code{mpn_sqr_basecase} exist, in
  1173. which case the remaining uses are mostly for larger operands.
  1174. For L2 or main memory operands, memory access times will almost certainly be
  1175. more than the calculation time.  The aim therefore is to maximize memory
  1176. throughput, by starting a load of the next cache line while processing the
  1177. contents of the previous one.  Clearly this is only possible if the chip has a
  1178. lock-up free cache or some sort of prefetch instruction.  Most current chips
  1179. have both these features.
  1180. Prefetching sources combines well with loop unrolling, since a prefetch can be
  1181. initiated once per unrolled loop (or more than once if the loop covers more
  1182. than one cache line).
  1183. On CPUs without write-allocate caches, prefetching destinations will ensure
  1184. individual stores don't go further down the cache hierarchy, limiting
  1185. bandwidth.  Of course for calculations which are slow anyway, like
  1186. @code{mpn_divrem_1}, write-throughs might be fine.
  1187. The distance ahead to prefetch will be determined by memory latency versus
  1188. throughput.  The aim of course is to have data arriving continuously, at peak
  1189. throughput.  Some CPUs have limits on the number of fetches or prefetches in
  1190. progress.
  1191. If a special prefetch instruction doesn't exist then a plain load can be used,
  1192. but in that case care must be taken not to attempt to read past the end of an
  1193. operand, since that might produce a segmentation violation.
  1194. Some CPUs or systems have hardware that detects sequential memory accesses and
  1195. initiates suitable cache movements automatically, making life easy.
  1196. @node Assembly Functional Units, Assembly Floating Point, Assembly Cache Handling, Assembly Coding
  1197. @subsection Functional Units
  1198. When choosing an approach for an assembly loop, consideration is given to
  1199. what operations can execute simultaneously and what throughput can thereby be
  1200. achieved.  In some cases an algorithm can be tweaked to accommodate available
  1201. resources.
  1202. Loop control will generally require a counter and pointer updates, costing as
  1203. much as 5 instructions, plus any delays a branch introduces.  CPU addressing
  1204. modes might reduce pointer updates, perhaps by allowing just one updating
  1205. pointer and others expressed as offsets from it, or on CISC chips with all
  1206. addressing done with the loop counter as a scaled index.
  1207. The final loop control cost can be amortised by processing several limbs in
  1208. each iteration (@pxref{Assembly Loop Unrolling}).  This at least ensures loop
  1209. control isn't a big fraction the work done.
  1210. Memory throughput is always a limit.  If perhaps only one load or one store
  1211. can be done per cycle then 3 cycles/limb will the top speed for ``binary''
  1212. operations like @code{mpn_add_n}, and any code achieving that is optimal.
  1213. Integer resources can be freed up by having the loop counter in a float
  1214. register, or by pressing the float units into use for some multiplying,
  1215. perhaps doing every second limb on the float side (@pxref{Assembly Floating
  1216. Point}).
  1217. Float resources can be freed up by doing carry propagation on the integer
  1218. side, or even by doing integer to float conversions in integers using bit
  1219. twiddling.
  1220. @node Assembly Floating Point, Assembly SIMD Instructions, Assembly Functional Units, Assembly Coding
  1221. @subsection Floating Point
  1222. @cindex Assembly floating Point
  1223. Floating point arithmetic is used in GMP for multiplications on CPUs with poor
  1224. integer multipliers.  It's mostly useful for @code{mpn_mul_1},
  1225. @code{mpn_addmul_1} and @code{mpn_submul_1} on 64-bit machines, and
  1226. @code{mpn_mul_basecase} on both 32-bit and 64-bit machines.
  1227. With IEEE 53-bit double precision floats, integer multiplications producing up
  1228. to 53 bits will give exact results.  Breaking a 64@cross{}64 multiplication
  1229. into eight 16@cross{}@math{32@rightarrow{}48} bit pieces is convenient.  With
  1230. some care though six 21@cross{}@math{32@rightarrow{}53} bit products can be
  1231. used, if one of the lower two 21-bit pieces also uses the sign bit.
  1232. For the @code{mpn_mul_1} family of functions on a 64-bit machine, the
  1233. invariant single limb is split at the start, into 3 or 4 pieces.  Inside the
  1234. loop, the bignum operand is split into 32-bit pieces.  Fast conversion of
  1235. these unsigned 32-bit pieces to floating point is highly machine-dependent.
  1236. In some cases, reading the data into the integer unit, zero-extending to
  1237. 64-bits, then transferring to the floating point unit back via memory is the
  1238. only option.
  1239. Converting partial products back to 64-bit limbs is usually best done as a
  1240. signed conversion.  Since all values are smaller than @m{2^{53},2^53}, signed
  1241. and unsigned are the same, but most processors lack unsigned conversions.
  1242. @sp 2
  1243. Here is a diagram showing 16@cross{}32 bit products for an @code{mpn_mul_1} or
  1244. @code{mpn_addmul_1} with a 64-bit limb.  The single limb operand V is split
  1245. into four 16-bit parts.  The multi-limb operand U is split in the loop into
  1246. two 32-bit parts.
  1247. @tex
  1248. globalnewdimenGMPbits      globalGMPbits=0.18em
  1249. defGMPbox#1#2#3{%
  1250.   hbox{%
  1251.     hbox to 128GMPbits{hfil
  1252.       vbox{%
  1253.         hrule
  1254.         hbox to 48GMPbits {GMPvrule hfil$#2$hfil vrule}%
  1255.         hrule}%
  1256.       hskip #1GMPbits}%
  1257.     raise GMPboxdepth hbox{hskip 2em #3}}}
  1258. %
  1259. GMPdisplay{%
  1260.   vbox{%
  1261.     hbox{%
  1262.       hbox to 128GMPbits {hfil
  1263.         vbox{%
  1264.           hrule
  1265.           hbox to 64GMPbits{%
  1266.             GMPvrule hfil$v48$hfil
  1267.             vrule    hfil$v32$hfil
  1268.             vrule    hfil$v16$hfil
  1269.             vrule    hfil$v00$hfil
  1270.             vrule}
  1271.           hrule}}%
  1272.        raise GMPboxdepth hbox{hskip 2em V Operand}}
  1273.     vskip 0.5ex
  1274.     hbox{%
  1275.       hbox to 128GMPbits {hfil
  1276.         raise GMPboxdepth hbox{$times$hskip 1.5em}%
  1277.         vbox{%
  1278.           hrule
  1279.           hbox to 64GMPbits {%
  1280.             GMPvrule hfil$u32$hfil
  1281.             vrule hfil$u00$hfil
  1282.             vrule}%
  1283.           hrule}}%
  1284.        raise GMPboxdepth hbox{hskip 2em U Operand (one limb)}}%
  1285.     vskip 0.5ex
  1286.     hbox{vbox to 2ex{hrule width 128GMPbits}}%
  1287.     GMPbox{0}{u00 times v00}{$p00$hskip 1.5em 48-bit products}%
  1288.     vskip 0.5ex
  1289.     GMPbox{16}{u00 times v16}{$p16$}
  1290.     vskip 0.5ex
  1291.     GMPbox{32}{u00 times v32}{$p32$}
  1292.     vskip 0.5ex
  1293.     GMPbox{48}{u00 times v48}{$p48$}
  1294.     vskip 0.5ex
  1295.     GMPbox{32}{u32 times v00}{$r32$}
  1296.     vskip 0.5ex
  1297.     GMPbox{48}{u32 times v16}{$r48$}
  1298.     vskip 0.5ex
  1299.     GMPbox{64}{u32 times v32}{$r64$}
  1300.     vskip 0.5ex
  1301.     GMPbox{80}{u32 times v48}{$r80$}
  1302. }}
  1303. @end tex
  1304. @ifnottex
  1305. @example
  1306. @group
  1307.                 +---+---+---+---+
  1308.                 |v48|v32|v16|v00|    V operand
  1309.                 +---+---+---+---+
  1310.                 +-------+---+---+
  1311.             x   |  u32  |  u00  |    U operand (one limb)
  1312.                 +---------------+
  1313. ---------------------------------
  1314.                     +-----------+
  1315.                     | u00 x v00 |    p00    48-bit products
  1316.                     +-----------+
  1317.                 +-----------+
  1318.                 | u00 x v16 |        p16
  1319.                 +-----------+
  1320.             +-----------+
  1321.             | u00 x v32 |            p32
  1322.             +-----------+
  1323.         +-----------+
  1324.         | u00 x v48 |                p48
  1325.         +-----------+
  1326.             +-----------+
  1327.             | u32 x v00 |            r32
  1328.             +-----------+
  1329.         +-----------+
  1330.         | u32 x v16 |                r48
  1331.         +-----------+
  1332.     +-----------+
  1333.     | u32 x v32 |                    r64
  1334.     +-----------+
  1335. +-----------+
  1336. | u32 x v48 |                        r80
  1337. +-----------+
  1338. @end group
  1339. @end example
  1340. @end ifnottex
  1341. @math{p32} and @math{r32} can be summed using floating-point addition, and
  1342. likewise @math{p48} and @math{r48}.  @math{p00} and @math{p16} can be summed
  1343. with @math{r64} and @math{r80} from the previous iteration.
  1344. For each loop then, four 49-bit quantities are transferred to the integer unit,
  1345. aligned as follows,
  1346. @tex
  1347. % GMPbox here should be 49 bits wide, but use 51 to better show p16+r80'
  1348. % crossing into the upper 64 bits.
  1349. defGMPbox#1#2#3{%
  1350.   hbox{%
  1351.     hbox to 128GMPbits {%
  1352.       hfil
  1353.       vbox{%
  1354.         hrule
  1355.         hbox to 51GMPbits {GMPvrule hfil$#2$hfil vrule}%
  1356.         hrule}%
  1357.       hskip #1GMPbits}%
  1358.     raise GMPboxdepth hbox{hskip 1.5em $#3$hfil}%
  1359. }}
  1360. newboxb setboxbhbox{64 bits}%
  1361. newdimenbw bw=wdb advancebw by 2em
  1362. newdimenx x=128GMPbits
  1363. advancex by -2bw
  1364. dividex by4
  1365. GMPdisplay{%
  1366.   vbox{%
  1367.     hbox to 128GMPbits {%
  1368.       GMPvrule
  1369.       raise 0.5ex vbox{hrule hbox to x {}}%
  1370.       hfil 64 bitshfil
  1371.       raise 0.5ex vbox{hrule hbox to x {}}%
  1372.       vrule
  1373.       raise 0.5ex vbox{hrule hbox to x {}}%
  1374.       hfil 64 bitshfil
  1375.       raise 0.5ex vbox{hrule hbox to x {}}%
  1376.       vrule}%
  1377.     vskip 0.7ex
  1378.     GMPbox{0}{p00+r64'}{i00}
  1379.     vskip 0.5ex
  1380.     GMPbox{16}{p16+r80'}{i16}
  1381.     vskip 0.5ex
  1382.     GMPbox{32}{p32+r32}{i32}
  1383.     vskip 0.5ex
  1384.     GMPbox{48}{p48+r48}{i48}
  1385. }}
  1386. @end tex
  1387. @ifnottex
  1388. @example
  1389. @group
  1390. |-----64bits----|-----64bits----|
  1391.                    +------------+
  1392.                    | p00 + r64' |    i00
  1393.                    +------------+
  1394.                +------------+
  1395.                | p16 + r80' |        i16
  1396.                +------------+
  1397.            +------------+
  1398.            | p32 + r32  |            i32
  1399.            +------------+
  1400.        +------------+
  1401.        | p48 + r48  |                i48
  1402.        +------------+
  1403. @end group
  1404. @end example
  1405. @end ifnottex
  1406. The challenge then is to sum these efficiently and add in a carry limb,
  1407. generating a low 64-bit result limb and a high 33-bit carry limb (@math{i48}
  1408. extends 33 bits into the high half).
  1409. @node Assembly SIMD Instructions, Assembly Software Pipelining, Assembly Floating Point, Assembly Coding
  1410. @subsection SIMD Instructions
  1411. @cindex Assembly SIMD
  1412. The single-instruction multiple-data support in current microprocessors is
  1413. aimed at signal processing algorithms where each data point can be treated
  1414. more or less independently.  There's generally not much support for
  1415. propagating the sort of carries that arise in GMP.
  1416. SIMD multiplications of say four 16@cross{}16 bit multiplies only do as much
  1417. work as one 32@cross{}32 from GMP's point of view, and need some shifts and
  1418. adds besides.  But of course if say the SIMD form is fully pipelined and uses
  1419. less instruction decoding then it may still be worthwhile.
  1420. On the x86 chips, MMX has so far found a use in @code{mpn_rshift} and
  1421. @code{mpn_lshift}, and is used in a special case for 16-bit multipliers in the
  1422. P55 @code{mpn_mul_1}.  SSE2 is used for Pentium 4 @code{mpn_mul_1},
  1423. @code{mpn_addmul_1}, and @code{mpn_submul_1}.
  1424. @node Assembly Software Pipelining, Assembly Loop Unrolling, Assembly SIMD Instructions, Assembly Coding
  1425. @subsection Software Pipelining
  1426. @cindex Assembly software pipelining
  1427. Software pipelining consists of scheduling instructions around the branch
  1428. point in a loop.  For example a loop might issue a load not for use in the
  1429. present iteration but the next, thereby allowing extra cycles for the data to
  1430. arrive from memory.
  1431. Naturally this is wanted only when doing things like loads or multiplies that
  1432. take several cycles to complete, and only where a CPU has multiple functional
  1433. units so that other work can be done in the meantime.
  1434. A pipeline with several stages will have a data value in progress at each
  1435. stage and each loop iteration moves them along one stage.  This is like
  1436. juggling.
  1437. If the latency of some instruction is greater than the loop time then it will
  1438. be necessary to unroll, so one register has a result ready to use while
  1439. another (or multiple others) are still in progress.  (@pxref{Assembly Loop
  1440. Unrolling}).
  1441. @node Assembly Loop Unrolling, Assembly Writing Guide, Assembly Software Pipelining, Assembly Coding
  1442. @subsection Loop Unrolling
  1443. @cindex Assembly loop unrolling
  1444. Loop unrolling consists of replicating code so that several limbs are
  1445. processed in each loop.  At a minimum this reduces loop overheads by a
  1446. corresponding factor, but it can also allow better register usage, for example
  1447. alternately using one register combination and then another.  Judicious use of
  1448. @command{m4} macros can help avoid lots of duplication in the source code.
  1449. Any amount of unrolling can be handled with a loop counter that's decremented
  1450. by @math{N} each time, stopping when the remaining count is less than the
  1451. further @math{N} the loop will process.  Or by subtracting @math{N} at the
  1452. start, the termination condition becomes when the counter @math{C} is less
  1453. than 0 (and the count of remaining limbs is @math{C+N}).
  1454. Alternately for a power of 2 unroll the loop count and remainder can be
  1455. established with a shift and mask.  This is convenient if also making a
  1456. computed jump into the middle of a large loop.
  1457. The limbs not a multiple of the unrolling can be handled in various ways, for
  1458. example
  1459. @itemize @bullet
  1460. @item
  1461. A simple loop at the end (or the start) to process the excess.  Care will be
  1462. wanted that it isn't too much slower than the unrolled part.
  1463. @item
  1464. A set of binary tests, for example after an 8-limb unrolling, test for 4 more
  1465. limbs to process, then a further 2 more or not, and finally 1 more or not.
  1466. This will probably take more code space than a simple loop.
  1467. @item
  1468. A @code{switch} statement, providing separate code for each possible excess,
  1469. for example an 8-limb unrolling would have separate code for 0 remaining, 1
  1470. remaining, etc, up to 7 remaining.  This might take a lot of code, but may be
  1471. the best way to optimize all cases in combination with a deep pipelined loop.
  1472. @item
  1473. A computed jump into the middle of the loop, thus making the first iteration
  1474. handle the excess.  This should make times smoothly increase with size, which
  1475. is attractive, but setups for the jump and adjustments for pointers can be
  1476. tricky and could become quite difficult in combination with deep pipelining.
  1477. @end itemize
  1478. @node Assembly Writing Guide,  , Assembly Loop Unrolling, Assembly Coding
  1479. @subsection Writing Guide
  1480. @cindex Assembly writing guide
  1481. This is a guide to writing software pipelined loops for processing limb
  1482. vectors in assembly.
  1483. First determine the algorithm and which instructions are needed.  Code it
  1484. without unrolling or scheduling, to make sure it works.  On a 3-operand CPU
  1485. try to write each new value to a new register, this will greatly simplify later
  1486. steps.
  1487. Then note for each instruction the functional unit and/or issue port
  1488. requirements.  If an instruction can use either of two units, like U0 or U1
  1489. then make a category ``U0/U1''.  Count the total using each unit (or combined
  1490. unit), and count all instructions.
  1491. Figure out from those counts the best possible loop time.  The goal will be to
  1492. find a perfect schedule where instruction latencies are completely hidden.
  1493. The total instruction count might be the limiting factor, or perhaps a
  1494. particular functional unit.  It might be possible to tweak the instructions to
  1495. help the limiting factor.
  1496. Suppose the loop time is @math{N}, then make @math{N} issue buckets, with the
  1497. final loop branch at the end of the last.  Now fill the buckets with dummy
  1498. instructions using the functional units desired.  Run this to make sure the
  1499. intended speed is reached.
  1500. Now replace the dummy instructions with the real instructions from the slow
  1501. but correct loop you started with.  The first will typically be a load
  1502. instruction.  Then the instruction using that value is placed in a bucket an
  1503. appropriate distance down.  Run the loop again, to check it still runs at
  1504. target speed.
  1505. Keep placing instructions, frequently measuring the loop.  After a few you
  1506. will need to wrap around from the last bucket back to the top of the loop.  If
  1507. you used the new-register for new-value strategy above then there will be no
  1508. register conflicts.  If not then take care not to clobber something already in
  1509. use.  Changing registers at this time is very error prone.
  1510. The loop will overlap two or more of the original loop iterations, and the
  1511. computation of one vector element result will be started in one iteration of
  1512. the new loop, and completed one or several iterations later.
  1513. The final step is to create feed-in and wind-down code for the loop.  A good
  1514. way to do this is to make a copy (or copies) of the loop at the start and
  1515. delete those instructions which don't have valid antecedents, and at the end
  1516. replicate and delete those whose results are unwanted (including any further
  1517. loads).
  1518. The loop will have a minimum number of limbs loaded and processed, so the
  1519. feed-in code must test if the request size is smaller and skip either to a
  1520. suitable part of the wind-down or to special code for small sizes.
  1521. @node Internals, Contributors, Algorithms, Top
  1522. @chapter Internals
  1523. @cindex Internals
  1524. @strong{This chapter is provided only for informational purposes and the
  1525. various internals described here may change in future GMP releases.
  1526. Applications expecting to be compatible with future releases should use only
  1527. the documented interfaces described in previous chapters.}
  1528. @menu
  1529. * Integer Internals::
  1530. * Rational Internals::
  1531. * Float Internals::
  1532. * Raw Output Internals::
  1533. * C++ Interface Internals::
  1534. @end menu
  1535. @node Integer Internals, Rational Internals, Internals, Internals
  1536. @section Integer Internals
  1537. @cindex Integer internals
  1538. @code{mpz_t} variables represent integers using sign and magnitude, in space
  1539. dynamically allocated and reallocated.  The fields are as follows.
  1540. @table @asis
  1541. @item @code{_mp_size}
  1542. The number of limbs, or the negative of that when representing a negative
  1543. integer.  Zero is represented by @code{_mp_size} set to zero, in which case
  1544. the @code{_mp_d} data is unused.
  1545. @item @code{_mp_d}
  1546. A pointer to an array of limbs which is the magnitude.  These are stored
  1547. ``little endian'' as per the @code{mpn} functions, so @code{_mp_d[0]} is the
  1548. least significant limb and @code{_mp_d[ABS(_mp_size)-1]} is the most
  1549. significant.  Whenever @code{_mp_size} is non-zero, the most significant limb
  1550. is non-zero.
  1551. Currently there's always at least one limb allocated, so for instance
  1552. @code{mpz_set_ui} never needs to reallocate, and @code{mpz_get_ui} can fetch
  1553. @code{_mp_d[0]} unconditionally (though its value is then only wanted if
  1554. @code{_mp_size} is non-zero).
  1555. @item @code{_mp_alloc}
  1556. @code{_mp_alloc} is the number of limbs currently allocated at @code{_mp_d},
  1557. and naturally @code{_mp_alloc >= ABS(_mp_size)}.  When an @code{mpz} routine
  1558. is about to (or might be about to) increase @code{_mp_size}, it checks
  1559. @code{_mp_alloc} to see whether there's enough space, and reallocates if not.
  1560. @code{MPZ_REALLOC} is generally used for this.
  1561. @end table
  1562. The various bitwise logical functions like @code{mpz_and} behave as if
  1563. negative values were twos complement.  But sign and magnitude is always used
  1564. internally, and necessary adjustments are made during the calculations.
  1565. Sometimes this isn't pretty, but sign and magnitude are best for other
  1566. routines.
  1567. Some internal temporary variables are setup with @code{MPZ_TMP_INIT} and these
  1568. have @code{_mp_d} space obtained from @code{TMP_ALLOC} rather than the memory
  1569. allocation functions.  Care is taken to ensure that these are big enough that
  1570. no reallocation is necessary (since it would have unpredictable consequences).
  1571. @code{_mp_size} and @code{_mp_alloc} are @code{int}, although @code{mp_size_t}
  1572. is usually a @code{long}.  This is done to make the fields just 32 bits on
  1573. some 64 bits systems, thereby saving a few bytes of data space but still
  1574. providing plenty of range.
  1575. @node Rational Internals, Float Internals, Integer Internals, Internals
  1576. @section Rational Internals
  1577. @cindex Rational internals
  1578. @code{mpq_t} variables represent rationals using an @code{mpz_t} numerator and
  1579. denominator (@pxref{Integer Internals}).
  1580. The canonical form adopted is denominator positive (and non-zero), no common
  1581. factors between numerator and denominator, and zero uniquely represented as
  1582. 0/1.
  1583. It's believed that casting out common factors at each stage of a calculation
  1584. is best in general.  A GCD is an @math{O(N^2)} operation so it's better to do
  1585. a few small ones immediately than to delay and have to do a big one later.
  1586. Knowing the numerator and denominator have no common factors can be used for
  1587. example in @code{mpq_mul} to make only two cross GCDs necessary, not four.
  1588. This general approach to common factors is badly sub-optimal in the presence
  1589. of simple factorizations or little prospect for cancellation, but GMP has no
  1590. way to know when this will occur.  As per @ref{Efficiency}, that's left to
  1591. applications.  The @code{mpq_t} framework might still suit, with
  1592. @code{mpq_numref} and @code{mpq_denref} for direct access to the numerator and
  1593. denominator, or of course @code{mpz_t} variables can be used directly.
  1594. @node Float Internals, Raw Output Internals, Rational Internals, Internals
  1595. @section Float Internals
  1596. @cindex Float internals
  1597. Efficient calculation is the primary aim of GMP floats and the use of whole
  1598. limbs and simple rounding facilitates this.
  1599. @code{mpf_t} floats have a variable precision mantissa and a single machine
  1600. word signed exponent.  The mantissa is represented using sign and magnitude.
  1601. @c FIXME: The arrow heads don't join to the lines exactly.
  1602. @tex
  1603. globalnewdimenGMPboxwidth GMPboxwidth=5em
  1604. globalnewdimenGMPboxheight GMPboxheight=3ex
  1605. defcentreline{hbox{raise 0.8ex vbox{hrule hbox{hfil}}}}
  1606. GMPdisplay{%
  1607. vbox{%
  1608.   hbox to 5GMPboxwidth {most significant limb hfil least significant limb}
  1609.   vskip 0.7ex
  1610.   defGMPcentreline#1{hbox{raise 0.5 ex vbox{hrule hbox to #1 {}}}}
  1611.   hbox {
  1612.     hbox to 3GMPboxwidth {%
  1613.       setbox 0 = hbox{@code{_mp_exp}}%
  1614.       dimen0=3GMPboxwidth
  1615.       advancedimen0 by -wd0
  1616.       dividedimen0 by 2
  1617.       advancedimen0 by -1em
  1618.       setbox1 = hbox{$rightarrow$}%
  1619.       dimen1=dimen0
  1620.       advancedimen1 by -wd1
  1621.       GMPcentreline{dimen0}%
  1622.       hfil
  1623.       box0%
  1624.       hfil
  1625.       GMPcentreline{dimen1{}}%
  1626.       box1}
  1627.     hbox to 2GMPboxwidth {hfil @code{_mp_d}}}
  1628.   vskip 0.5ex
  1629.   vbox {%
  1630.     hrule
  1631.     hbox{%
  1632.       vrule height 2ex depth 1ex
  1633.       hbox to GMPboxwidth {}%
  1634.       vrule
  1635.       hbox to GMPboxwidth {}%
  1636.       vrule
  1637.       hbox to GMPboxwidth {}%
  1638.       vrule
  1639.       hbox to GMPboxwidth {}%
  1640.       vrule
  1641.       hbox to GMPboxwidth {}%
  1642.       vrule}
  1643.     hrule
  1644.   }
  1645.   hbox {%
  1646.     hbox to 0.8 pt {}
  1647.     hbox to 3GMPboxwidth {%
  1648.       hfil $cdot$} hbox {$leftarrow$ radix pointhfil}}
  1649.   hbox to 5GMPboxwidth{%
  1650.     setbox 0 = hbox{@code{_mp_size}}%
  1651.     dimen0 = 5GMPboxwidth
  1652.     advancedimen0 by -wd0
  1653.     dividedimen0 by 2
  1654.     advancedimen0 by -1em
  1655.     dimen1 = dimen0
  1656.     setbox1 = hbox{$leftarrow$}%
  1657.     setbox2 = hbox{$rightarrow$}%
  1658.     advancedimen0 by -wd1
  1659.     advancedimen1 by -wd2
  1660.     hbox to 0.3 em {}%
  1661.     box1
  1662.     GMPcentreline{dimen0}%
  1663.     hfil
  1664.     box0
  1665.     hfil
  1666.     GMPcentreline{dimen1}%
  1667.     box2}
  1668. }}
  1669. @end tex
  1670. @ifnottex
  1671. @example
  1672.    most                   least
  1673. significant            significant
  1674.    limb                   limb
  1675.                             _mp_d
  1676.  |---- _mp_exp --->           |
  1677.   _____ _____ _____ _____ _____
  1678.  |_____|_____|_____|_____|_____|
  1679.                    . <------------ radix point
  1680.   <-------- _mp_size --------->
  1681. @sp 1
  1682. @end example
  1683. @end ifnottex
  1684. @noindent
  1685. The fields are as follows.
  1686. @table @asis
  1687. @item @code{_mp_size}
  1688. The number of limbs currently in use, or the negative of that when
  1689. representing a negative value.  Zero is represented by @code{_mp_size} and
  1690. @code{_mp_exp} both set to zero, and in that case the @code{_mp_d} data is
  1691. unused.  (In the future @code{_mp_exp} might be undefined when representing
  1692. zero.)
  1693. @item @code{_mp_prec}
  1694. The precision of the mantissa, in limbs.  In any calculation the aim is to
  1695. produce @code{_mp_prec} limbs of result (the most significant being non-zero).
  1696. @item @code{_mp_d}
  1697. A pointer to the array of limbs which is the absolute value of the mantissa.
  1698. These are stored ``little endian'' as per the @code{mpn} functions, so
  1699. @code{_mp_d[0]} is the least significant limb and
  1700. @code{_mp_d[ABS(_mp_size)-1]} the most significant.
  1701. The most significant limb is always non-zero, but there are no other
  1702. restrictions on its value, in particular the highest 1 bit can be anywhere
  1703. within the limb.
  1704. @code{_mp_prec+1} limbs are allocated to @code{_mp_d}, the extra limb being
  1705. for convenience (see below).  There are no reallocations during a calculation,
  1706. only in a change of precision with @code{mpf_set_prec}.
  1707. @item @code{_mp_exp}
  1708. The exponent, in limbs, determining the location of the implied radix point.
  1709. Zero means the radix point is just above the most significant limb.  Positive
  1710. values mean a radix point offset towards the lower limbs and hence a value
  1711. @math{@ge{} 1}, as for example in the diagram above.  Negative exponents mean
  1712. a radix point further above the highest limb.
  1713. Naturally the exponent can be any value, it doesn't have to fall within the
  1714. limbs as the diagram shows, it can be a long way above or a long way below.
  1715. Limbs other than those included in the @code{@{_mp_d,_mp_size@}} data
  1716. are treated as zero.
  1717. @end table
  1718. The @code{_mp_size} and @code{_mp_prec} fields are @code{int}, although the
  1719. @code{mp_size_t} type is usually a @code{long}.  The @code{_mp_exp} field is
  1720. usually @code{long}.  This is done to make some fields just 32 bits on some 64
  1721. bits systems, thereby saving a few bytes of data space but still providing
  1722. plenty of precision and a very large range.
  1723. @sp 1
  1724. @noindent
  1725. The following various points should be noted.
  1726. @table @asis
  1727. @item Low Zeros
  1728. The least significant limbs @code{_mp_d[0]} etc can be zero, though such low
  1729. zeros can always be ignored.  Routines likely to produce low zeros check and
  1730. avoid them to save time in subsequent calculations, but for most routines
  1731. they're quite unlikely and aren't checked.
  1732. @item Mantissa Size Range
  1733. The @code{_mp_size} count of limbs in use can be less than @code{_mp_prec} if
  1734. the value can be represented in less.  This means low precision values or
  1735. small integers stored in a high precision @code{mpf_t} can still be operated
  1736. on efficiently.
  1737. @code{_mp_size} can also be greater than @code{_mp_prec}.  Firstly a value is
  1738. allowed to use all of the @code{_mp_prec+1} limbs available at @code{_mp_d},
  1739. and secondly when @code{mpf_set_prec_raw} lowers @code{_mp_prec} it leaves
  1740. @code{_mp_size} unchanged and so the size can be arbitrarily bigger than
  1741. @code{_mp_prec}.
  1742. @item Rounding
  1743. All rounding is done on limb boundaries.  Calculating @code{_mp_prec} limbs
  1744. with the high non-zero will ensure the application requested minimum precision
  1745. is obtained.
  1746. The use of simple ``trunc'' rounding towards zero is efficient, since there's
  1747. no need to examine extra limbs and increment or decrement.
  1748. @item Bit Shifts
  1749. Since the exponent is in limbs, there are no bit shifts in basic operations
  1750. like @code{mpf_add} and @code{mpf_mul}.  When differing exponents are
  1751. encountered all that's needed is to adjust pointers to line up the relevant
  1752. limbs.
  1753. Of course @code{mpf_mul_2exp} and @code{mpf_div_2exp} will require bit shifts,
  1754. but the choice is between an exponent in limbs which requires shifts there, or
  1755. one in bits which requires them almost everywhere else.
  1756. @item Use of @code{_mp_prec+1} Limbs
  1757. The extra limb on @code{_mp_d} (@code{_mp_prec+1} rather than just
  1758. @code{_mp_prec}) helps when an @code{mpf} routine might get a carry from its
  1759. operation.  @code{mpf_add} for instance will do an @code{mpn_add} of
  1760. @code{_mp_prec} limbs.  If there's no carry then that's the result, but if
  1761. there is a carry then it's stored in the extra limb of space and
  1762. @code{_mp_size} becomes @code{_mp_prec+1}.
  1763. Whenever @code{_mp_prec+1} limbs are held in a variable, the low limb is not
  1764. needed for the intended precision, only the @code{_mp_prec} high limbs.  But
  1765. zeroing it out or moving the rest down is unnecessary.  Subsequent routines
  1766. reading the value will simply take the high limbs they need, and this will be
  1767. @code{_mp_prec} if their target has that same precision.  This is no more than
  1768. a pointer adjustment, and must be checked anyway since the destination
  1769. precision can be different from the sources.
  1770. Copy functions like @code{mpf_set} will retain a full @code{_mp_prec+1} limbs
  1771. if available.  This ensures that a variable which has @code{_mp_size} equal to
  1772. @code{_mp_prec+1} will get its full exact value copied.  Strictly speaking
  1773. this is unnecessary since only @code{_mp_prec} limbs are needed for the
  1774. application's requested precision, but it's considered that an @code{mpf_set}
  1775. from one variable into another of the same precision ought to produce an exact
  1776. copy.
  1777. @item Application Precisions
  1778. @code{__GMPF_BITS_TO_PREC} converts an application requested precision to an
  1779. @code{_mp_prec}.  The value in bits is rounded up to a whole limb then an
  1780. extra limb is added since the most significant limb of @code{_mp_d} is only
  1781. non-zero and therefore might contain only one bit.
  1782. @code{__GMPF_PREC_TO_BITS} does the reverse conversion, and removes the extra
  1783. limb from @code{_mp_prec} before converting to bits.  The net effect of
  1784. reading back with @code{mpf_get_prec} is simply the precision rounded up to a
  1785. multiple of @code{mp_bits_per_limb}.
  1786. Note that the extra limb added here for the high only being non-zero is in
  1787. addition to the extra limb allocated to @code{_mp_d}.  For example with a
  1788. 32-bit limb, an application request for 250 bits will be rounded up to 8
  1789. limbs, then an extra added for the high being only non-zero, giving an
  1790. @code{_mp_prec} of 9.  @code{_mp_d} then gets 10 limbs allocated.  Reading
  1791. back with @code{mpf_get_prec} will take @code{_mp_prec} subtract 1 limb and
  1792. multiply by 32, giving 256 bits.
  1793. Strictly speaking, the fact the high limb has at least one bit means that a
  1794. float with, say, 3 limbs of 32-bits each will be holding at least 65 bits, but
  1795. for the purposes of @code{mpf_t} it's considered simply to be 64 bits, a nice
  1796. multiple of the limb size.
  1797. @end table
  1798. @node Raw Output Internals, C++ Interface Internals, Float Internals, Internals
  1799. @section Raw Output Internals
  1800. @cindex Raw output internals
  1801. @noindent
  1802. @code{mpz_out_raw} uses the following format.
  1803. @tex
  1804. globalnewdimenGMPboxwidth GMPboxwidth=5em
  1805. globalnewdimenGMPboxheight GMPboxheight=3ex
  1806. defcentreline{hbox{raise 0.8ex vbox{hrule hbox{hfil}}}}
  1807. GMPdisplay{%
  1808. vbox{%
  1809.   defGMPcentreline#1{hbox{raise 0.5 ex vbox{hrule hbox to #1 {}}}}
  1810.   vbox {%
  1811.     hrule
  1812.     hbox{%
  1813.       vrule height 2.5ex depth 1.5ex
  1814.       hbox to GMPboxwidth {hfil sizehfil}%
  1815.       vrule
  1816.       hbox to 3GMPboxwidth {hfil data byteshfil}%
  1817.       vrule}
  1818.     hrule}
  1819. }}
  1820. @end tex
  1821. @ifnottex
  1822. @example
  1823. +------+------------------------+
  1824. | size |       data bytes       |
  1825. +------+------------------------+
  1826. @end example
  1827. @end ifnottex
  1828. The size is 4 bytes written most significant byte first, being the number of
  1829. subsequent data bytes, or the twos complement negative of that when a negative
  1830. integer is represented.  The data bytes are the absolute value of the integer,
  1831. written most significant byte first.
  1832. The most significant data byte is always non-zero, so the output is the same
  1833. on all systems, irrespective of limb size.
  1834. In GMP 1, leading zero bytes were written to pad the data bytes to a multiple
  1835. of the limb size.  @code{mpz_inp_raw} will still accept this, for
  1836. compatibility.
  1837. The use of ``big endian'' for both the size and data fields is deliberate, it
  1838. makes the data easy to read in a hex dump of a file.  Unfortunately it also
  1839. means that the limb data must be reversed when reading or writing, so neither
  1840. a big endian nor little endian system can just read and write @code{_mp_d}.
  1841. @node C++ Interface Internals,  , Raw Output Internals, Internals
  1842. @section C++ Interface Internals
  1843. @cindex C++ interface internals
  1844. A system of expression templates is used to ensure something like @code{a=b+c}
  1845. turns into a simple call to @code{mpz_add} etc.  For @code{mpf_class}
  1846. the scheme also ensures the precision of the final
  1847. destination is used for any temporaries within a statement like
  1848. @code{f=w*x+y*z}.  These are important features which a naive implementation
  1849. cannot provide.
  1850. A simplified description of the scheme follows.  The true scheme is
  1851. complicated by the fact that expressions have different return types.  For
  1852. detailed information, refer to the source code.
  1853. To perform an operation, say, addition, we first define a ``function object''
  1854. evaluating it,
  1855. @example
  1856. struct __gmp_binary_plus
  1857. @{
  1858.   static void eval(mpf_t f, mpf_t g, mpf_t h) @{ mpf_add(f, g, h); @}
  1859. @};
  1860. @end example
  1861. @noindent
  1862. And an ``additive expression'' object,
  1863. @example
  1864. __gmp_expr<__gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_plus> >
  1865. operator+(const mpf_class &f, const mpf_class &g)
  1866. @{
  1867.   return __gmp_expr
  1868.     <__gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_plus> >(f, g);
  1869. @}
  1870. @end example
  1871. The seemingly redundant @code{__gmp_expr<__gmp_binary_expr<@dots{}>>} is used to
  1872. encapsulate any possible kind of expression into a single template type.  In
  1873. fact even @code{mpf_class} etc are @code{typedef} specializations of
  1874. @code{__gmp_expr}.
  1875. Next we define assignment of @code{__gmp_expr} to @code{mpf_class}.
  1876. @example
  1877. template <class T>
  1878. mpf_class & mpf_class::operator=(const __gmp_expr<T> &expr)
  1879. @{
  1880.   expr.eval(this->get_mpf_t(), this->precision());
  1881.   return *this;
  1882. @}
  1883. template <class Op>
  1884. void __gmp_expr<__gmp_binary_expr<mpf_class, mpf_class, Op> >::eval
  1885. (mpf_t f, mp_bitcnt_t precision)
  1886. @{
  1887.   Op::eval(f, expr.val1.get_mpf_t(), expr.val2.get_mpf_t());
  1888. @}
  1889. @end example
  1890. where @code{expr.val1} and @code{expr.val2} are references to the expression's
  1891. operands (here @code{expr} is the @code{__gmp_binary_expr} stored within the
  1892. @code{__gmp_expr}).
  1893. This way, the expression is actually evaluated only at the time of assignment,
  1894. when the required precision (that of @code{f}) is known.  Furthermore the
  1895. target @code{mpf_t} is now available, thus we can call @code{mpf_add} directly
  1896. with @code{f} as the output argument.
  1897. Compound expressions are handled by defining operators taking subexpressions
  1898. as their arguments, like this:
  1899. @example
  1900. template <class T, class U>
  1901. __gmp_expr
  1902. <__gmp_binary_expr<__gmp_expr<T>, __gmp_expr<U>, __gmp_binary_plus> >
  1903. operator+(const __gmp_expr<T> &expr1, const __gmp_expr<U> &expr2)
  1904. @{
  1905.   return __gmp_expr
  1906.     <__gmp_binary_expr<__gmp_expr<T>, __gmp_expr<U>, __gmp_binary_plus> >
  1907.     (expr1, expr2);
  1908. @}
  1909. @end example
  1910. And the corresponding specializations of @code{__gmp_expr::eval}:
  1911. @example
  1912. template <class T, class U, class Op>
  1913. void __gmp_expr
  1914. <__gmp_binary_expr<__gmp_expr<T>, __gmp_expr<U>, Op> >::eval
  1915. (mpf_t f, mp_bitcnt_t precision)
  1916. @{
  1917.   // declare two temporaries
  1918.   mpf_class temp1(expr.val1, precision), temp2(expr.val2, precision);
  1919.   Op::eval(f, temp1.get_mpf_t(), temp2.get_mpf_t());
  1920. @}
  1921. @end example
  1922. The expression is thus recursively evaluated to any level of complexity and
  1923. all subexpressions are evaluated to the precision of @code{f}.
  1924. @node Contributors, References, Internals, Top
  1925. @comment  node-name,  next,  previous,  up
  1926. @appendix Contributors
  1927. @cindex Contributors
  1928. Torbj@"orn Granlund wrote the original GMP library and is still the main
  1929. developer.  Code not explicitly attributed to others, was contributed by
  1930. Torbj@"orn.  Several other individuals and organizations have contributed
  1931. GMP.  Here is a list in chronological order on first contribution:
  1932. Gunnar Sj@"odin and Hans Riesel helped with mathematical problems in early
  1933. versions of the library.
  1934. Richard Stallman helped with the interface design and revised the first
  1935. version of this manual.
  1936. Brian Beuning and Doug Lea helped with testing of early versions of the
  1937. library and made creative suggestions.
  1938. John Amanatides of York University in Canada contributed the function
  1939. @code{mpz_probab_prime_p}.
  1940. Paul Zimmermann wrote the REDC-based mpz_powm code, the Sch@"onhage-Strassen
  1941. FFT multiply code, and the Karatsuba square root code.  He also improved the
  1942. Toom3 code for GMP 4.2.  Paul sparked the development of GMP 2, with his
  1943. comparisons between bignum packages.  The ECMNET project Paul is organizing
  1944. was a driving force behind many of the optimizations in GMP 3.  Paul also
  1945. wrote the new GMP 4.3 nth root code (with Torbj@"orn).
  1946. Ken Weber (Kent State University, Universidade Federal do Rio Grande do Sul)
  1947. contributed now defunct versions of @code{mpz_gcd}, @code{mpz_divexact},
  1948. @code{mpn_gcd}, and @code{mpn_bdivmod}, partially supported by CNPq (Brazil)
  1949. grant 301314194-2.
  1950. Per Bothner of Cygnus Support helped to set up GMP to use Cygnus' configure.
  1951. He has also made valuable suggestions and tested numerous intermediary
  1952. releases.
  1953. Joachim Hollman was involved in the design of the @code{mpf} interface, and in
  1954. the @code{mpz} design revisions for version 2.
  1955. Bennet Yee contributed the initial versions of @code{mpz_jacobi} and
  1956. @code{mpz_legendre}.
  1957. Andreas Schwab contributed the files @file{mpn/m68k/lshift.S} and
  1958. @file{mpn/m68k/rshift.S} (now in @file{.asm} form).
  1959. Robert Harley of Inria, France and David Seal of ARM, England, suggested clever
  1960. improvements for population count.  Robert also wrote highly optimized
  1961. Karatsuba and 3-way Toom multiplication functions for GMP 3, and contributed
  1962. the ARM assembly code.
  1963. Torsten Ekedahl of the Mathematical department of Stockholm University provided
  1964. significant inspiration during several phases of the GMP development.  His
  1965. mathematical expertise helped improve several algorithms.
  1966. Linus Nordberg wrote the new configure system based on autoconf and
  1967. implemented the new random functions.
  1968. Kevin Ryde worked on a large number of things: optimized x86 code, m4 asm
  1969. macros, parameter tuning, speed measuring, the configure system, function
  1970. inlining, divisibility tests, bit scanning, Jacobi symbols, Fibonacci and Lucas
  1971. number functions, printf and scanf functions, perl interface, demo expression
  1972. parser, the algorithms chapter in the manual, @file{gmpasm-mode.el}, and
  1973. various miscellaneous improvements elsewhere.
  1974. Kent Boortz made the Mac OS 9 port.
  1975. Steve Root helped write the optimized alpha 21264 assembly code.
  1976. Gerardo Ballabio wrote the @file{gmpxx.h} C++ class interface and the C++
  1977. @code{istream} input routines.
  1978. Jason Moxham rewrote @code{mpz_fac_ui}.
  1979. Pedro Gimeno implemented the Mersenne Twister and made other random number
  1980. improvements.
  1981. Niels M@"oller wrote the sub-quadratic GCD and extended GCD code, the
  1982. quadratic Hensel division code, and (with Torbj@"orn) the new divide and
  1983. conquer division code for GMP 4.3.  Niels also helped implement the new Toom
  1984. multiply code for GMP 4.3 and implemented helper functions to simplify Toom
  1985. evaluations for GMP 5.0.  He wrote the original version of mpn_mulmod_bnm1.
  1986. Alberto Zanoni and Marco Bodrato suggested the unbalanced multiply strategy,
  1987. and found the optimal strategies for evaluation and interpolation in Toom
  1988. multiplication.
  1989. Marco Bodrato helped implement the new Toom multiply code for GMP 4.3 and
  1990. implemented most of the new Toom multiply and squaring code for 5.0.
  1991. He is the main author of the current mpn_mulmod_bnm1 and mpn_mullo_n.  Marco
  1992. also wrote the functions mpn_invert and mpn_invertappr.
  1993. David Harvey suggested the internal function @code{mpn_bdiv_dbm1}, implementing
  1994. division relevant to Toom multiplication.  He also worked on fast assembly
  1995. sequences, in particular on a fast AMD64 @code{mpn_mul_basecase}.
  1996. Martin Boij wrote @code{mpn_perfect_power_p}.
  1997. (This list is chronological, not ordered after significance.  If you have
  1998. contributed to GMP but are not listed above, please tell
  1999. @email{gmp-devel@@gmplib.org} about the omission!)
  2000. The development of floating point functions of GNU MP 2, were supported in part
  2001. by the ESPRIT-BRA (Basic Research Activities) 6846 project POSSO (POlynomial
  2002. System SOlving).
  2003. The development of GMP 2, 3, and 4 was supported in part by the IDA Center for
  2004. Computing Sciences.
  2005. Thanks go to Hans Thorsen for donating an SGI system for the GMP test system
  2006. environment.
  2007. @node References, GNU Free Documentation License, Contributors, Top
  2008. @comment  node-name,  next,  previous,  up
  2009. @appendix References
  2010. @cindex References
  2011. @c  FIXME: In tex, the @uref's are unhyphenated, which is good for clarity,
  2012. @c  but being long words they upset paragraph formatting (the preceding line
  2013. @c  can get badly stretched).  Would like an conditional @* style line break
  2014. @c  if the uref is too long to fit on the last line of the paragraph, but it's
  2015. @c  not clear how to do that.  For now explicit @texlinebreak{}s are used on
  2016. @c  paragraphs that come out bad.
  2017. @section Books
  2018. @itemize @bullet
  2019. @item
  2020. Jonathan M. Borwein and Peter B. Borwein, ``Pi and the AGM: A Study in
  2021. Analytic Number Theory and Computational Complexity'', Wiley, 1998.
  2022. @item
  2023. Richard Crandall and Carl Pomerance, ``Prime Numbers: A Computational
  2024. Perspective'', 2nd edition, Springer-Verlag, 2005.
  2025. @texlinebreak{} @uref{http://math.dartmouth.edu/~carlp/}
  2026. @item
  2027. Henri Cohen, ``A Course in Computational Algebraic Number Theory'', Graduate
  2028. Texts in Mathematics number 138, Springer-Verlag, 1993.
  2029. @texlinebreak{} @uref{http://www.math.u-bordeaux.fr/~cohen/}
  2030. @item
  2031. Donald E. Knuth, ``The Art of Computer Programming'', volume 2,
  2032. ``Seminumerical Algorithms'', 3rd edition, Addison-Wesley, 1998.
  2033. @texlinebreak{} @uref{http://www-cs-faculty.stanford.edu/~knuth/taocp.html}
  2034. @item
  2035. John D. Lipson, ``Elements of Algebra and Algebraic Computing'',
  2036. The Benjamin Cummings Publishing Company Inc, 1981.
  2037. @item
  2038. Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone, ``Handbook of
  2039. Applied Cryptography'', @uref{http://www.cacr.math.uwaterloo.ca/hac/}
  2040. @item
  2041. Richard M. Stallman and the GCC Developer Community, ``Using the GNU Compiler
  2042. Collection'', Free Software Foundation, 2008, available online
  2043. @uref{http://gcc.gnu.org/onlinedocs/}, and in the GCC package
  2044. @uref{ftp://ftp.gnu.org/gnu/gcc/}
  2045. @end itemize
  2046. @section Papers
  2047. @itemize @bullet
  2048. @item
  2049. Yves Bertot, Nicolas Magaud and Paul Zimmermann, ``A Proof of GMP Square
  2050. Root'', Journal of Automated Reasoning, volume 29, 2002, pp.@: 225-252.  Also
  2051. available online as INRIA Research Report 4475, June 2001,
  2052. @uref{http://www.inria.fr/rrrt/rr-4475.html}
  2053. @item
  2054. Christoph Burnikel and Joachim Ziegler, ``Fast Recursive Division'',
  2055. Max-Planck-Institut fuer Informatik Research Report MPI-I-98-1-022,
  2056. @texlinebreak{} @uref{http://data.mpi-sb.mpg.de/internet/reports.nsf/NumberView/1998-1-022}
  2057. @item
  2058. Torbj@"orn Granlund and Peter L. Montgomery, ``Division by Invariant Integers
  2059. using Multiplication'', in Proceedings of the SIGPLAN PLDI'94 Conference, June
  2060. 1994.  Also available @uref{ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz}
  2061. (and .psl.gz).
  2062. @item
  2063. Niels M@"oller and Torbj@"orn Granlund, ``Improved division by invariant
  2064. integers'', to appear.
  2065. @item
  2066. Torbj@"orn Granlund and Niels M@"oller, ``Division of integers large and
  2067. small'', to appear.
  2068. @item
  2069. Tudor Jebelean,
  2070. ``An algorithm for exact division'',
  2071. Journal of Symbolic Computation,
  2072. volume 15, 1993, pp.@: 169-180.
  2073. Research report version available @texlinebreak{}
  2074. @uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz}
  2075. @item
  2076. Tudor Jebelean, ``Exact Division with Karatsuba Complexity - Extended
  2077. Abstract'', RISC-Linz technical report 96-31, @texlinebreak{}
  2078. @uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-31.ps.gz}
  2079. @item
  2080. Tudor Jebelean, ``Practical Integer Division with Karatsuba Complexity'',
  2081. ISSAC 97, pp.@: 339-341.  Technical report available @texlinebreak{}
  2082. @uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-29.ps.gz}
  2083. @item
  2084. Tudor Jebelean, ``A Generalization of the Binary GCD Algorithm'', ISSAC 93,
  2085. pp.@: 111-116.  Technical report version available @texlinebreak{}
  2086. @uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1993/93-01.ps.gz}
  2087. @item
  2088. Tudor Jebelean, ``A Double-Digit Lehmer-Euclid Algorithm for Finding the GCD
  2089. of Long Integers'', Journal of Symbolic Computation, volume 19, 1995,
  2090. pp.@: 145-157.  Technical report version also available @texlinebreak{}
  2091. @uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-69.ps.gz}
  2092. @item
  2093. Werner Krandick and Tudor Jebelean, ``Bidirectional Exact Integer Division'',
  2094. Journal of Symbolic Computation, volume 21, 1996, pp.@: 441-455.  Early
  2095. technical report version also available
  2096. @uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1994/94-50.ps.gz}
  2097. @item
  2098. Makoto Matsumoto and Takuji Nishimura, ``Mersenne Twister: A 623-dimensionally
  2099. equidistributed uniform pseudorandom number generator'', ACM Transactions on
  2100. Modelling and Computer Simulation, volume 8, January 1998, pp.@: 3-30.
  2101. Available online @texlinebreak{}
  2102. @uref{http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ARTICLES/mt.ps.gz} (or .pdf)
  2103. @item
  2104. R. Moenck and A. Borodin, ``Fast Modular Transforms via Division'',
  2105. Proceedings of the 13th Annual IEEE Symposium on Switching and Automata
  2106. Theory, October 1972, pp.@: 90-96.  Reprinted as ``Fast Modular Transforms'',
  2107. Journal of Computer and System Sciences, volume 8, number 3, June 1974,
  2108. pp.@: 366-386.
  2109. @item
  2110. Niels M@"oller, ``On Sch@"onhage's algorithm and subquadratic integer GCD
  2111.   computation'', in Mathematics of Computation, volume 77, January 2008, pp.@:
  2112.   589-607.
  2113. @item
  2114. Peter L. Montgomery, ``Modular Multiplication Without Trial Division'', in
  2115. Mathematics of Computation, volume 44, number 170, April 1985.
  2116. @item
  2117. Arnold Sch@"onhage and Volker Strassen, ``Schnelle Multiplikation grosser
  2118. Zahlen'', Computing 7, 1971, pp.@: 281-292.
  2119. @item
  2120. Kenneth Weber, ``The accelerated integer GCD algorithm'',
  2121. ACM Transactions on Mathematical Software,
  2122. volume 21, number 1, March 1995, pp.@: 111-122.
  2123. @item
  2124. Paul Zimmermann, ``Karatsuba Square Root'', INRIA Research Report 3805,
  2125. November 1999, @uref{http://www.inria.fr/rrrt/rr-3805.html}
  2126. @item
  2127. Paul Zimmermann, ``A Proof of GMP Fast Division and Square Root
  2128. Implementations'', @texlinebreak{}
  2129. @uref{http://www.loria.fr/~zimmerma/papers/proof-div-sqrt.ps.gz}
  2130. @item
  2131. Dan Zuras, ``On Squaring and Multiplying Large Integers'', ARITH-11: IEEE
  2132. Symposium on Computer Arithmetic, 1993, pp.@: 260 to 271.  Reprinted as ``More
  2133. on Multiplying and Squaring Large Integers'', IEEE Transactions on Computers,
  2134. volume 43, number 8, August 1994, pp.@: 899-908.
  2135. @end itemize
  2136. @node GNU Free Documentation License, Concept Index, References, Top
  2137. @appendix GNU Free Documentation License
  2138. @cindex GNU Free Documentation License
  2139. @cindex Free Documentation License
  2140. @cindex Documentation license
  2141. @include fdl-1.3.texi
  2142. @node Concept Index, Function Index, GNU Free Documentation License, Top
  2143. @comment  node-name,  next,  previous,  up
  2144. @unnumbered Concept Index
  2145. @printindex cp
  2146. @node Function Index,  , Concept Index, Top
  2147. @comment  node-name,  next,  previous,  up
  2148. @unnumbered Function and Type Index
  2149. @printindex fn
  2150. @bye
  2151. @c Local variables:
  2152. @c fill-column: 78
  2153. @c compile-command: "make gmp.info"
  2154. @c End: