Annotation of rpl/lapack/lapack/dlaruv.f, revision 1.1

1.1     ! bertrand    1:       SUBROUTINE DLARUV( ISEED, N, X )
        !             2: *
        !             3: *  -- LAPACK auxiliary routine (version 3.2) --
        !             4: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             5: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             6: *     November 2006
        !             7: *
        !             8: *     .. Scalar Arguments ..
        !             9:       INTEGER            N
        !            10: *     ..
        !            11: *     .. Array Arguments ..
        !            12:       INTEGER            ISEED( 4 )
        !            13:       DOUBLE PRECISION   X( N )
        !            14: *     ..
        !            15: *
        !            16: *  Purpose
        !            17: *  =======
        !            18: *
        !            19: *  DLARUV returns a vector of n random real numbers from a uniform (0,1)
        !            20: *  distribution (n <= 128).
        !            21: *
        !            22: *  This is an auxiliary routine called by DLARNV and ZLARNV.
        !            23: *
        !            24: *  Arguments
        !            25: *  =========
        !            26: *
        !            27: *  ISEED   (input/output) INTEGER array, dimension (4)
        !            28: *          On entry, the seed of the random number generator; the array
        !            29: *          elements must be between 0 and 4095, and ISEED(4) must be
        !            30: *          odd.
        !            31: *          On exit, the seed is updated.
        !            32: *
        !            33: *  N       (input) INTEGER
        !            34: *          The number of random numbers to be generated. N <= 128.
        !            35: *
        !            36: *  X       (output) DOUBLE PRECISION array, dimension (N)
        !            37: *          The generated random numbers.
        !            38: *
        !            39: *  Further Details
        !            40: *  ===============
        !            41: *
        !            42: *  This routine uses a multiplicative congruential method with modulus
        !            43: *  2**48 and multiplier 33952834046453 (see G.S.Fishman,
        !            44: *  'Multiplicative congruential random number generators with modulus
        !            45: *  2**b: an exhaustive analysis for b = 32 and a partial analysis for
        !            46: *  b = 48', Math. Comp. 189, pp 331-344, 1990).
        !            47: *
        !            48: *  48-bit integers are stored in 4 integer array elements with 12 bits
        !            49: *  per element. Hence the routine is portable across machines with
        !            50: *  integers of 32 bits or more.
        !            51: *
        !            52: *  =====================================================================
        !            53: *
        !            54: *     .. Parameters ..
        !            55:       DOUBLE PRECISION   ONE
        !            56:       PARAMETER          ( ONE = 1.0D0 )
        !            57:       INTEGER            LV, IPW2
        !            58:       DOUBLE PRECISION   R
        !            59:       PARAMETER          ( LV = 128, IPW2 = 4096, R = ONE / IPW2 )
        !            60: *     ..
        !            61: *     .. Local Scalars ..
        !            62:       INTEGER            I, I1, I2, I3, I4, IT1, IT2, IT3, IT4, J
        !            63: *     ..
        !            64: *     .. Local Arrays ..
        !            65:       INTEGER            MM( LV, 4 )
        !            66: *     ..
        !            67: *     .. Intrinsic Functions ..
        !            68:       INTRINSIC          DBLE, MIN, MOD
        !            69: *     ..
        !            70: *     .. Data statements ..
        !            71:       DATA               ( MM( 1, J ), J = 1, 4 ) / 494, 322, 2508,
        !            72:      $                   2549 /
        !            73:       DATA               ( MM( 2, J ), J = 1, 4 ) / 2637, 789, 3754,
        !            74:      $                   1145 /
        !            75:       DATA               ( MM( 3, J ), J = 1, 4 ) / 255, 1440, 1766,
        !            76:      $                   2253 /
        !            77:       DATA               ( MM( 4, J ), J = 1, 4 ) / 2008, 752, 3572,
        !            78:      $                   305 /
        !            79:       DATA               ( MM( 5, J ), J = 1, 4 ) / 1253, 2859, 2893,
        !            80:      $                   3301 /
        !            81:       DATA               ( MM( 6, J ), J = 1, 4 ) / 3344, 123, 307,
        !            82:      $                   1065 /
        !            83:       DATA               ( MM( 7, J ), J = 1, 4 ) / 4084, 1848, 1297,
        !            84:      $                   3133 /
        !            85:       DATA               ( MM( 8, J ), J = 1, 4 ) / 1739, 643, 3966,
        !            86:      $                   2913 /
        !            87:       DATA               ( MM( 9, J ), J = 1, 4 ) / 3143, 2405, 758,
        !            88:      $                   3285 /
        !            89:       DATA               ( MM( 10, J ), J = 1, 4 ) / 3468, 2638, 2598,
        !            90:      $                   1241 /
        !            91:       DATA               ( MM( 11, J ), J = 1, 4 ) / 688, 2344, 3406,
        !            92:      $                   1197 /
        !            93:       DATA               ( MM( 12, J ), J = 1, 4 ) / 1657, 46, 2922,
        !            94:      $                   3729 /
        !            95:       DATA               ( MM( 13, J ), J = 1, 4 ) / 1238, 3814, 1038,
        !            96:      $                   2501 /
        !            97:       DATA               ( MM( 14, J ), J = 1, 4 ) / 3166, 913, 2934,
        !            98:      $                   1673 /
        !            99:       DATA               ( MM( 15, J ), J = 1, 4 ) / 1292, 3649, 2091,
        !           100:      $                   541 /
        !           101:       DATA               ( MM( 16, J ), J = 1, 4 ) / 3422, 339, 2451,
        !           102:      $                   2753 /
        !           103:       DATA               ( MM( 17, J ), J = 1, 4 ) / 1270, 3808, 1580,
        !           104:      $                   949 /
        !           105:       DATA               ( MM( 18, J ), J = 1, 4 ) / 2016, 822, 1958,
        !           106:      $                   2361 /
        !           107:       DATA               ( MM( 19, J ), J = 1, 4 ) / 154, 2832, 2055,
        !           108:      $                   1165 /
        !           109:       DATA               ( MM( 20, J ), J = 1, 4 ) / 2862, 3078, 1507,
        !           110:      $                   4081 /
        !           111:       DATA               ( MM( 21, J ), J = 1, 4 ) / 697, 3633, 1078,
        !           112:      $                   2725 /
        !           113:       DATA               ( MM( 22, J ), J = 1, 4 ) / 1706, 2970, 3273,
        !           114:      $                   3305 /
        !           115:       DATA               ( MM( 23, J ), J = 1, 4 ) / 491, 637, 17,
        !           116:      $                   3069 /
        !           117:       DATA               ( MM( 24, J ), J = 1, 4 ) / 931, 2249, 854,
        !           118:      $                   3617 /
        !           119:       DATA               ( MM( 25, J ), J = 1, 4 ) / 1444, 2081, 2916,
        !           120:      $                   3733 /
        !           121:       DATA               ( MM( 26, J ), J = 1, 4 ) / 444, 4019, 3971,
        !           122:      $                   409 /
        !           123:       DATA               ( MM( 27, J ), J = 1, 4 ) / 3577, 1478, 2889,
        !           124:      $                   2157 /
        !           125:       DATA               ( MM( 28, J ), J = 1, 4 ) / 3944, 242, 3831,
        !           126:      $                   1361 /
        !           127:       DATA               ( MM( 29, J ), J = 1, 4 ) / 2184, 481, 2621,
        !           128:      $                   3973 /
        !           129:       DATA               ( MM( 30, J ), J = 1, 4 ) / 1661, 2075, 1541,
        !           130:      $                   1865 /
        !           131:       DATA               ( MM( 31, J ), J = 1, 4 ) / 3482, 4058, 893,
        !           132:      $                   2525 /
        !           133:       DATA               ( MM( 32, J ), J = 1, 4 ) / 657, 622, 736,
        !           134:      $                   1409 /
        !           135:       DATA               ( MM( 33, J ), J = 1, 4 ) / 3023, 3376, 3992,
        !           136:      $                   3445 /
        !           137:       DATA               ( MM( 34, J ), J = 1, 4 ) / 3618, 812, 787,
        !           138:      $                   3577 /
        !           139:       DATA               ( MM( 35, J ), J = 1, 4 ) / 1267, 234, 2125,
        !           140:      $                   77 /
        !           141:       DATA               ( MM( 36, J ), J = 1, 4 ) / 1828, 641, 2364,
        !           142:      $                   3761 /
        !           143:       DATA               ( MM( 37, J ), J = 1, 4 ) / 164, 4005, 2460,
        !           144:      $                   2149 /
        !           145:       DATA               ( MM( 38, J ), J = 1, 4 ) / 3798, 1122, 257,
        !           146:      $                   1449 /
        !           147:       DATA               ( MM( 39, J ), J = 1, 4 ) / 3087, 3135, 1574,
        !           148:      $                   3005 /
        !           149:       DATA               ( MM( 40, J ), J = 1, 4 ) / 2400, 2640, 3912,
        !           150:      $                   225 /
        !           151:       DATA               ( MM( 41, J ), J = 1, 4 ) / 2870, 2302, 1216,
        !           152:      $                   85 /
        !           153:       DATA               ( MM( 42, J ), J = 1, 4 ) / 3876, 40, 3248,
        !           154:      $                   3673 /
        !           155:       DATA               ( MM( 43, J ), J = 1, 4 ) / 1905, 1832, 3401,
        !           156:      $                   3117 /
        !           157:       DATA               ( MM( 44, J ), J = 1, 4 ) / 1593, 2247, 2124,
        !           158:      $                   3089 /
        !           159:       DATA               ( MM( 45, J ), J = 1, 4 ) / 1797, 2034, 2762,
        !           160:      $                   1349 /
        !           161:       DATA               ( MM( 46, J ), J = 1, 4 ) / 1234, 2637, 149,
        !           162:      $                   2057 /
        !           163:       DATA               ( MM( 47, J ), J = 1, 4 ) / 3460, 1287, 2245,
        !           164:      $                   413 /
        !           165:       DATA               ( MM( 48, J ), J = 1, 4 ) / 328, 1691, 166,
        !           166:      $                   65 /
        !           167:       DATA               ( MM( 49, J ), J = 1, 4 ) / 2861, 496, 466,
        !           168:      $                   1845 /
        !           169:       DATA               ( MM( 50, J ), J = 1, 4 ) / 1950, 1597, 4018,
        !           170:      $                   697 /
        !           171:       DATA               ( MM( 51, J ), J = 1, 4 ) / 617, 2394, 1399,
        !           172:      $                   3085 /
        !           173:       DATA               ( MM( 52, J ), J = 1, 4 ) / 2070, 2584, 190,
        !           174:      $                   3441 /
        !           175:       DATA               ( MM( 53, J ), J = 1, 4 ) / 3331, 1843, 2879,
        !           176:      $                   1573 /
        !           177:       DATA               ( MM( 54, J ), J = 1, 4 ) / 769, 336, 153,
        !           178:      $                   3689 /
        !           179:       DATA               ( MM( 55, J ), J = 1, 4 ) / 1558, 1472, 2320,
        !           180:      $                   2941 /
        !           181:       DATA               ( MM( 56, J ), J = 1, 4 ) / 2412, 2407, 18,
        !           182:      $                   929 /
        !           183:       DATA               ( MM( 57, J ), J = 1, 4 ) / 2800, 433, 712,
        !           184:      $                   533 /
        !           185:       DATA               ( MM( 58, J ), J = 1, 4 ) / 189, 2096, 2159,
        !           186:      $                   2841 /
        !           187:       DATA               ( MM( 59, J ), J = 1, 4 ) / 287, 1761, 2318,
        !           188:      $                   4077 /
        !           189:       DATA               ( MM( 60, J ), J = 1, 4 ) / 2045, 2810, 2091,
        !           190:      $                   721 /
        !           191:       DATA               ( MM( 61, J ), J = 1, 4 ) / 1227, 566, 3443,
        !           192:      $                   2821 /
        !           193:       DATA               ( MM( 62, J ), J = 1, 4 ) / 2838, 442, 1510,
        !           194:      $                   2249 /
        !           195:       DATA               ( MM( 63, J ), J = 1, 4 ) / 209, 41, 449,
        !           196:      $                   2397 /
        !           197:       DATA               ( MM( 64, J ), J = 1, 4 ) / 2770, 1238, 1956,
        !           198:      $                   2817 /
        !           199:       DATA               ( MM( 65, J ), J = 1, 4 ) / 3654, 1086, 2201,
        !           200:      $                   245 /
        !           201:       DATA               ( MM( 66, J ), J = 1, 4 ) / 3993, 603, 3137,
        !           202:      $                   1913 /
        !           203:       DATA               ( MM( 67, J ), J = 1, 4 ) / 192, 840, 3399,
        !           204:      $                   1997 /
        !           205:       DATA               ( MM( 68, J ), J = 1, 4 ) / 2253, 3168, 1321,
        !           206:      $                   3121 /
        !           207:       DATA               ( MM( 69, J ), J = 1, 4 ) / 3491, 1499, 2271,
        !           208:      $                   997 /
        !           209:       DATA               ( MM( 70, J ), J = 1, 4 ) / 2889, 1084, 3667,
        !           210:      $                   1833 /
        !           211:       DATA               ( MM( 71, J ), J = 1, 4 ) / 2857, 3438, 2703,
        !           212:      $                   2877 /
        !           213:       DATA               ( MM( 72, J ), J = 1, 4 ) / 2094, 2408, 629,
        !           214:      $                   1633 /
        !           215:       DATA               ( MM( 73, J ), J = 1, 4 ) / 1818, 1589, 2365,
        !           216:      $                   981 /
        !           217:       DATA               ( MM( 74, J ), J = 1, 4 ) / 688, 2391, 2431,
        !           218:      $                   2009 /
        !           219:       DATA               ( MM( 75, J ), J = 1, 4 ) / 1407, 288, 1113,
        !           220:      $                   941 /
        !           221:       DATA               ( MM( 76, J ), J = 1, 4 ) / 634, 26, 3922,
        !           222:      $                   2449 /
        !           223:       DATA               ( MM( 77, J ), J = 1, 4 ) / 3231, 512, 2554,
        !           224:      $                   197 /
        !           225:       DATA               ( MM( 78, J ), J = 1, 4 ) / 815, 1456, 184,
        !           226:      $                   2441 /
        !           227:       DATA               ( MM( 79, J ), J = 1, 4 ) / 3524, 171, 2099,
        !           228:      $                   285 /
        !           229:       DATA               ( MM( 80, J ), J = 1, 4 ) / 1914, 1677, 3228,
        !           230:      $                   1473 /
        !           231:       DATA               ( MM( 81, J ), J = 1, 4 ) / 516, 2657, 4012,
        !           232:      $                   2741 /
        !           233:       DATA               ( MM( 82, J ), J = 1, 4 ) / 164, 2270, 1921,
        !           234:      $                   3129 /
        !           235:       DATA               ( MM( 83, J ), J = 1, 4 ) / 303, 2587, 3452,
        !           236:      $                   909 /
        !           237:       DATA               ( MM( 84, J ), J = 1, 4 ) / 2144, 2961, 3901,
        !           238:      $                   2801 /
        !           239:       DATA               ( MM( 85, J ), J = 1, 4 ) / 3480, 1970, 572,
        !           240:      $                   421 /
        !           241:       DATA               ( MM( 86, J ), J = 1, 4 ) / 119, 1817, 3309,
        !           242:      $                   4073 /
        !           243:       DATA               ( MM( 87, J ), J = 1, 4 ) / 3357, 676, 3171,
        !           244:      $                   2813 /
        !           245:       DATA               ( MM( 88, J ), J = 1, 4 ) / 837, 1410, 817,
        !           246:      $                   2337 /
        !           247:       DATA               ( MM( 89, J ), J = 1, 4 ) / 2826, 3723, 3039,
        !           248:      $                   1429 /
        !           249:       DATA               ( MM( 90, J ), J = 1, 4 ) / 2332, 2803, 1696,
        !           250:      $                   1177 /
        !           251:       DATA               ( MM( 91, J ), J = 1, 4 ) / 2089, 3185, 1256,
        !           252:      $                   1901 /
        !           253:       DATA               ( MM( 92, J ), J = 1, 4 ) / 3780, 184, 3715,
        !           254:      $                   81 /
        !           255:       DATA               ( MM( 93, J ), J = 1, 4 ) / 1700, 663, 2077,
        !           256:      $                   1669 /
        !           257:       DATA               ( MM( 94, J ), J = 1, 4 ) / 3712, 499, 3019,
        !           258:      $                   2633 /
        !           259:       DATA               ( MM( 95, J ), J = 1, 4 ) / 150, 3784, 1497,
        !           260:      $                   2269 /
        !           261:       DATA               ( MM( 96, J ), J = 1, 4 ) / 2000, 1631, 1101,
        !           262:      $                   129 /
        !           263:       DATA               ( MM( 97, J ), J = 1, 4 ) / 3375, 1925, 717,
        !           264:      $                   1141 /
        !           265:       DATA               ( MM( 98, J ), J = 1, 4 ) / 1621, 3912, 51,
        !           266:      $                   249 /
        !           267:       DATA               ( MM( 99, J ), J = 1, 4 ) / 3090, 1398, 981,
        !           268:      $                   3917 /
        !           269:       DATA               ( MM( 100, J ), J = 1, 4 ) / 3765, 1349, 1978,
        !           270:      $                   2481 /
        !           271:       DATA               ( MM( 101, J ), J = 1, 4 ) / 1149, 1441, 1813,
        !           272:      $                   3941 /
        !           273:       DATA               ( MM( 102, J ), J = 1, 4 ) / 3146, 2224, 3881,
        !           274:      $                   2217 /
        !           275:       DATA               ( MM( 103, J ), J = 1, 4 ) / 33, 2411, 76,
        !           276:      $                   2749 /
        !           277:       DATA               ( MM( 104, J ), J = 1, 4 ) / 3082, 1907, 3846,
        !           278:      $                   3041 /
        !           279:       DATA               ( MM( 105, J ), J = 1, 4 ) / 2741, 3192, 3694,
        !           280:      $                   1877 /
        !           281:       DATA               ( MM( 106, J ), J = 1, 4 ) / 359, 2786, 1682,
        !           282:      $                   345 /
        !           283:       DATA               ( MM( 107, J ), J = 1, 4 ) / 3316, 382, 124,
        !           284:      $                   2861 /
        !           285:       DATA               ( MM( 108, J ), J = 1, 4 ) / 1749, 37, 1660,
        !           286:      $                   1809 /
        !           287:       DATA               ( MM( 109, J ), J = 1, 4 ) / 185, 759, 3997,
        !           288:      $                   3141 /
        !           289:       DATA               ( MM( 110, J ), J = 1, 4 ) / 2784, 2948, 479,
        !           290:      $                   2825 /
        !           291:       DATA               ( MM( 111, J ), J = 1, 4 ) / 2202, 1862, 1141,
        !           292:      $                   157 /
        !           293:       DATA               ( MM( 112, J ), J = 1, 4 ) / 2199, 3802, 886,
        !           294:      $                   2881 /
        !           295:       DATA               ( MM( 113, J ), J = 1, 4 ) / 1364, 2423, 3514,
        !           296:      $                   3637 /
        !           297:       DATA               ( MM( 114, J ), J = 1, 4 ) / 1244, 2051, 1301,
        !           298:      $                   1465 /
        !           299:       DATA               ( MM( 115, J ), J = 1, 4 ) / 2020, 2295, 3604,
        !           300:      $                   2829 /
        !           301:       DATA               ( MM( 116, J ), J = 1, 4 ) / 3160, 1332, 1888,
        !           302:      $                   2161 /
        !           303:       DATA               ( MM( 117, J ), J = 1, 4 ) / 2785, 1832, 1836,
        !           304:      $                   3365 /
        !           305:       DATA               ( MM( 118, J ), J = 1, 4 ) / 2772, 2405, 1990,
        !           306:      $                   361 /
        !           307:       DATA               ( MM( 119, J ), J = 1, 4 ) / 1217, 3638, 2058,
        !           308:      $                   2685 /
        !           309:       DATA               ( MM( 120, J ), J = 1, 4 ) / 1822, 3661, 692,
        !           310:      $                   3745 /
        !           311:       DATA               ( MM( 121, J ), J = 1, 4 ) / 1245, 327, 1194,
        !           312:      $                   2325 /
        !           313:       DATA               ( MM( 122, J ), J = 1, 4 ) / 2252, 3660, 20,
        !           314:      $                   3609 /
        !           315:       DATA               ( MM( 123, J ), J = 1, 4 ) / 3904, 716, 3285,
        !           316:      $                   3821 /
        !           317:       DATA               ( MM( 124, J ), J = 1, 4 ) / 2774, 1842, 2046,
        !           318:      $                   3537 /
        !           319:       DATA               ( MM( 125, J ), J = 1, 4 ) / 997, 3987, 2107,
        !           320:      $                   517 /
        !           321:       DATA               ( MM( 126, J ), J = 1, 4 ) / 2573, 1368, 3508,
        !           322:      $                   3017 /
        !           323:       DATA               ( MM( 127, J ), J = 1, 4 ) / 1148, 1848, 3525,
        !           324:      $                   2141 /
        !           325:       DATA               ( MM( 128, J ), J = 1, 4 ) / 545, 2366, 3801,
        !           326:      $                   1537 /
        !           327: *     ..
        !           328: *     .. Executable Statements ..
        !           329: *
        !           330:       I1 = ISEED( 1 )
        !           331:       I2 = ISEED( 2 )
        !           332:       I3 = ISEED( 3 )
        !           333:       I4 = ISEED( 4 )
        !           334: *
        !           335:       DO 10 I = 1, MIN( N, LV )
        !           336: *    
        !           337:   20     CONTINUE
        !           338: *
        !           339: *        Multiply the seed by i-th power of the multiplier modulo 2**48
        !           340: *
        !           341:          IT4 = I4*MM( I, 4 )
        !           342:          IT3 = IT4 / IPW2
        !           343:          IT4 = IT4 - IPW2*IT3
        !           344:          IT3 = IT3 + I3*MM( I, 4 ) + I4*MM( I, 3 )
        !           345:          IT2 = IT3 / IPW2
        !           346:          IT3 = IT3 - IPW2*IT2
        !           347:          IT2 = IT2 + I2*MM( I, 4 ) + I3*MM( I, 3 ) + I4*MM( I, 2 )
        !           348:          IT1 = IT2 / IPW2
        !           349:          IT2 = IT2 - IPW2*IT1
        !           350:          IT1 = IT1 + I1*MM( I, 4 ) + I2*MM( I, 3 ) + I3*MM( I, 2 ) +
        !           351:      $         I4*MM( I, 1 )
        !           352:          IT1 = MOD( IT1, IPW2 )
        !           353: *
        !           354: *        Convert 48-bit integer to a real number in the interval (0,1)
        !           355: *
        !           356:          X( I ) = R*( DBLE( IT1 )+R*( DBLE( IT2 )+R*( DBLE( IT3 )+R*
        !           357:      $            DBLE( IT4 ) ) ) )
        !           358: *
        !           359:          IF (X( I ).EQ.1.0D0) THEN
        !           360: *           If a real number has n bits of precision, and the first
        !           361: *           n bits of the 48-bit integer above happen to be all 1 (which
        !           362: *           will occur about once every 2**n calls), then X( I ) will
        !           363: *           be rounded to exactly 1.0. 
        !           364: *           Since X( I ) is not supposed to return exactly 0.0 or 1.0,
        !           365: *           the statistically correct thing to do in this situation is
        !           366: *           simply to iterate again.
        !           367: *           N.B. the case X( I ) = 0.0 should not be possible. 
        !           368:             I1 = I1 + 2
        !           369:             I2 = I2 + 2
        !           370:             I3 = I3 + 2
        !           371:             I4 = I4 + 2
        !           372:             GOTO 20
        !           373:          END IF
        !           374: *
        !           375:    10 CONTINUE
        !           376: *
        !           377: *     Return final value of seed
        !           378: *
        !           379:       ISEED( 1 ) = IT1
        !           380:       ISEED( 2 ) = IT2
        !           381:       ISEED( 3 ) = IT3
        !           382:       ISEED( 4 ) = IT4
        !           383:       RETURN
        !           384: *
        !           385: *     End of DLARUV
        !           386: *
        !           387:       END

CVSweb interface <joel.bertrand@systella.fr>