code: import java.util.function.IntSupplier;
  import static java.util.stream.IntStream.generate;
  
  public class SubtractiveGenerator implements IntSupplier {
      static final int MOD = 1_000_000_000;
      private int[] state = new int[55];
      private int si, sj;
  
      public SubtractiveGenerator(int p1) {
          subrandSeed(p1);
      }
  
      void subrandSeed(int p1) {
          int p2 = 1;
  
          state[0] = p1 % MOD;
          for (int i = 1, j = 21; i < 55; i++, j += 21) {
              if (j >= 55)
                  j -= 55;
              state[j] = p2;
              if ((p2 = p1 - p2) < 0)
                  p2 += MOD;
              p1 = state[j];
          }
  
          si = 0;
          sj = 24;
          for (int i = 0; i < 165; i++)
              getAsInt();
      }
  
      @Override
      public int getAsInt() {
          if (si == sj)
              subrandSeed(0);
  
          if (si-- == 0)
              si = 54;
          if (sj-- == 0)
              sj = 54;
  
          int x = state[si] - state[sj];
          if (x < 0)
              x += MOD;
  
          return state[si] = x;
      }
  
      public static void main(String[] args) {
          generate(new SubtractiveGenerator(292_929)).limit(10)
                  .forEach(System.out::println);
      }
  }
  