Annotation of capa/capa51/pProj/com.c, revision 1.1

1.1     ! albertel    1: #include "ranlib.h"
        !             2: #include <stdio.h>
        !             3: #include <stdlib.h>
        !             4: void advnst(long k)
        !             5: /*
        !             6: **********************************************************************
        !             7:      void advnst(long k)
        !             8:                ADV-a-N-ce ST-ate
        !             9:      Advances the state  of  the current  generator  by 2^K values  and
        !            10:      resets the initial seed to that value.
        !            11:      This is  a  transcription from   Pascal to  Fortran    of  routine
        !            12:      Advance_State from the paper
        !            13:      L'Ecuyer, P. and  Cote, S. "Implementing  a  Random Number Package
        !            14:      with  Splitting   Facilities."  ACM  Transactions  on Mathematical
        !            15:      Software, 17:98-111 (1991)
        !            16:                               Arguments
        !            17:      k -> The generator is advanced by2^K values
        !            18: **********************************************************************
        !            19: */
        !            20: {
        !            21: #define numg 32L
        !            22: extern void gsrgs(long getset,long *qvalue);
        !            23: extern void gscgn(long getset,long *g);
        !            24: extern long Xm1,Xm2,Xa1,Xa2,Xcg1[],Xcg2[];
        !            25: static long g,i,ib1,ib2;
        !            26: static long qrgnin;
        !            27: /*
        !            28:      Abort unless random number generator initialized
        !            29: */
        !            30:     gsrgs(0L,&qrgnin);
        !            31:     if(qrgnin) goto S10;
        !            32:     puts(" ADVNST called before random generator initialized - ABORT");
        !            33:     exit(1);
        !            34: S10:
        !            35:     gscgn(0L,&g);
        !            36:     ib1 = Xa1;
        !            37:     ib2 = Xa2;
        !            38:     for(i=1; i<=k; i++) {
        !            39:         ib1 = mltmod(ib1,ib1,Xm1);
        !            40:         ib2 = mltmod(ib2,ib2,Xm2);
        !            41:     }
        !            42:     setsd(mltmod(ib1,*(Xcg1+g-1),Xm1),mltmod(ib2,*(Xcg2+g-1),Xm2));
        !            43: /*
        !            44:      NOW, IB1 = A1**K AND IB2 = A2**K
        !            45: */
        !            46: #undef numg
        !            47: }
        !            48: void getsd(long *iseed1,long *iseed2)
        !            49: /*
        !            50: **********************************************************************
        !            51:      void getsd(long *iseed1,long *iseed2)
        !            52:                GET SeeD
        !            53:      Returns the value of two integer seeds of the current generator
        !            54:      This  is   a  transcription from  Pascal   to  Fortran  of routine
        !            55:      Get_State from the paper
        !            56:      L'Ecuyer, P. and  Cote,  S. "Implementing a Random Number  Package
        !            57:      with   Splitting Facilities."  ACM  Transactions   on Mathematical
        !            58:      Software, 17:98-111 (1991)
        !            59:                               Arguments
        !            60:      iseed1 <- First integer seed of generator G
        !            61:      iseed2 <- Second integer seed of generator G
        !            62: **********************************************************************
        !            63: */
        !            64: {
        !            65: #define numg 32L
        !            66: extern void gsrgs(long getset,long *qvalue);
        !            67: extern void gscgn(long getset,long *g);
        !            68: extern long Xcg1[],Xcg2[];
        !            69: static long g;
        !            70: static long qrgnin;
        !            71: /*
        !            72:      Abort unless random number generator initialized
        !            73: */
        !            74:     gsrgs(0L,&qrgnin);
        !            75:     if(qrgnin) goto S10;
        !            76:     printf(
        !            77:       " GETSD called before random number generator  initialized -- abort!\n");
        !            78:     exit(0);
        !            79: S10:
        !            80:     gscgn(0L,&g);
        !            81:     *iseed1 = *(Xcg1+g-1);
        !            82:     *iseed2 = *(Xcg2+g-1);
        !            83: #undef numg
        !            84: }
        !            85: long ignlgi(void)
        !            86: /*
        !            87: **********************************************************************
        !            88:      long ignlgi(void)
        !            89:                GeNerate LarGe Integer
        !            90:      Returns a random integer following a uniform distribution over
        !            91:      (1, 2147483562) using the current generator.
        !            92:      This is a transcription from Pascal to Fortran of routine
        !            93:      Random from the paper
        !            94:      L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package
        !            95:      with Splitting Facilities." ACM Transactions on Mathematical
        !            96:      Software, 17:98-111 (1991)
        !            97: **********************************************************************
        !            98: */
        !            99: {
        !           100: #define numg 32L
        !           101: extern void gsrgs(long getset,long *qvalue);
        !           102: extern void gssst(long getset,long *qset);
        !           103: extern void gscgn(long getset,long *g);
        !           104: extern void inrgcm(void);
        !           105: extern long Xm1,Xm2,Xa1,Xa2,Xcg1[],Xcg2[];
        !           106: extern long Xqanti[];
        !           107: static long ignlgi,curntg,k,s1,s2,z;
        !           108: static long qqssd,qrgnin;
        !           109: /*
        !           110:      IF THE RANDOM NUMBER PACKAGE HAS NOT BEEN INITIALIZED YET, DO SO.
        !           111:      IT CAN BE INITIALIZED IN ONE OF TWO WAYS : 1) THE FIRST CALL TO
        !           112:      THIS ROUTINE  2) A CALL TO SETALL.
        !           113: */
        !           114:     gsrgs(0L,&qrgnin);
        !           115:     if(!qrgnin) inrgcm();
        !           116:     gssst(0,&qqssd);
        !           117:     if(!qqssd) setall(1234567890L,123456789L);
        !           118: /*
        !           119:      Get Current Generator
        !           120: */
        !           121:     gscgn(0L,&curntg);
        !           122:     s1 = *(Xcg1+curntg-1);
        !           123:     s2 = *(Xcg2+curntg-1);
        !           124:     k = s1/53668L;
        !           125:     s1 = Xa1*(s1-k*53668L)-k*12211;
        !           126:     if(s1 < 0) s1 += Xm1;
        !           127:     k = s2/52774L;
        !           128:     s2 = Xa2*(s2-k*52774L)-k*3791;
        !           129:     if(s2 < 0) s2 += Xm2;
        !           130:     *(Xcg1+curntg-1) = s1;
        !           131:     *(Xcg2+curntg-1) = s2;
        !           132:     z = s1-s2;
        !           133:     if(z < 1) z += (Xm1-1);
        !           134:     if(*(Xqanti+curntg-1)) z = Xm1-z;
        !           135:     ignlgi = z;
        !           136:     return ignlgi;
        !           137: #undef numg
        !           138: }
        !           139: void initgn(long isdtyp)
        !           140: /*
        !           141: **********************************************************************
        !           142:      void initgn(long isdtyp)
        !           143:           INIT-ialize current G-e-N-erator
        !           144:      Reinitializes the state of the current generator
        !           145:      This is a transcription from Pascal to Fortran of routine
        !           146:      Init_Generator from the paper
        !           147:      L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package
        !           148:      with Splitting Facilities." ACM Transactions on Mathematical
        !           149:      Software, 17:98-111 (1991)
        !           150:                               Arguments
        !           151:      isdtyp -> The state to which the generator is to be set
        !           152:           isdtyp = -1  => sets the seeds to their initial value
        !           153:           isdtyp =  0  => sets the seeds to the first value of
        !           154:                           the current block
        !           155:           isdtyp =  1  => sets the seeds to the first value of
        !           156:                           the next block
        !           157: **********************************************************************
        !           158: */
        !           159: {
        !           160: #define numg 32L
        !           161: extern void gsrgs(long getset,long *qvalue);
        !           162: extern void gscgn(long getset,long *g);
        !           163: extern long Xm1,Xm2,Xa1w,Xa2w,Xig1[],Xig2[],Xlg1[],Xlg2[],Xcg1[],Xcg2[];
        !           164: static long g;
        !           165: static long qrgnin;
        !           166: /*
        !           167:      Abort unless random number generator initialized
        !           168: */
        !           169:     gsrgs(0L,&qrgnin);
        !           170:     if(qrgnin) goto S10;
        !           171:     printf(
        !           172:       " INITGN called before random number generator  initialized -- abort!\n");
        !           173:     exit(1);
        !           174: S10:
        !           175:     gscgn(0L,&g);
        !           176:     if(-1 != isdtyp) goto S20;
        !           177:     *(Xlg1+g-1) = *(Xig1+g-1);
        !           178:     *(Xlg2+g-1) = *(Xig2+g-1);
        !           179:     goto S50;
        !           180: S20:
        !           181:     if(0 != isdtyp) goto S30;
        !           182:     goto S50;
        !           183: S30:
        !           184: /*
        !           185:      do nothing
        !           186: */
        !           187:     if(1 != isdtyp) goto S40;
        !           188:     *(Xlg1+g-1) = mltmod(Xa1w,*(Xlg1+g-1),Xm1);
        !           189:     *(Xlg2+g-1) = mltmod(Xa2w,*(Xlg2+g-1),Xm2);
        !           190:     goto S50;
        !           191: S40:
        !           192:     printf("isdtyp not in range in INITGN");
        !           193:     exit(1);
        !           194: S50:
        !           195:     *(Xcg1+g-1) = *(Xlg1+g-1);
        !           196:     *(Xcg2+g-1) = *(Xlg2+g-1);
        !           197: #undef numg
        !           198: }
        !           199: void inrgcm(void)
        !           200: /*
        !           201: **********************************************************************
        !           202:      void inrgcm(void)
        !           203:           INitialize Random number Generator CoMmon
        !           204:                               Function
        !           205:      Initializes common area  for random number  generator.  This saves
        !           206:      the  nuisance  of  a  BLOCK DATA  routine  and the  difficulty  of
        !           207:      assuring that the routine is loaded with the other routines.
        !           208: **********************************************************************
        !           209: */
        !           210: {
        !           211: #define numg 32L
        !           212: extern void gsrgs(long getset,long *qvalue);
        !           213: extern long Xm1,Xm2,Xa1,Xa2,Xa1w,Xa2w,Xa1vw,Xa2vw;
        !           214: extern long Xqanti[];
        !           215: static long T1;
        !           216: static long i;
        !           217: /*
        !           218:      V=20;                            W=30;
        !           219:      A1W = MOD(A1**(2**W),M1)         A2W = MOD(A2**(2**W),M2)
        !           220:      A1VW = MOD(A1**(2**(V+W)),M1)    A2VW = MOD(A2**(2**(V+W)),M2)
        !           221:    If V or W is changed A1W, A2W, A1VW, and A2VW need to be recomputed.
        !           222:     An efficient way to precompute a**(2*j) MOD m is to start with
        !           223:     a and square it j times modulo m using the function MLTMOD.
        !           224: */
        !           225:     Xm1 = 2147483563L;
        !           226:     Xm2 = 2147483399L;
        !           227:     Xa1 = 40014L;
        !           228:     Xa2 = 40692L;
        !           229:     Xa1w = 1033780774L;
        !           230:     Xa2w = 1494757890L;
        !           231:     Xa1vw = 2082007225L;
        !           232:     Xa2vw = 784306273L;
        !           233:     for(i=0; i<numg; i++) *(Xqanti+i) = 0;
        !           234:     T1 = 1;
        !           235: /*
        !           236:      Tell the world that common has been initialized
        !           237: */
        !           238:     gsrgs(1L,&T1);
        !           239: #undef numg
        !           240: }
        !           241: void setall(long iseed1,long iseed2)
        !           242: /*
        !           243: **********************************************************************
        !           244:      void setall(long iseed1,long iseed2)
        !           245:                SET ALL random number generators
        !           246:      Sets the initial seed of generator 1 to ISEED1 and ISEED2. The
        !           247:      initial seeds of the other generators are set accordingly, and
        !           248:      all generators states are set to these seeds.
        !           249:      This is a transcription from Pascal to Fortran of routine
        !           250:      Set_Initial_Seed from the paper
        !           251:      L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package
        !           252:      with Splitting Facilities." ACM Transactions on Mathematical
        !           253:      Software, 17:98-111 (1991)
        !           254:                               Arguments
        !           255:      iseed1 -> First of two integer seeds
        !           256:      iseed2 -> Second of two integer seeds
        !           257: **********************************************************************
        !           258: */
        !           259: {
        !           260: #define numg 32L
        !           261: extern void gsrgs(long getset,long *qvalue);
        !           262: extern void gssst(long getset,long *qset);
        !           263: extern void gscgn(long getset,long *g);
        !           264: extern long Xm1,Xm2,Xa1vw,Xa2vw,Xig1[],Xig2[];
        !           265: static long T1;
        !           266: static long g,ocgn;
        !           267: static long qrgnin;
        !           268:     T1 = 1;
        !           269: /*
        !           270:      TELL IGNLGI, THE ACTUAL NUMBER GENERATOR, THAT THIS ROUTINE
        !           271:       HAS BEEN CALLED.
        !           272: */
        !           273:     gssst(1,&T1);
        !           274:     gscgn(0L,&ocgn);
        !           275: /*
        !           276:      Initialize Common Block if Necessary
        !           277: */
        !           278:     gsrgs(0L,&qrgnin);
        !           279:     if(!qrgnin) inrgcm();
        !           280:     *Xig1 = iseed1;
        !           281:     *Xig2 = iseed2;
        !           282:     initgn(-1L);
        !           283:     for(g=2; g<=numg; g++) {
        !           284:         *(Xig1+g-1) = mltmod(Xa1vw,*(Xig1+g-2),Xm1);
        !           285:         *(Xig2+g-1) = mltmod(Xa2vw,*(Xig2+g-2),Xm2);
        !           286:         gscgn(1L,&g);
        !           287:         initgn(-1L);
        !           288:     }
        !           289:     gscgn(1L,&ocgn);
        !           290: #undef numg
        !           291: }
        !           292: void setant(long qvalue)
        !           293: /*
        !           294: **********************************************************************
        !           295:      void setant(long qvalue)
        !           296:                SET ANTithetic
        !           297:      Sets whether the current generator produces antithetic values.  If
        !           298:      X   is  the value  normally returned  from  a uniform [0,1] random
        !           299:      number generator then 1  - X is the antithetic  value. If X is the
        !           300:      value  normally  returned  from a   uniform  [0,N]  random  number
        !           301:      generator then N - 1 - X is the antithetic value.
        !           302:      All generators are initialized to NOT generate antithetic values.
        !           303:      This is a transcription from Pascal to Fortran of routine
        !           304:      Set_Antithetic from the paper
        !           305:      L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package
        !           306:      with Splitting Facilities." ACM Transactions on Mathematical
        !           307:      Software, 17:98-111 (1991)
        !           308:                               Arguments
        !           309:      qvalue -> nonzero if generator G is to generating antithetic
        !           310:                     values, otherwise zero
        !           311: **********************************************************************
        !           312: */
        !           313: {
        !           314: #define numg 32L
        !           315: extern void gsrgs(long getset,long *qvalue);
        !           316: extern void gscgn(long getset,long *g);
        !           317: extern long Xqanti[];
        !           318: static long g;
        !           319: static long qrgnin;
        !           320: /*
        !           321:      Abort unless random number generator initialized
        !           322: */
        !           323:     gsrgs(0L,&qrgnin);
        !           324:     if(qrgnin) goto S10;
        !           325:     printf(
        !           326:       " SETANT called before random number generator  initialized -- abort!\n");
        !           327:     exit(1);
        !           328: S10:
        !           329:     gscgn(0L,&g);
        !           330:     Xqanti[g-1] = qvalue;
        !           331: #undef numg
        !           332: }
        !           333: void setsd(long iseed1,long iseed2)
        !           334: /*
        !           335: **********************************************************************
        !           336:      void setsd(long iseed1,long iseed2)
        !           337:                SET S-ee-D of current generator
        !           338:      Resets the initial  seed of  the current  generator to  ISEED1 and
        !           339:      ISEED2. The seeds of the other generators remain unchanged.
        !           340:      This is a transcription from Pascal to Fortran of routine
        !           341:      Set_Seed from the paper
        !           342:      L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package
        !           343:      with Splitting Facilities." ACM Transactions on Mathematical
        !           344:      Software, 17:98-111 (1991)
        !           345:                               Arguments
        !           346:      iseed1 -> First integer seed
        !           347:      iseed2 -> Second integer seed
        !           348: **********************************************************************
        !           349: */
        !           350: {
        !           351: #define numg 32L
        !           352: extern void gsrgs(long getset,long *qvalue);
        !           353: extern void gscgn(long getset,long *g);
        !           354: extern long Xig1[],Xig2[];
        !           355: static long g;
        !           356: static long qrgnin;
        !           357: /*
        !           358:      Abort unless random number generator initialized
        !           359: */
        !           360:     gsrgs(0L,&qrgnin);
        !           361:     if(qrgnin) goto S10;
        !           362:     printf(
        !           363:       " SETSD called before random number generator  initialized -- abort!\n");
        !           364:     exit(1);
        !           365: S10:
        !           366:     gscgn(0L,&g);
        !           367:     *(Xig1+g-1) = iseed1;
        !           368:     *(Xig2+g-1) = iseed2;
        !           369:     initgn(-1L);
        !           370: #undef numg
        !           371: }
        !           372: long Xm1,Xm2,Xa1,Xa2,Xcg1[32],Xcg2[32],Xa1w,Xa2w,Xig1[32],Xig2[32],Xlg1[32],
        !           373:     Xlg2[32],Xa1vw,Xa2vw;
        !           374: long Xqanti[32];

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>