mpmul.f 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. *DECK MPMUL
  2. SUBROUTINE MPMUL (X, Y, Z)
  3. C***BEGIN PROLOGUE MPMUL
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DQDOTA and DQDOTI
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (MPMUL-A)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C Multiplies X and Y, returning result in Z, for 'mp' X, Y and Z.
  12. C The simple o(t**2) algorithm is used, with four guard digits and
  13. C R*-rounding. Advantage is taken of zero digits in X, but not in Y.
  14. C Asymptotically faster algorithms are known (see Knuth, VOL. 2),
  15. C but are difficult to implement in FORTRAN in an efficient and
  16. C machine-independent manner. In comments to other 'mp' routines,
  17. C M(t) is the time to perform t-digit 'mp' multiplication. Thus
  18. C M(t) = o(t**2) with the present version of MPMUL, but
  19. C M(t) = o(t.log(t).log(log(t))) is theoretically possible.
  20. C
  21. C The arguments X(*), Y(*), and Z(*), and the variable R in COMMON are
  22. C all INTEGER arrays of size 30. See the comments in the routine
  23. C MPBLAS for the reason for this choice.
  24. C
  25. C***SEE ALSO DQDOTA, DQDOTI, MPBLAS
  26. C***ROUTINES CALLED MPCHK, MPERR, MPMLP, MPNZR
  27. C***COMMON BLOCKS MPCOM
  28. C***REVISION HISTORY (YYMMDD)
  29. C 791001 DATE WRITTEN
  30. C ?????? Modified for use with BLAS. Blank COMMON changed to named
  31. C COMMON. R given dimension 12.
  32. C 890531 Changed all specific intrinsics to generic. (WRB)
  33. C 891214 Prologue converted to Version 4.0 format. (BAB)
  34. C 900402 Added TYPE section. (WRB)
  35. C 930124 Increased Array size in MPCON for SUN -r8. (RWC)
  36. C***END PROLOGUE MPMUL
  37. COMMON /MPCOM/ B, T, M, LUN, MXR, R(30)
  38. INTEGER B, T, R, X(*), Y(*), Z(*), RS, RE, XI, C, RI
  39. C***FIRST EXECUTABLE STATEMENT MPMUL
  40. CALL MPCHK (1, 4)
  41. I2 = T + 4
  42. I2P = I2 + 1
  43. C FORM SIGN OF PRODUCT
  44. RS = X(1)*Y(1)
  45. IF (RS.NE.0) GO TO 10
  46. C SET RESULT TO ZERO
  47. Z(1) = 0
  48. RETURN
  49. C FORM EXPONENT OF PRODUCT
  50. 10 RE = X(2) + Y(2)
  51. C CLEAR ACCUMULATOR
  52. DO 20 I = 1, I2
  53. 20 R(I) = 0
  54. C PERFORM MULTIPLICATION
  55. C = 8
  56. DO 40 I = 1, T
  57. XI = X(I+2)
  58. C FOR SPEED, PUT THE NUMBER WITH MANY ZEROS FIRST
  59. IF (XI.EQ.0) GO TO 40
  60. CALL MPMLP (R(I+1), Y(3), XI, MIN (T, I2 - I))
  61. C = C - 1
  62. IF (C.GT.0) GO TO 40
  63. C CHECK FOR LEGAL BASE B DIGIT
  64. IF ((XI.LT.0).OR.(XI.GE.B)) GO TO 90
  65. C PROPAGATE CARRIES AT END AND EVERY EIGHTH TIME,
  66. C FASTER THAN DOING IT EVERY TIME.
  67. DO 30 J = 1, I2
  68. J1 = I2P - J
  69. RI = R(J1) + C
  70. IF (RI.LT.0) GO TO 70
  71. C = RI/B
  72. 30 R(J1) = RI - B*C
  73. IF (C.NE.0) GO TO 90
  74. C = 8
  75. 40 CONTINUE
  76. IF (C.EQ.8) GO TO 60
  77. IF ((XI.LT.0).OR.(XI.GE.B)) GO TO 90
  78. C = 0
  79. DO 50 J = 1, I2
  80. J1 = I2P - J
  81. RI = R(J1) + C
  82. IF (RI.LT.0) GO TO 70
  83. C = RI/B
  84. 50 R(J1) = RI - B*C
  85. IF (C.NE.0) GO TO 90
  86. C NORMALIZE AND ROUND RESULT
  87. 60 CALL MPNZR (RS, RE, Z, 0)
  88. RETURN
  89. 70 WRITE (LUN, 80)
  90. 80 FORMAT (' *** INTEGER OVERFLOW IN MPMUL, B TOO LARGE ***')
  91. GO TO 110
  92. 90 WRITE (LUN, 100)
  93. 100 FORMAT (' *** ILLEGAL BASE B DIGIT IN CALL TO MPMUL,',
  94. 1 ' POSSIBLE OVERWRITING PROBLEM ***')
  95. 110 CALL MPERR
  96. Z(1) = 0
  97. RETURN
  98. END