For the #57 key instead:
#define GSTEP (1<<28)
typedef struct hashtable_entry {
uint64_t x;
uint32_t exponent;
} hashtable_entry;
#define HASH_SIZE (2*GSTEP)
hashtable_entry table[HASH_SIZE];
I use 32 bit for the exponent (32 > 28) and I store only the first 64 bit of the x coordinate (there is a low chance to have a partial collision in a list of 2^28 element, i.e. two different x with the same first 64 bit) -->
(64 + 32 bit) To avoid any collisions you should use always 256 bit for the x coordinate. And the size of the hash table should be at least two times the size of the list you want to store.
With the above in mind how does the other guy's program work for the first 51 with only uint32_t x; instead of 64?? Mostly curious.