Math-Random-BlumBlumShub
view release on metacpan or search on metacpan
BlumBlumShub.xs view on Meta::CPAN
}
int autocorrelation_20000(pTHX_ mpz_t * bitstream, int offset) {
int i, last, count = 0, short_ = 0;
mpz_t temp;
double x, diff;
int len = mpz_sizeinbase(*bitstream, 2);
if(len > 20000 + offset) croak("Wrong size random sequence for autocorrelation_20000 test");
if(len < 19967 + offset) {
warn("More than 33 leading zeroes in autocorrelation_20000 test\n");
return 0;
}
/* make sure *bitstream has a length of 20000 + offset bits. */
if(20000 + offset - len) {
short_ = 1;
mpz_init_set_ui(temp, 1);
mpz_mul_2exp(temp, temp, 19999 + offset);
mpz_add(*bitstream, *bitstream, temp);
}
if(mpz_sizeinbase(*bitstream, 2) != 20000 + offset) croak("Bit sequence has length of %d bits in autocorrelation_20000 function; should have size of %d bits", mpz_sizeinbase(*bitstream, 2), 20000 + offset);
for(i = 0; i < 19999; ++i) {
if(mpz_tstbit(*bitstream, i) ^ mpz_tstbit(*bitstream, i + offset)) count += 1;
}
last = short_ ? 0 : 1;
if(mpz_tstbit(*bitstream, 19999) ^ last) count += 1;
/* restore *bitstream to its original value && free temp (iff necessary) */
if(short_) {
mpz_sub(*bitstream, *bitstream, temp);
mpz_clear(temp);
}
if(count > 9654 && count < 10346) return 1;
return 0;
}
SV * _get_xs_version(pTHX) {
return newSVpv(XS_VERSION, 0);
}
MODULE = Math::Random::BlumBlumShub PACKAGE = Math::Random::BlumBlumShub
PROTOTYPES: DISABLE
void
bbs (outref, p, q, seed, bits_required)
mpz_t * outref
mpz_t * p
mpz_t * q
mpz_t * seed
int bits_required
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
bbs(outref, p, q, seed, bits_required);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
void
bbs_seedgen (seed, p, q)
mpz_t * seed
mpz_t * p
mpz_t * q
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
bbs_seedgen(seed, p, q);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
int
monobit (bitstream)
mpz_t * bitstream
int
longrun (bitstream)
mpz_t * bitstream
int
runs (bitstream)
mpz_t * bitstream
int
poker (bitstream)
mpz_t * bitstream
void
autocorrelation (bitstream, offset)
mpz_t * bitstream
int offset
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
autocorrelation(aTHX_ bitstream, offset);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
int
autocorrelation_20000 (bitstream, offset)
mpz_t * bitstream
int offset
CODE:
RETVAL = autocorrelation_20000 (aTHX_ bitstream, offset);
OUTPUT: RETVAL
SV *
_get_xs_version ()
CODE:
RETVAL = _get_xs_version (aTHX);
OUTPUT: RETVAL
( run in 1.209 second using v1.01-cache-2.11-cpan-5511b514fd6 )