1 SUBROUTINE DLARUV
( ISEED
, N
, X
)
3 * -- LAPACK auxiliary routine
(version
3.1) --
4 * Univ
. of Tennessee
, Univ
. of California Berkeley and NAG Ltd
..
7 * .. Scalar Arguments
..
10 * .. Array Arguments
..
12 DOUBLE PRECISION X
( N
)
18 * DLARUV returns a vector of n random
real numbers from a uniform
(0,1)
19 * distribution
(n
<= 128).
21 * This is an auxiliary routine called by DLARNV and ZLARNV
.
26 * ISEED
(input
/output
) INTEGER array
, dimension (4)
27 * On entry
, the seed of the random number generator
; the array
28 * elements must be between
0 and
4095, and ISEED
(4) must be
30 * On exit
, the seed is updated
.
33 * The number of random numbers
to be generated
. N
<= 128.
35 * X
(output
) DOUBLE PRECISION array
, dimension (N
)
36 * The generated random numbers
.
41 * This routine uses a multiplicative congruential method with modulus
42 * 2**48 and multiplier
33952834046453 (see G
.S
.Fishman
,
43 * 'Multiplicative congruential random number generators with modulus
44 * 2**b: an exhaustive analysis for b = 32 and a partial analysis for
45 * b = 48', Math
. Comp
. 189, pp
331-344, 1990).
47 * 48-bit integers are stored in
4 integer array elements with
12 bits
48 * per element
. Hence the routine is portable across machines with
49 * integers of
32 bits or more
.
51 * =====================================================================
55 PARAMETER ( ONE
= 1.0D0
)
58 PARAMETER ( LV
= 128, IPW2
= 4096, R
= ONE
/ IPW2
)
61 INTEGER I
, I1
, I2
, I3
, I4
, IT1
, IT2
, IT3
, IT4
, J
66 * .. Intrinsic Functions
..
67 INTRINSIC DBLE
, MIN
, MOD
69 * .. Data statements
..
70 DATA
( MM
( 1, J
), J
= 1, 4 ) / 494, 322, 2508,
72 DATA
( MM
( 2, J
), J
= 1, 4 ) / 2637, 789, 3754,
74 DATA
( MM
( 3, J
), J
= 1, 4 ) / 255, 1440, 1766,
76 DATA
( MM
( 4, J
), J
= 1, 4 ) / 2008, 752, 3572,
78 DATA
( MM
( 5, J
), J
= 1, 4 ) / 1253, 2859, 2893,
80 DATA
( MM
( 6, J
), J
= 1, 4 ) / 3344, 123, 307,
82 DATA
( MM
( 7, J
), J
= 1, 4 ) / 4084, 1848, 1297,
84 DATA
( MM
( 8, J
), J
= 1, 4 ) / 1739, 643, 3966,
86 DATA
( MM
( 9, J
), J
= 1, 4 ) / 3143, 2405, 758,
88 DATA
( MM
( 10, J
), J
= 1, 4 ) / 3468, 2638, 2598,
90 DATA
( MM
( 11, J
), J
= 1, 4 ) / 688, 2344, 3406,
92 DATA
( MM
( 12, J
), J
= 1, 4 ) / 1657, 46, 2922,
94 DATA
( MM
( 13, J
), J
= 1, 4 ) / 1238, 3814, 1038,
96 DATA
( MM
( 14, J
), J
= 1, 4 ) / 3166, 913, 2934,
98 DATA
( MM
( 15, J
), J
= 1, 4 ) / 1292, 3649, 2091,
100 DATA
( MM
( 16, J
), J
= 1, 4 ) / 3422, 339, 2451,
102 DATA
( MM
( 17, J
), J
= 1, 4 ) / 1270, 3808, 1580,
104 DATA
( MM
( 18, J
), J
= 1, 4 ) / 2016, 822, 1958,
106 DATA
( MM
( 19, J
), J
= 1, 4 ) / 154, 2832, 2055,
108 DATA
( MM
( 20, J
), J
= 1, 4 ) / 2862, 3078, 1507,
110 DATA
( MM
( 21, J
), J
= 1, 4 ) / 697, 3633, 1078,
112 DATA
( MM
( 22, J
), J
= 1, 4 ) / 1706, 2970, 3273,
114 DATA
( MM
( 23, J
), J
= 1, 4 ) / 491, 637, 17,
116 DATA
( MM
( 24, J
), J
= 1, 4 ) / 931, 2249, 854,
118 DATA
( MM
( 25, J
), J
= 1, 4 ) / 1444, 2081, 2916,
120 DATA
( MM
( 26, J
), J
= 1, 4 ) / 444, 4019, 3971,
122 DATA
( MM
( 27, J
), J
= 1, 4 ) / 3577, 1478, 2889,
124 DATA
( MM
( 28, J
), J
= 1, 4 ) / 3944, 242, 3831,
126 DATA
( MM
( 29, J
), J
= 1, 4 ) / 2184, 481, 2621,
128 DATA
( MM
( 30, J
), J
= 1, 4 ) / 1661, 2075, 1541,
130 DATA
( MM
( 31, J
), J
= 1, 4 ) / 3482, 4058, 893,
132 DATA
( MM
( 32, J
), J
= 1, 4 ) / 657, 622, 736,
134 DATA
( MM
( 33, J
), J
= 1, 4 ) / 3023, 3376, 3992,
136 DATA
( MM
( 34, J
), J
= 1, 4 ) / 3618, 812, 787,
138 DATA
( MM
( 35, J
), J
= 1, 4 ) / 1267, 234, 2125,
140 DATA
( MM
( 36, J
), J
= 1, 4 ) / 1828, 641, 2364,
142 DATA
( MM
( 37, J
), J
= 1, 4 ) / 164, 4005, 2460,
144 DATA
( MM
( 38, J
), J
= 1, 4 ) / 3798, 1122, 257,
146 DATA
( MM
( 39, J
), J
= 1, 4 ) / 3087, 3135, 1574,
148 DATA
( MM
( 40, J
), J
= 1, 4 ) / 2400, 2640, 3912,
150 DATA
( MM
( 41, J
), J
= 1, 4 ) / 2870, 2302, 1216,
152 DATA
( MM
( 42, J
), J
= 1, 4 ) / 3876, 40, 3248,
154 DATA
( MM
( 43, J
), J
= 1, 4 ) / 1905, 1832, 3401,
156 DATA
( MM
( 44, J
), J
= 1, 4 ) / 1593, 2247, 2124,
158 DATA
( MM
( 45, J
), J
= 1, 4 ) / 1797, 2034, 2762,
160 DATA
( MM
( 46, J
), J
= 1, 4 ) / 1234, 2637, 149,
162 DATA
( MM
( 47, J
), J
= 1, 4 ) / 3460, 1287, 2245,
164 DATA
( MM
( 48, J
), J
= 1, 4 ) / 328, 1691, 166,
166 DATA
( MM
( 49, J
), J
= 1, 4 ) / 2861, 496, 466,
168 DATA
( MM
( 50, J
), J
= 1, 4 ) / 1950, 1597, 4018,
170 DATA
( MM
( 51, J
), J
= 1, 4 ) / 617, 2394, 1399,
172 DATA
( MM
( 52, J
), J
= 1, 4 ) / 2070, 2584, 190,
174 DATA
( MM
( 53, J
), J
= 1, 4 ) / 3331, 1843, 2879,
176 DATA
( MM
( 54, J
), J
= 1, 4 ) / 769, 336, 153,
178 DATA
( MM
( 55, J
), J
= 1, 4 ) / 1558, 1472, 2320,
180 DATA
( MM
( 56, J
), J
= 1, 4 ) / 2412, 2407, 18,
182 DATA
( MM
( 57, J
), J
= 1, 4 ) / 2800, 433, 712,
184 DATA
( MM
( 58, J
), J
= 1, 4 ) / 189, 2096, 2159,
186 DATA
( MM
( 59, J
), J
= 1, 4 ) / 287, 1761, 2318,
188 DATA
( MM
( 60, J
), J
= 1, 4 ) / 2045, 2810, 2091,
190 DATA
( MM
( 61, J
), J
= 1, 4 ) / 1227, 566, 3443,
192 DATA
( MM
( 62, J
), J
= 1, 4 ) / 2838, 442, 1510,
194 DATA
( MM
( 63, J
), J
= 1, 4 ) / 209, 41, 449,
196 DATA
( MM
( 64, J
), J
= 1, 4 ) / 2770, 1238, 1956,
198 DATA
( MM
( 65, J
), J
= 1, 4 ) / 3654, 1086, 2201,
200 DATA
( MM
( 66, J
), J
= 1, 4 ) / 3993, 603, 3137,
202 DATA
( MM
( 67, J
), J
= 1, 4 ) / 192, 840, 3399,
204 DATA
( MM
( 68, J
), J
= 1, 4 ) / 2253, 3168, 1321,
206 DATA
( MM
( 69, J
), J
= 1, 4 ) / 3491, 1499, 2271,
208 DATA
( MM
( 70, J
), J
= 1, 4 ) / 2889, 1084, 3667,
210 DATA
( MM
( 71, J
), J
= 1, 4 ) / 2857, 3438, 2703,
212 DATA
( MM
( 72, J
), J
= 1, 4 ) / 2094, 2408, 629,
214 DATA
( MM
( 73, J
), J
= 1, 4 ) / 1818, 1589, 2365,
216 DATA
( MM
( 74, J
), J
= 1, 4 ) / 688, 2391, 2431,
218 DATA
( MM
( 75, J
), J
= 1, 4 ) / 1407, 288, 1113,
220 DATA
( MM
( 76, J
), J
= 1, 4 ) / 634, 26, 3922,
222 DATA
( MM
( 77, J
), J
= 1, 4 ) / 3231, 512, 2554,
224 DATA
( MM
( 78, J
), J
= 1, 4 ) / 815, 1456, 184,
226 DATA
( MM
( 79, J
), J
= 1, 4 ) / 3524, 171, 2099,
228 DATA
( MM
( 80, J
), J
= 1, 4 ) / 1914, 1677, 3228,
230 DATA
( MM
( 81, J
), J
= 1, 4 ) / 516, 2657, 4012,
232 DATA
( MM
( 82, J
), J
= 1, 4 ) / 164, 2270, 1921,
234 DATA
( MM
( 83, J
), J
= 1, 4 ) / 303, 2587, 3452,
236 DATA
( MM
( 84, J
), J
= 1, 4 ) / 2144, 2961, 3901,
238 DATA
( MM
( 85, J
), J
= 1, 4 ) / 3480, 1970, 572,
240 DATA
( MM
( 86, J
), J
= 1, 4 ) / 119, 1817, 3309,
242 DATA
( MM
( 87, J
), J
= 1, 4 ) / 3357, 676, 3171,
244 DATA
( MM
( 88, J
), J
= 1, 4 ) / 837, 1410, 817,
246 DATA
( MM
( 89, J
), J
= 1, 4 ) / 2826, 3723, 3039,
248 DATA
( MM
( 90, J
), J
= 1, 4 ) / 2332, 2803, 1696,
250 DATA
( MM
( 91, J
), J
= 1, 4 ) / 2089, 3185, 1256,
252 DATA
( MM
( 92, J
), J
= 1, 4 ) / 3780, 184, 3715,
254 DATA
( MM
( 93, J
), J
= 1, 4 ) / 1700, 663, 2077,
256 DATA
( MM
( 94, J
), J
= 1, 4 ) / 3712, 499, 3019,
258 DATA
( MM
( 95, J
), J
= 1, 4 ) / 150, 3784, 1497,
260 DATA
( MM
( 96, J
), J
= 1, 4 ) / 2000, 1631, 1101,
262 DATA
( MM
( 97, J
), J
= 1, 4 ) / 3375, 1925, 717,
264 DATA
( MM
( 98, J
), J
= 1, 4 ) / 1621, 3912, 51,
266 DATA
( MM
( 99, J
), J
= 1, 4 ) / 3090, 1398, 981,
268 DATA
( MM
( 100, J
), J
= 1, 4 ) / 3765, 1349, 1978,
270 DATA
( MM
( 101, J
), J
= 1, 4 ) / 1149, 1441, 1813,
272 DATA
( MM
( 102, J
), J
= 1, 4 ) / 3146, 2224, 3881,
274 DATA
( MM
( 103, J
), J
= 1, 4 ) / 33, 2411, 76,
276 DATA
( MM
( 104, J
), J
= 1, 4 ) / 3082, 1907, 3846,
278 DATA
( MM
( 105, J
), J
= 1, 4 ) / 2741, 3192, 3694,
280 DATA
( MM
( 106, J
), J
= 1, 4 ) / 359, 2786, 1682,
282 DATA
( MM
( 107, J
), J
= 1, 4 ) / 3316, 382, 124,
284 DATA
( MM
( 108, J
), J
= 1, 4 ) / 1749, 37, 1660,
286 DATA
( MM
( 109, J
), J
= 1, 4 ) / 185, 759, 3997,
288 DATA
( MM
( 110, J
), J
= 1, 4 ) / 2784, 2948, 479,
290 DATA
( MM
( 111, J
), J
= 1, 4 ) / 2202, 1862, 1141,
292 DATA
( MM
( 112, J
), J
= 1, 4 ) / 2199, 3802, 886,
294 DATA
( MM
( 113, J
), J
= 1, 4 ) / 1364, 2423, 3514,
296 DATA
( MM
( 114, J
), J
= 1, 4 ) / 1244, 2051, 1301,
298 DATA
( MM
( 115, J
), J
= 1, 4 ) / 2020, 2295, 3604,
300 DATA
( MM
( 116, J
), J
= 1, 4 ) / 3160, 1332, 1888,
302 DATA
( MM
( 117, J
), J
= 1, 4 ) / 2785, 1832, 1836,
304 DATA
( MM
( 118, J
), J
= 1, 4 ) / 2772, 2405, 1990,
306 DATA
( MM
( 119, J
), J
= 1, 4 ) / 1217, 3638, 2058,
308 DATA
( MM
( 120, J
), J
= 1, 4 ) / 1822, 3661, 692,
310 DATA
( MM
( 121, J
), J
= 1, 4 ) / 1245, 327, 1194,
312 DATA
( MM
( 122, J
), J
= 1, 4 ) / 2252, 3660, 20,
314 DATA
( MM
( 123, J
), J
= 1, 4 ) / 3904, 716, 3285,
316 DATA
( MM
( 124, J
), J
= 1, 4 ) / 2774, 1842, 2046,
318 DATA
( MM
( 125, J
), J
= 1, 4 ) / 997, 3987, 2107,
320 DATA
( MM
( 126, J
), J
= 1, 4 ) / 2573, 1368, 3508,
322 DATA
( MM
( 127, J
), J
= 1, 4 ) / 1148, 1848, 3525,
324 DATA
( MM
( 128, J
), J
= 1, 4 ) / 545, 2366, 3801,
327 * .. Executable Statements
..
334 DO 10 I
= 1, MIN
( N
, LV
)
338 * Multiply the seed by i
-th power of the multiplier modulo
2**48
343 IT3
= IT3
+ I3*MM
( I
, 4 ) + I4*MM
( I
, 3 )
346 IT2
= IT2
+ I2*MM
( I
, 4 ) + I3*MM
( I
, 3 ) + I4*MM
( I
, 2 )
349 IT1
= IT1
+ I1*MM
( I
, 4 ) + I2*MM
( I
, 3 ) + I3*MM
( I
, 2 ) +
351 IT1
= MOD
( IT1
, IPW2
)
353 * Convert
48-bit
integer to a
real number in the interval
(0,1)
355 X
( I
) = R*
( DBLE
( IT1
)+R*
( DBLE
( IT2
)+R*
( DBLE
( IT3
)+R*
358 IF (X
( I
).EQ
.1.0D0
) THEN
359 * If a
real number has n bits of
precision, and the first
360 * n bits of the
48-bit
integer above happen
to be all
1 (which
361 * will occur about once every
2**n calls
), then X
( I
) will
362 * be rounded
to exactly
1.0.
363 * Since X
( I
) is not supposed
to return exactly
0.0 or
1.0,
364 * the statistically correct thing
to do in this situation is
365 * simply
to iterate again
.
366 * N
.B
. the case X
( I
) = 0.0 should not be possible
.
376 * Return final value of seed