private static void RightShift128(IntegerW128 *output, IntegerW128 *input, int shift) { var th = ((ulong)input->u[3] << 32) | input->u[2]; var tl = ((ulong)input->u[1] << 32) | input->u[0]; var oh = th >> (shift * 8); var ol = tl >> (shift * 8); ol |= th << (64 - shift * 8); output->u[1] = (uint)(ol >> 32); output->u[0] = (uint)ol; output->u[3] = (uint)(oh >> 32); output->u[2] = (uint)oh; }
private static void DoRecursion(IntegerW128 *r, IntegerW128 *a, IntegerW128 *b, IntegerW128 *c, IntegerW128 *d) { IntegerW128 x; IntegerW128 y; LeftShift128(&x, a, Sl2); RightShift128(&y, c, Sr2); r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> Sr1) & Msk1) ^ y.u[0] ^ (d->u[0] << Sl1); r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> Sr1) & Msk2) ^ y.u[1] ^ (d->u[1] << Sl1); r->u[2] = a->u[2] ^ x.u[2] ^ ((b->u[2] >> Sr1) & Msk3) ^ y.u[2] ^ (d->u[2] << Sl1); r->u[3] = a->u[3] ^ x.u[3] ^ ((b->u[3] >> Sr1) & Msk4) ^ y.u[3] ^ (d->u[3] << Sl1); }
private static void GenRandArray(SfmtPrimitiveState sfmt, IntegerW128 *array, int size) { int i, j; Vector128 <int> r1, r2; var pstate = sfmt.State; r1 = pstate[N - 2].si; r2 = pstate[N - 1].si; for (i = 0; i < N - Pos1; i++) { array[i].si = Recursion(pstate[i].si, pstate[i + Pos1].si, r1, r2); r1 = r2; r2 = array[i].si; } for (; i < N; i++) { array[i].si = Recursion(pstate[i].si, array[i + Pos1 - N].si, r1, r2); r1 = r2; r2 = array[i].si; } for (; i < size - N; i++) { array[i].si = Recursion(array[i - N].si, array[i + Pos1 - N].si, r1, r2); r1 = r2; r2 = array[i].si; } for (j = 0; j < 2 * N - size; j++) { pstate[j] = array[j + size - N]; } for (; i < size; i++, j++) { array[i].si = Recursion(array[i - N].si, array[i + Pos1 - N].si, r1, r2); r1 = r2; r2 = array[i].si; pstate[j] = array[i]; } }
public SfmtPrimitiveState() { _chunk = new AlignedMemoryChunk(sizeof(ulong) * IntegerDefinition.N64, 16); State = (IntegerW128 *)_chunk.AlignedHead; Index = 0; }