tab-leap.c ver 0.7

#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;
    }
}