void gen_rand_array_c1o2(w128_t *array, int size)
        {
            int    i, j;
            w128_t lung;

            fixed(w128_t *status = this.status)
            {
                lung = status[DSFMT_N];
                do_recursion(&array[0], &status[0], &status[DSFMT_POS1], &lung);
                for (i = 1; i < DSFMT_N - DSFMT_POS1; i++)
                {
                    do_recursion(&array[i], &status[i], &status[i + DSFMT_POS1], &lung);
                }
                for (; i < DSFMT_N; i++)
                {
                    do_recursion(&array[i], &status[i], &array[i + DSFMT_POS1 - DSFMT_N], &lung);
                }
                for (; i < size - DSFMT_N; i++)
                {
                    do_recursion(&array[i], &array[i - DSFMT_N], &array[i + DSFMT_POS1 - DSFMT_N], &lung);
                }
                for (j = 0; j < 2 * DSFMT_N - size; j++)
                {
                    status[j] = array[j + size - DSFMT_N];
                }
                for (; i < size; i++, j++)
                {
                    do_recursion(&array[i], &array[i - DSFMT_N], &array[i + DSFMT_POS1 - DSFMT_N], &lung);
                    status[j] = array[i];
                }
                status[DSFMT_N] = lung;
            }
        }
 static void convert_o0o1(w128_t *w)
 {
     w->u64_0 |= 1;
     w->u64_1 |= 1;
     w->d0    -= 1.0;
     w->d1    -= 1.0;
 }
Exemplo n.º 3
0
        static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c, w128_t *d)
        {
            w128_t x;
            w128_t y;

            lshift128(&x, a, SFMT_SL2);
            rshift128(&y, c, SFMT_SR2);
            r->u32_0 = a->u32_0 ^ x.u32_0 ^ ((b->u32_0 >> SFMT_SR1) & SFMT_MSK1) ^ y.u32_0 ^ (d->u32_0 << SFMT_SL1);
            r->u32_1 = a->u32_1 ^ x.u32_1 ^ ((b->u32_1 >> SFMT_SR1) & SFMT_MSK2) ^ y.u32_1 ^ (d->u32_1 << SFMT_SL1);
            r->u32_2 = a->u32_2 ^ x.u32_2 ^ ((b->u32_2 >> SFMT_SR1) & SFMT_MSK3) ^ y.u32_2 ^ (d->u32_2 << SFMT_SL1);
            r->u32_3 = a->u32_3 ^ x.u32_3 ^ ((b->u32_3 >> SFMT_SR1) & SFMT_MSK4) ^ y.u32_3 ^ (d->u32_3 << SFMT_SL1);
        }
        static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *lung)
        {
            uint64_t t0, t1, L0, L1;

            t0          = a->u64_0;
            t1          = a->u64_1;
            L0          = lung->u64_0;
            L1          = lung->u64_1;
            lung->u64_0 = (t0 << DSFMT_SL1) ^ (L1 >> 32) ^ (L1 << 32) ^ b->u64_0;
            lung->u64_1 = (t1 << DSFMT_SL1) ^ (L0 >> 32) ^ (L0 << 32) ^ b->u64_1;
            r->u64_0    = (lung->u64_0 >> DSFMT_SR) ^ (lung->u64_0 & DSFMT_MSK1) ^ t0;
            r->u64_1    = (lung->u64_1 >> DSFMT_SR) ^ (lung->u64_1 & DSFMT_MSK2) ^ t1;
        }
Exemplo n.º 5
0
        static void lshift128(w128_t *dst, w128_t *src, int shift)
        {
            uint64_t th, tl, oh, ol;

            th         = ((uint64_t)src->u32_3 << 32) | ((uint64_t)src->u32_2);
            tl         = ((uint64_t)src->u32_1 << 32) | ((uint64_t)src->u32_0);
            oh         = th << (shift * 8);
            ol         = tl << (shift * 8);
            oh        |= tl >> (64 - shift * 8);
            dst->u32_1 = (uint32_t)(ol >> 32);
            dst->u32_0 = (uint32_t)ol;
            dst->u32_3 = (uint32_t)(oh >> 32);
            dst->u32_2 = (uint32_t)oh;
        }
Exemplo n.º 6
0
        void gen_rand_array(w128_t *array, int size)
        {
            fixed(w128_t *state = this.state)
            {
                var r1 = &state[SFMT_N - 2];
                var r2 = &state[SFMT_N - 1];
                int i;

                for (i = 0; i < SFMT_N - SFMT_POS1; i++)
                {
                    do_recursion(&array[i], &state[i], &state[i + SFMT_POS1], r1, r2);
                    r1 = r2;
                    r2 = &array[i];
                }
                for (; i < SFMT_N; i++)
                {
                    do_recursion(&array[i], &state[i], &array[i + SFMT_POS1 - SFMT_N], r1, r2);
                    r1 = r2;
                    r2 = &array[i];
                }
                for (; i < size - SFMT_N; i++)
                {
                    do_recursion(&array[i], &array[i - SFMT_N], &array[i + SFMT_POS1 - SFMT_N], r1, r2);
                    r1 = r2;
                    r2 = &array[i];
                }
                int j;

                for (j = 0; j < 2 * SFMT_N - size; j++)
                {
                    state[j] = array[j + size - SFMT_N];
                }
                for (; i < size; i++, j++)
                {
                    do_recursion(&array[i], &array[i - SFMT_N], &array[i + SFMT_POS1 - SFMT_N], r1, r2);
                    r1       = r2;
                    r2       = &array[i];
                    state[j] = array[i];
                }
            }
        }
 static void convert_o0c1(w128_t *w)
 {
     w->d0 = 2.0 - w->d0;
     w->d1 = 2.0 - w->d1;
 }
 static void convert_c0o1(w128_t *w)
 {
     w->d0 -= 1.0;
     w->d1 -= 1.0;
 }