#include <stdio.h> #include <stdlib.h> typedef unsigned long long U64; typedef unsigned short gtype; typedef struct leap_data { // Transform x = (x>>LEAP_BITS)*a+b U64 a, b; // Threshold to switch 64+48 bit op. U64 threshold; gtype g; } leap_data; extern void init_leap_table(int bits, leap_data *leap_tab) { int i; for (i=0; i< (1<<bits); i++) { leap_data *l = &(leap_tab[i]); U64 a = (1<<bits); U64 b = i; int g = 0; while((a&1)==0) { if (b&1) //odd { a = 3*a; b = 3*b + 1; g++; } a /= 2; b /= 2; g++; } l->a = a; l->b = b; l->g = g; l->threshold = (0xffffffffffffffffLL-b)/a; } }