/* fichier cycles.c
   Fonction : compte le nombre d'états du registre de CRC (Poly=0x8005)
    dans un cycle en partant d'un état et d'une configuration donnée
 */

#include <stdio.h>

#define CRC16_Galois(registre, data_in)   \
  registre = (registre+registre) ^ (0x8005 & \
    (((signed short int) (registre ^ ((data_in & 1) << 15))) >> 15));

#define CRC16_Fibonacci(registre, data_in) \
  registre = (registre+registre)           \
           ^ (1 & (data_in                 \
                   ^ (registre >> 1)       \
                   ^ (registre >> 14)      \
                   ^ (registre >> 15)  ));

#define SEED 0

int main(void) {
  int i=0;
  unsigned short int lfsr=SEED;

  do {
    i++;
    CRC16_Fibonacci(lfsr,1)
    printf("%05d\n",lfsr);
  } while (lfsr != SEED);

  printf(" %d itérations\n",i);
  return 0;
}