Пример #1
0
        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;
        }
Пример #2
0
        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);
        }
Пример #3
0
        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];
            }
        }
Пример #4
0
 public SfmtPrimitiveState()
 {
     _chunk = new AlignedMemoryChunk(sizeof(ulong) * IntegerDefinition.N64, 16);
     State  = (IntegerW128 *)_chunk.AlignedHead;
     Index  = 0;
 }