Jump to content

Test 2

Featured Replies

#include <math.h>
#include <stdio.h>

typedef unsigned __int64 uint64;

#define TRUE 1
#define FALSE 0

#define INC 3
#define NEW 7
#define SEQUEL 9

class rnd64
{
   public:

   rnd64(void);
   ~rnd64(void);
   uint64 rnd(void);

   private:

   int prime_number(int);
   uint64 next(void);

   int status;
   uint64 dx;
   uint64 dy;
   uint64 end;
   uint64 x, y;
   uint64 R16A;
   uint64 R16B;
   uint64 Z[2];
   uint64 increaseA;
   uint64 increaseB;
};

rnd64::rnd64(void)
{
   dx=0xfedca201L;
   dy=0x012357bfL;
   R16A=(uint64)1;
   R16B=(uint64)2;
   Z[0]=Z[1]=0x00;
   x=5; y=3; end=2;
   increaseA=0x012357bfL;
   increaseB=0xfedca201L;
}

rnd64::~rnd64(void)
{
}

int rnd64::prime_number(int st)
{
   if (st == INC)
   {
      x+=2; y=3;
      if (x>=(1<<16)) x=5;
      end=unsigned(sqrt(double(x)+0.25));
      return SEQUEL;
   }
   else
   {
      if (!(x%y)) return FALSE;
      if ((y+=2)>end) return TRUE;
      return SEQUEL;
   }
}

inline uint64 uabs(uint64 &a, uint64 &b)
{
   return a>b? a-b: b-a;
}

inline void swap(uint64 &a, uint64 &b)
{
   uint64 c=a; a=b; b=c;
}

uint64 rnd64::next(void)
{
   status=prime_number(NEW);
   if (status == TRUE)
   {
      increaseB-=increaseA;
      increaseA+=x;
      prime_number(INC);
   }
   else if (status == FALSE)
   {
      prime_number(INC);
   }

   R16A -= increaseA; increaseA-=dx;
   R16B += increaseB; increaseB+=dy;

   if (status==TRUE)
   swap(R16A, R16B);

   R16A += (R16A>>32)^(R16B<<32);
   R16B -= (R16A<<32)^(R16B>>32);

   return R16A^R16B;
}

uint64 rnd64::rnd(void)
{
   uint64 p1=next();
   if (status==TRUE)
   {
      uint64 a[2], b[2];
      uint64 p2=next();
      a[0]=b[0] = Z[0];
      a[1]=b[1] = Z[1];
      ++a[unsigned(p1%2)];
      ++b[unsigned(p2%2)];
      uint64 A=uabs(a[0], a[1]);
      uint64 B=uabs(b[0], b[1]);

      if (Z[0] == Z[1])
      {
         if (unsigned(next()%2))
         {
            A=1; B=0;
         }
         else
         {
            A=0; B=1;
         }
      }

      if (A < B)
      {
         ++Z[unsigned(p1%2)];
         return p1;
      }
      else
      {
         ++Z[unsigned(p2%2)];
         return p2;
      }
   }
   else
   {
      ++Z[unsigned(p1%2)];
      return p1;
   }
}

void main(void)
{
   rnd64 R;
   int st=0;
   uint64 bit[2];
   bit[0]=bit[1]=0x00;

   for (;;)
   {
      uint64 P=R.rnd();
      ++bit[unsigned(P%2)];
      if (st==0 && bit[1]>bit[0])
      {
         printf("%d", bit[0]>bit[1]? 1: 0);
         st=1;
      }
      else if (st==1 && bit[0]>bit[1])
      {
         printf("%d", bit[0]>bit[1]? 1: 0);
         st=0;
      }
   }
}

 

Edited by Passenger
Testing

Archived

This topic is now archived and is closed to further replies.

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.