1. 背景随机性检测文档NIST SP800-22rev1a (A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications)中提到他们提供了四个样本——由Mathematica生成的经典常数的二进制展开长度均超过 100 万位分别为data.e自然常数 e 的二进制展开、data.pi圆周率 π 的二进制展开、data.sqrt2√2 的二进制展开data.sqrt3√3 的二进制展开。生成这些文件所使用的 Mathematica 程序见NIST SP800-22rev1a的附录 F。在NIST SP800-22rev1a的附录 B 给出这些样本数据的实证结果对每个数据文件均应用了NIST SP800-22rev1a的所有统计测试并将结果记录在表格中。GM/T 0005—2021《随机性检测规范》中给出三种样本长度分别是20,000比特、1,000,000比特、100,000,000比特。NIST SP800-22rev1a中给出的四个样本可用于GM/T 0005—2021中的前两种样本长度的检测但无法满足100,000,000比特的要求。以下给出生成这四种样本的100,000,000比特的python代码以便测试使用。2. python代码python代码生成四种样本e、π、√2、√3的前100,000,000比特。注意这里沿用NIST的设定——输出的比特是包括整数部分的比特序列而不是仅小数部分的二进制展开。例如NIST提供的data.pi就是把整个pi进行二进制展开。data.pi的第一行给出了24比特数据为“110010010000111111011010”这里的前两比特“11”就是表示整数部分3。如果认为这24比特是纯小数部分的展开则“110010010000111111011010” 1/2 1/4 0/8 0/16 1/32... 0.785398126这显然不等于pi的纯小数部分。AI生成的python代码如下。import mpmath import time def set_precision(bit_length: int) - None: 设置mpmath的二进制精度添加10位冗余抵消误差 mpmath.mp.prec bit_length 10 # 冗余位确保计算精度 def get_high_precision_number(num_type: str): 获取指定类型的高精度数mpmath.mpf类型 if num_type e: return mpmath.e elif num_type pi: return mpmath.pi elif num_type sqrt2: return mpmath.sqrt(2) elif num_type sqrt3: return mpmath.sqrt(3) else: raise ValueError(f不支持的数类型{num_type}可选值e、pi、sqrt2、sqrt3) def number_to_binary(fname: str, num, num_type: str, total_bits: int, chunk_size: int 10**6) - None: 将高精度数转换为指定长度的二进制串块级处理优化版 :param num: 高精度数mpmath.mpf类型 :param num_type: 数的类型用于文件名 :param total_bits: 目标二进制总长度 :param chunk_size: 每次处理的块大小比特 start_time time.perf_counter() #fname f{num_type}_binary_{total_bits}.txt print(f正在计算{num_type}的{total_bits}比特二进制串将写入文件{fname}) print(fwrite int(num)...) # 步骤1处理整数部分 int_part mpmath.floor(num) frac_part num - int_part # 纯小数部分0 ≤ frac_part 1 int_bin bin(int(mpmath.nint(int_part)))[2:] # 整数部分二进制不含0b write_bits len(int_bin) # 若整数部分已超过总长度直接截断 if write_bits total_bits: with open(fname, w, encodingascii) as f: f.write(int_bin[:total_bits]) print(f整数部分过长已截断为{total_bits}比特) return # 步骤2处理小数部分块级批量处理 print(fwrite frac(num)...) remaining total_bits - write_bits # 还需生成的小数位数 current_frac frac_part with open(fname, w, encodingascii) as f: f.write(int_bin) # 先写入整数部分 while remaining 0: # 本次处理的块大小最后一块可能不足chunk_size current_chunk min(chunk_size, remaining) # 计算2^current_chunk用于批量提取位 scale mpmath.power(2, current_chunk) # 批量获取当前块的整数部分 product current_frac * scale c int(mpmath.floor(product)) # 块内二进制对应的整数 # 转换为二进制字符串不足current_chunk位则在前面补0 bin_str format(c, f0{current_chunk}b) # 写入文件 f.write(bin_str) # 更新剩余小数部分和计数 current_frac product - c # 仅保留小数部分 remaining - current_chunk # 打印进度 print(f., end) print(f\n成功生成{total_bits}比特的二进制串文件{fname}) end_time time.perf_counter() print(fnumber_to_binary 耗时{end_time - start_time:.3f}秒) if __name__ __main__: # 配置参数 num_type pi # 可选e、pi、sqrt2、sqrt3 total_bits 10**8 # 目标二进制长度1亿比特 chunk_size 10**6 # 块大小100万比特/块可根据内存调整 fname fd:\\{num_type}_binary_{total_bits}.txt#生成的比特序列文件 # 执行流程 set_precision(total_bits) high_prec_num get_high_precision_number(num_type) number_to_binary(fname, high_prec_num, num_type, total_bits, chunk_size)以上代码生成的π的前一百万比特已与NIST提供的data.pi核对通过。如果需要将比特序列转为字节序列请自行增补相关功能。附录 样本数据的测试结果以下数据来自NIST SP800-22rev1a的附录B。示例 1圆周率π的二进制展开统计测试P值频率测试0.578211块频率测试m1280.380615累积和测试 - 正向0.628308累积和测试 - 反向0.663369游程测试0.419268最长连续 1 串测试0.024390秩测试0.083553频谱 DFT 测试0.010186非重叠模板匹配测试m9模板 B0000000010.165757重叠模板匹配测试m90.296897通用统计测试0.669012近似熵测试m100.361595随机游走测试状态 x10.844143随机游走变体测试状态 x-10.760966线性复杂度测试M5000.255475串行测试m16∇Ψ²ᵐ0.143005示例 2自然常数e的二进制展开统计测试P值频率测试0.953749块频率测试m1280.211072累积和测试 - 正向0.669887累积和测试 - 反向0.724266游程测试0.561917最长连续 1 串测试0.718945秩测试0.306156频谱 DFT 测试0.847187非重叠模板匹配测试m9模板 B0000000010.078790重叠模板匹配测试m90.110434通用统计测试0.282568近似熵测试m100.700073随机游走测试状态 x10.786868随机游走变体测试状态 x-10.826009线性复杂度测试M5000.826335串行测试m16∇Ψ²ᵐ0.766182示例 4√2 的二进制展开统计测试P值频率测试0.811881块频率测试m1280.833222累积和测试 - 正向0.879009累积和测试 - 反向0.957206游程测试0.313427最长连续 1 串测试0.012117秩测试0.823810频谱 DFT 测试0.581909非重叠模板匹配测试m9模板 B0000000010.569461重叠模板匹配测试m90.791982通用统计测试0.130805近似熵测试m100.884740随机游走测试状态 x10.216235随机游走变体测试状态 x-10.566118线性复杂度测试M5000.317127串行测试m16∇Ψ²ᵐ0.861925示例 5√3 的二进制展开统计测试P值频率测试0.610051块频率测试m1280.473961累积和测试 - 正向0.917121累积和测试 - 反向0.689519游程测试0.261123最长连续 1 串测试0.446726秩测试0.314498频谱 DFT 测试0.776046非重叠模板匹配测试m9模板 B0000000010.532235重叠模板匹配测试m90.082716通用统计测试0.165981近似熵测试m100.180481随机游走测试状态 x10.783283随机游走变体测试状态 x-10.155066线性复杂度测试M5000.346469串行测试m16∇Ψ²ᵐ0.157500