我目前正在学习如何使用 SEAL,并且在 BFV 方案的参数中,有一个用于选择 PolyModulus 和 CoeffModulus 的辅助函数,但是这不是用于选择 PlainModulus 的,除了它应该是素数或 2 的幂是有什么方法可以知道使用哪个最佳值?
在给定的示例中,PlainModulus 设置为 parms.PlainModulus = new SmallModulus(256); 选择值 256 有什么特殊原因吗?
我目前正在学习如何使用 SEAL,并且在 BFV 方案的参数中,有一个用于选择 PolyModulus 和 CoeffModulus 的辅助函数,但是这不是用于选择 PlainModulus 的,除了它应该是素数或 2 的幂是有什么方法可以知道使用哪个最佳值?
在给定的示例中,PlainModulus 设置为 parms.PlainModulus = new SmallModulus(256); 选择值 256 有什么特殊原因吗?
在 BFV 中,plain_modulus
基本上决定了数据类型的大小,就像在正常编程中使用 32 位或 64 位整数时一样。使用BatchEncoder
数据类型时,适用于明文向量中的每个槽。
如何选择plain_modulus
很重要:乘法中的噪声预算消耗与 成正比log(plain_modulus)
,因此有充分的理由使其尽可能小。另一方面,您需要确保在计算期间不会出现溢出情况,加密数字超过plain_modulus
,除非您特别关心结果模数的正确性plain_modulus
。
在 BFV 的几乎所有实际用例中,您都应该使用BatchEncoder
不浪费明文/密文多项式空间,这需要plain_modulus
是素数。因此,您可能希望它是素数,除了一些玩具示例。