Nice idea, but you can simplify it by ignoring Y coordinate, since X is much more important and effectively defining the point on the curve. Then you can stay in 256 bit range instead of venturing to 512 bits, and use this version I've written for you:
struct xorshift256_state {
uint64_t a, b, c, d;
};
/* The state array should be initialized to X coordinate */
uint64_t xorshift256(struct xorshift256_state *state)
{
uint64_t t = state->d;
uint64_t const s = state->a;
state->d = state->c;
state->c = state->b;
state->b = s;
t ^= t << 11;
t ^= t >> 8;
return state->a = t ^ s ^ (s >> 19);
}
Thanks, that looks great (fast).
BTW there is already a 512 bit state version of
xoshiro in case we/anyone wants to try it.