在选择像plaintext_modulus这样的参数时,有什么好的策略吗?(除了猜测和检查,直到输出看起来正确)
特别是,我正在用IntegerEncoder进行BFV的实验。我的理解(可能是错误的)是,plaintext_modulus不是,不是被编码整数的模,而是多项式表示中每个系数的模。
对于B=2,这些系数看起来只是0或1。但是,在应用了相加和乘法之类的运算后,显然不再是这样了。是否有一种很好的方法来确定系数的好界,以便选择plaintext_modulus
发布于 2018-10-26 19:01:02
我(潜在错误)的理解是,plaintext_modulus不是被编码整数的模数,而是多项式表示中每个系数的模数。
这是使用IntegerEncoder时正确的思维方式。但是,请注意,在使用BatchEncoder ( SEAL 2.*中的PolyCRTBuilder)时,情况正好相反:明文向量中的每个插槽都是整数模poly_modulus。
对于B=2,这些系数看起来只是0或1。但是,在应用了相加和乘法之类的运算后,显然不再是这样了。是否有一个很好的方法来确定系数的一个好的界,以便选择plaintext_modulus?
IntegerEncoder的全部要点是,新编码具有尽可能小的系数,延迟了plain_modulus溢出,并允许您使用较小的plain_modulus (意味着较小的噪声增长)。*有一个自动参数选择工具,它对噪声增长和明文系数增长执行启发式的上限估计,并且基本上完全符合您的要求。不幸的是,这些估计是在每次操作的基础上执行的,导致早期操作中的高估在计算的后期阶段出现爆炸。因此,估计数并不比最简单的计算更紧,而且在许多情况下,这个工具提供的参数过大。
为了估计乘法中明文系数的增长,让我们考虑两个多项式p(x)和q(x)。很明显,乘积的度完全等于deg(P)+deg(Q),这部分很容易。如果the _x表示多项式P(最大系数的绝对值)的无穷范数,那么:
X*q <= min{deg(p)+1,deg(q)+1} *\x,p,x,x,p,p,x,x,p,x,p,x,x,
实际上,海豹突击队2.*在这里有点精确。它不使用度,而是在这些多项式中使用非零系数的数目。当多项式稀疏时,这会产生很大的不同,在这种情况下,交叉项的贡献要小得多,一个更好的界限是:
{#(non_zero_coeffs(P)),}*(non_zero_coeffs(Q))}*~(?)
IntegerEncoder-like编码器中系数增长的更深层次的分析是由科斯塔歇等人在https://eprint.iacr.org/2016/250中完成的,您可能想看看。
https://stackoverflow.com/questions/53002005
复制相似问题