在选择诸如plaintext_modulus
之类的参数时,有什么好的策略吗? (除了猜测并检查直到输出看起来正确为止)
尤其是,我正在使用IntegerEncoder
和BFV进行实验。我的(可能是错误的)理解是,plaintext_modulus
不是要被编码的整数的模数,而是多项式表示形式中每个系数的模数。
在B = 2时,这些系数看起来只是0或1。但是,在应用了加法和乘法之类的运算之后,情况显然不再如此。为了选择plaintext_modulus
,是否有一种很好的方法来确定系数的合理范围?
答案 0 :(得分:1)
我的(可能是错误的)理解是,plaintext_modulus不是要编码的整数的模数,而是多项式表示形式中每个系数的模数。
这是使用IntegerEncoder
时的正确思维方式。但是请注意,在SEAL 2. *中使用BatchEncoder
(PolyCRTBuilder
)时,情况恰好相反:明文矢量中的每个时隙都是以poly_modulus
为模的整数。
在B = 2时,这些系数看起来只是0或1。但是,在应用了加法和乘法之类的运算之后,情况显然不再如此。是否有一个很好的方法来确定系数的合理范围,以便选择plaintext_modulus?
IntegerEncoder
的全部要点是,新鲜的编码具有尽可能小的系数,从而延迟了plain_modulus
的溢出,并允许您使用较小的plain_modulus
(意味着较小的噪声增长)。 SEAL 2. *有一个自动参数选择工具,可以对噪声增长和明文系数增长进行启发式上限估计,并且基本上可以完全满足您的要求。不幸的是,这些估计是在每个操作的基础上执行的,从而导致较早操作中的高估会在计算的后期阶段爆炸。结果,除了最简单的计算之外,估计值还不够紧,而且在许多情况下,此工具提供的参数过大。
要估计乘法中的明文系数增长,让我们考虑两个多项式p(x)和q(x)。显然,乘积的度数将完全等于deg(p)+ deg(q)---这部分很容易。如果| P |表示多项式P(最大系数的绝对值)的无穷范数,然后:
| p * q | <= min {deg(p)+1,deg(q)+1} * | p || q |。
实际上,SEAL 2. *在这里更加精确。代替使用度数,它使用这些多项式中的非零系数的数量。当多项式稀疏时,这会有很大的不同,在这种情况下,交叉项的贡献要小得多,并且更好的界限是:
| p * q | <=分钟{#(non_zero_coeffs(p)),#(non_zero_coeffs(q))} * | p || q |。
https://eprint.iacr.org/2016/250由Costache et al。进行了更深层次的IntegerEncoder
编码器系数增长分析,您可能想看看。