system: [SYSTEM]

user: 3. 章实验仿真 3.1. 参数选取 对与参数的选取，主要涉及到BKW算法中的b为每次消元个数，t为迭代次数 [ 11 ]。 在我们的模拟中选定奇素数q为5，变元个数n为40 [ 12 ]，为了能够对最终得到的新矩阵进行运算，我们需要将先矩阵的维度限制在14以内 [ 13 ]，具体原因后文会说明，在最初的模拟时我们为了验证程序正确性，对1024个无错方程组进行求解，此时我们令b = 10，t = 1，将求得的结果与正确答案相对照，结果很容易得到了正确答案，而后引入错误，错误率达到1%发现也能得到正确答案。我们将错误率提升到2%，此时需要的总方程数已经有些略少，我们将初始方程数提升到10，000个，并将b设置为5，t设置为6，进行6轮消元之后剩余10个变元，利用穷举得到正确答案。之后其他的条件不变将错误率提升到5%，发现也能狗解出答案，但是当错误率达到10%之后，此时的剩余方程总数为250，000已经不足以解出问题，之后控制条件我们陆续将剩余方程数调至500，000、700，000均未能解出答案，由于时间有限，为继续向下工作。 事实上，如果初始方程数过少时我们可以将b的值适当减少，同时增加t的值，同时采用LF2消元方法，则可以获取足够的方程，如果方程数很多，则可以采用LF1，降低方程数，也可以才用LF1与LF2交换使用，同时按照情况选择校园个数b的方法进行消元 [ 14 ]。 3.2. 算法实现 实验环境：win 10 实现平台：visual studio 2017 语言：C++ 编程实现：我们知道C++有丰富的库可以调用，大大简化了我们的工作，而且NTL库在有限域上的矩阵运算有很好的包装实现，所以本次我们凭借NTL库实现该算法 [ 15 ]。 1) NTL库的配置 ① NTL文件编译 具体库可以在http://www.shoup.net/ntl/上获得，我们采用的是9.7.0版本，下载完成之后，在vs上新建一个static工程，将NTL文件夹的src子文件夹所有文件添加到工程中，将NTL文件夹的include子文件夹添加到工程属性 → 链接器 → 常规的附加库目录中(如图1)。 图1. 将include子文件夹添加到附加库目录中 而后直接编译即可，编译之后可在工程文件加中找到lib文件。 ② 运行程序 将刚刚的lib文件添加到工程属性 → 链接器 → 输入的附加依赖项中(如图2)。 图2. 将lib文件添加到附加依赖项中 NTL文件夹的include子文件夹添加到工程属性 → 链接器 → 常规的附加库目录中(如图3)。 图3. 将include子文件夹添加到常规的附加库目录中 而后运行cpp文件即可。 2) 程序解读 程序依照论文主要有以下几个程序， ① GAUSS PROESS 输入为：系数矩阵G，含错常数向量z 输出为：G做变换之后得到的矩阵L0，变换之后的常数向量z；前n行现行独立的n * n方阵A0及他的逆矩阵d； 关键步骤： 给定的系数矩阵G前n行可能非线性独立，需要对前n行的向量进行初等置换。得到A0之后对A0进行求逆的d，最后 G ′ = d ∗ G ，得到G'的形式为(I|L0)，最后得到的G为L0 ② BKW-reduction 输入为之前得到的G，参数b，t； 输出为最终的方程数目counter； 关键步骤： 首先我们需要对刚刚获得矩阵G，按照后b个比特进行分类，相同的分成一类，这样的可以分成 q b 项，对于分类方法我们采用将后b个比特的数据按照进制q进制转化成10进制，最终如果两个数按照数值进行分类，分成 q b 个二维数组。对于分类之后的数据我们会根据需要进行消元操作即LF1或者LF2，对于何时采用LF1何时采用LF2，我们在对每个数组进行完操作之后会对目前已有的总方程数进行判断当方程个数大于某一阈值采用LF1，否则采用LF2，采用这一方法主要是因为当方程数量过大时，若一直采用LF2，会使得内存溢出，若一直采用LF1，会导致得到的方程个数较少，无法得到正确答案。 ③ LF1及LF2 输入：分组之后的二维向量V，变元个数n，系统参数b； 输出：运算之后的二维向量G； 关键步骤： 按照论文所说，LF1随机选出一个向量与其他向量进行运算，LF2将二维数组中的每两个向量进行运算。 ④ Console 输入：消元后的矩阵G，消元后的常数向量z，变元个数n，系统参数b，t，剩余方程总量counter； 输出：每一个可能答案的符合率，及最高符合率对应的向量。 关键步骤： 该子程序主要完成验证性功能，即在完成BKW消元后，对剩下的变元s'进行穷举求解，分别计算对应的zi如下图： [ a 11 ⋯ a 1 ( n − b t ) ⋮ ⋱ ⋮ a c o u n t e r 1 ⋯ a c o u n t e r ( n − b ∗ t ) ] ∗ s ′ = Z i = ( z i 1 ， z i 2 ， ⋯ z i c o u n t e r ) (3-1) 如果 z i j = z j ，那么计数器累加，最后得到每个向量对应的 符 合 率 = 最 终 计 数 器 值 总 的 方 程 数 目 (3-2) 遍历所有的向量，找到符合率最高的项，而后验证是否为正确答案。 3.3. 问题与解决办法 当我们尝试解决2%的错误率时遇到了些许问题，如果变元数目过多，那么将会导致数据量过大，导致无法遍历所有的位置向量s' (假定有20个变元，则需要遍历 5 20 ≫ 2 40 )同时如果消元数目过多则会导致得到的方程数目太少，因此我们选择的参数为b = 5，t = 6。 最终执行的时候我们还是遇到了一些问题，在中间过程中，如果一直使用LF2进行消元会导致剩余方程数快速上涨，一般来说4轮BKW消元之后方程数目已经达到百万级别，导致内存空间不足，运行失败，而且即便运行成功，最后的遍历求解过程也会花费大量时间。 因此我们在消元上进行了一定量的工作，我们建立了一下几种方案： 1) 在分组时对放方程数目进行限制，利用LF2进行消元时，如果组内的方程数很多，进行消元之后会增加很多，大约为： m ′ = m 2 t 2 ( 2 t − 1 ) ( b + 1 ) − m (3-3) 因此控制组内的方程个数是一个很好的方法，具体操作是当组内的方程个数达到一定数目之后将后来的方程舍弃，不在进行向组内添加方程。这样的方法会将原来方程中的很多有用的信息漏掉，采用需慎重，如果有更好的办法，不宜采用。 2) 第二个方法与上个方法异曲同工，不过是对总方程数进行控制，具体方法是在方程个数达到一定数目时，将舍弃后面为进行操作的组，不在进行消元，转而进行下一轮消元。此方法比第一种舍弃的方程数更为集中，不宜采用， 3) 第三个方法时将两种方法结合起来，在组内控制组内方程个数，在组外控制总的方程个数，经过调试，如果组内方程个数控制的好，可以达到较为理想的结果，但弊端还是同上一样，对信息利用不充分。 4) 第四个方法是每对一组做完组内消元之后判断当前方程数，如果方程数过多，则选取LF1，会使得方程数减少，如果过少则选取LF2，会使得方程数增加，但是需要注意的是选取LF2消元，方程数会以很快速度增大，LF1消元，方程数较少速度较慢。所以选取的阈值需要经过测试一般来说，最终剩余的方程数是都会多于阈值，大约为阈值的5倍左右。表1我们列举了我们有关方程数与阈值的一些实验数据(见表1)。 Table 1 Experimental data of different thresholds and equation number 阈值 最终方程数 150，000 683，963 100，000 476，693 50，000 256，464 表1. 不同阈值与方程数的实验数据 最终我们决定采用第四中方法与第一种方法相结合的方式来控制方程数，控制组内方程数主要是因为组内方程过多，使用LF2增长速度过快，不容控制，将组能方程数控制在可控范围内，是必要的。 关于确定方程数数目的问题： 事实上，由于方程是含错的，由于错误率不同，我们为了得到正确的答案所需要的方程数也不同，为了得到正确的向量，我们应该在允许范围内，尽量得到更多的方程，同时，由与如果方程数目过多，我们所需要的运算量会大大增加，那么我们可能没有足够的能力处理这些方程，此时我们选择减少最终的方程数量，那么我们得到的符合率最高的向量就可能不是正确答案，那么我们就应该确定一个范围，使得符合率在这个范围内的向量就可以待定为正确答案，进行下一步确认，如果能够达到这样的目的，我们可以认为此时的方程数量是恰当的。 3.4. 实验结果 为了验证程序的正确性，我们选取不同的参数做了以下的实验，结果如下(见表2)。 Table 2 Experimental results under different parameter 变元个数 方程个数 错误率 每次消元数 消元轮数 剩余方程数 最高符合数 符合率 是否正确 40 1024 0% 10 1 10，000 10，000 1 正确 40 1024 1% 10 1 10，000 10，000 1 正确 40 10，000 2% 5 6 25，000 7227 0.288 正确 40 10，000 5% 5 6 25，000 5202 0.208 正确 40 10，000 10% 5 6 25，000 4800 0.192 错误 40 10，000 10% 5 6 50，000 9800 0.196 错误 表2. 不同参数下的实验结果 结果分析： 首先我们可以看到一个显而易见的结论，错误率越少，得到结果所需方程数越少，越容易得到正确答案，但是还有一些内容，单凭表格上的内容我们得不到，因此，我们将仅选取第3，4组的符合率分布做出了图表(此图表仅显示了符合率大于0.2的备选答案，见图4)，可以较为直观的看到当错误率较小时，非正确答案分布满足基本在0.2左右，正确答案为0.28，此时剩余方程数能够去别处正确答案，当错误率达到5%时，非正确答案依然分布在0.2周围但是已经有部分备选答案略大于0.2，此时虽然能够得到正确答案，但是正确答案的优势已经不那么明显了，而当符合率达到10%时，可以从表中看出，上述的方程数已经无法去别出正确答案了，需要增加方程数。 图4. 4%错误率下的实验结果和2%错误率下的实验结果