mul.txt
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:4k
源码类别:

CA认证

开发平台:

WINDOWS

  1. Multiplication
  2. This describes the multiplication algorithm used by the MPI library.
  3. This is basically a standard "schoolbook" algorithm.  It is slow --
  4. O(mn) for m = #a, n = #b -- but easy to implement and verify.
  5. Basically, we run two nested loops, as illustrated here (R is the
  6. radix):
  7. k = 0
  8. for j <- 0 to (#b - 1)
  9.   for i <- 0 to (#a - 1)
  10.     w = (a[j] * b[i]) + k + c[i+j]
  11.     c[i+j] = w mod R
  12.     k = w div R
  13.   endfor
  14.   c[i+j] = k;
  15.   k = 0;
  16. endfor
  17. It is necessary that 'w' have room for at least two radix R digits.
  18. The product of any two digits in radix R is at most:
  19. (R - 1)(R - 1) = R^2 - 2R + 1
  20. Since a two-digit radix-R number can hold R^2 - 1 distinct values,
  21. this insures that the product will fit into the two-digit register.
  22. To insure that two digits is enough for w, we must also show that
  23. there is room for the carry-in from the previous multiplication, and
  24. the current value of the product digit that is being recomputed.
  25. Assuming each of these may be as big as R - 1 (and no larger,
  26. certainly), two digits will be enough if and only if:
  27. (R^2 - 2R + 1) + 2(R - 1) <= R^2 - 1
  28. Solving this equation shows that, indeed, this is the case:
  29. R^2 - 2R + 1 + 2R - 2 <= R^2 - 1
  30. R^2 - 1 <= R^2 - 1
  31. This suggests that a good radix would be one more than the largest
  32. value that can be held in half a machine word -- so, for example, as
  33. in this implementation, where we used a radix of 65536 on a machine
  34. with 4-byte words.  Another advantage of a radix of this sort is that
  35. binary-level operations are easy on numbers in this representation.
  36. Here's an example multiplication worked out longhand in radix-10,
  37. using the above algorithm:
  38.    a =     999
  39.    b =   x 999
  40.   -------------
  41.    p =   98001
  42. w = (a[jx] * b[ix]) + kin + c[ix + jx]
  43. c[ix+jx] = w % RADIX
  44. k = w / RADIX
  45.                                                                product
  46. ix jx a[jx] b[ix] kin w c[i+j] kout 000000
  47. 0 0 9 9 0 81+0+0 1 8 000001
  48. 0 1 9 9 8 81+8+0 9 8 000091
  49. 0 2 9 9 8 81+8+0 9 8 000991
  50. 8 0 008991
  51. 1 0 9 9 0 81+0+9 0 9 008901
  52. 1 1 9 9 9 81+9+9 9 9 008901
  53. 1 2 9 9 9 81+9+8 8 9 008901
  54. 9 0 098901
  55. 2 0 9 9 0 81+0+9 0 9 098001
  56. 2 1 9 9 9 81+9+8 8 9 098001
  57. 2 2 9 9 9 81+9+9 9 9 098001
  58. ------------------------------------------------------------------
  59. The contents of this file are subject to the Mozilla Public
  60. License Version 1.1 (the "License"); you may not use this file
  61. except in compliance with the License. You may obtain a copy of
  62. the License at http://www.mozilla.org/MPL/
  63. Software distributed under the License is distributed on an "AS
  64. IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  65. implied. See the License for the specific language governing
  66. rights and limitations under the License.
  67. The Original Code is the MPI Arbitrary Precision Integer Arithmetic
  68. library.
  69. The Initial Developer of the Original Code is 
  70. Michael J. Fromberger <sting@linguist.dartmouth.edu>
  71. Portions created by Michael J. Fromberger are 
  72. Copyright (C) 1998, 2000 Michael J. Fromberger. All Rights Reserved.
  73. Contributor(s):
  74. Alternatively, the contents of this file may be used under the
  75. terms of the GNU General Public License Version 2 or later (the
  76. "GPL"), in which case the provisions of the GPL are applicable
  77. instead of those above.  If you wish to allow use of your
  78. version of this file only under the terms of the GPL and not to
  79. allow others to use your version of this file under the MPL,
  80. indicate your decision by deleting the provisions above and
  81. replace them with the notice and other provisions required by
  82. the GPL.  If you do not delete the provisions above, a recipient
  83. may use your version of this file under either the MPL or the GPL.
  84. $Id: mul.txt,v 1.1 2000/07/14 00:44:35 nelsonb%netscape.com Exp $