/*-------------------------------------------------------------------------- */
/*                     Fibonacci Generator                                  */
/*-------------------------------------------------------------------------- */
#ifdef  __STDC__
int  FiboGenerator(
    int              lagP,
    int              lagQ,
    int              seed,
    int              max_sweeps,
    float            *x)
#else
int  FiboGenerator(lagP,lagQ,seed,max_sweeps,x)
    int              lagP;
    int              lagQ;
    int              seed;
    int              max_sweeps;
    float            *x;
#endif
{
    int  i;
    int  p,q;
    float  modulus = 2147483647.0;
    float  factor  = 16807;
    float  r;
    float  *mf;

    p = 0;
    q = lagQ-1;

    mf = (float *) calloc(lagP, sizeof(double));
    r = modulus * seed;
    for(i=0; i< lagP; i++) {
      r=fmod(r*factor,modulus);
      mf[i] = r/modulus;
    }

    for(i=0; i< max_sweeps; i++) {
      mf[p] = mf[p] + mf[q];
      if ( mf[p] > 1 ) mf[p] -= 1;
      x[i] = mf[p];
      if ( ++p == lagP-1 )  p = 0;
      if ( ++q == lagP-1 )  q = 0;
    }
    return 0;
}
