RDM из OSCAT'а на длине 1'000'000 бит

Проходит 3 теста:
Rank
FFT
LinearComplexity

Не проходит:
Frequency (проходит 0 из 10)
BlockFrequency (проходит 3 раза из 10)
CumulativeSums (0 из 10)
Runs (0 из 10)
LongestRun (проходит 9 раз из 10)
NonOverlappingTemplate
OverlappingTemplate (7 из 10)
Universal (9 из 10)
ApproximateEntropy (0 из 10)
Serial


Код:
// Переписано отсюда: https://github.com/simsum/oscat/blob/master/RDM.EXP

unsigned int bit_count(unsigned int n) {
  unsigned int c;
  for (c=0;n>0;n=n&(n-1)) c++;
  return c;
}

unsigned int rol(unsigned int x, unsigned int n){
        return (x<<n)|(x>>(32-n));
}

float rdm(float last) {
  float rdm;
  
  tn = T_PLC_MS;
  tc = bit_count(tn);
  tn |= (tn&(1<<(2)))<<(31-2);
  tn |= (tn&(1<<(5)))<<(30-5);
  tn |= (tn&(1<<(4)))<<(29-4);
  tn |= (tn&(1<<(1)))<<(28-1);
  tn |= (tn&(1<<(0)))<<(27-0);
  tn |= (tn&(1<<(7)))<<(26-7);
  tn |= (tn&(1<<(6)))<<(25-6);
  tn |= (tn&(1<<(3)))<<(24-3);
  tn = rol(tn, bit_count(tn)) | 0x80000001;
  tn = tn % 71474513 + (tc + 77);
  rdm = ((float)tn) / 10000000.0 * (E - (last<0.0 ? 0 : (last>1.0?1.0:last) ));
  rdm = rdm - floor(rdm);
  T_PLC_MS+=10;
  return rdm;
}