def serial_test(generator, n_bits, n1=None, sig_level=None, misc=None):
if n1 is None:
n0, n1 = _calculate_n0_n1(generator, n_bits)
else:
n0 = n_bits - n1
n_xx = [0] * 4 # number of occurrences of 00, 01, 10, 11
bi0 = generator.random_bit() # bit b[i]
for i in range(n_bits - 1):
bi1 = generator.random_bit() # bit b[i+1]
n_xx[bi0 << 1 | bi1] += 1
bi0 = bi1
# Calculate the statistic
x2 = 4 / (n_bits - 1) * (n_xx[0b00] ** 2 + n_xx[0b01] ** 2 + n_xx[0b10] ** 2 + n_xx[0b11] ** 2)
x2 += -2 / n_bits * (n0 ** 2 + n1 ** 2) + 1
if type(misc) is dict:
misc.update(n0=n0, n1=n1, n00=n_xx[0b00], n01=n_xx[0b01], n10=n_xx[0b10], n11=n_xx[0b11])
if sig_level is None:
return x2
else:
limit = chi2.ppf(1 - sig_level, 2)
if type(misc) is dict:
misc.update(x=x2, limit=limit)
return x2 <= limit
评论列表
文章目录