/*************************************************************************/
/* Schrage technique                                                     */
/* x[n=1] = a(x[n] mod p) -q(x[n] div p) +m{(x[n] div p) - (ax[n] div m)}*/
/*************************************************************************/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define  MULTIPLIER 25      /* a  */
#define  MAXGEN     32767   /* m  */
#define  SEED       5       /* x0 */


main(void)  {
  int x, p, q, e, d, f;
  int i;
  div_t result;

  x=SEED;
  result=div(MAXGEN, MULTIPLIER);
  p=result.quot;                              /* p = m div a               */
  q=result.rem;                               /* q = m mod a               */
  clrscr();
  for(i=0; i < 50; i++)  {
    result=div(x, p);                         /* x is x[n]                 */
    d=result.quot;                            /* d = x div p               */
    e=result.rem;                             /* e = x mod p               */
    f=MULTIPLIER*e - q*d;                     /* f = a*e - q*d             */
    if(f>0)
      x=f;                                    /* x is x[n+1]               */
    else
      x=f+MAXGEN;                             /* x is x[n+1]               */
    printf(" %d\n",x);
  }
}
