def poker_test(generator, n_bits, m=None, sig_level=None, misc=None):
if m is not None:
if n_bits // m < 5 * (2 ** m):
raise ValueError("Value m must satisfy requirement [n/m]>=5*2^m")
else:
# find the highest suitable m value
m = int(log2(n_bits / 5))
while n_bits // m < 5 * (2 ** m):
m -= 1
k = n_bits // m
# Divide the sequence into k non-overlapping parts each of length m
# and let ni be the number of occurrences of the ith type of sequence of length m, 1 <= i <= 2m.
ni = [0] * (2 ** m)
for i in range(0, k * m, m):
t = concat_chunks([generator.random_bit() for _ in range(m)], bits=1)
ni[t] += 1
x3 = (2 ** m) / k * sum(map(lambda x: x ** 2, ni)) - k
if type(misc) is dict:
misc.update(m=m, k=k, ni=ni)
if sig_level is None:
return x3
else:
limit = chi2.ppf(1 - sig_level, (2 ** m) - 1)
if type(misc) is dict:
misc.update(x=x3, limit=limit)
return x3 <= limit
评论列表
文章目录