A)我无法理解这些设置之间的关系:
parms.set_poly_modulus("1x^2048 + 1");
parms.set_coeff_modulus(coeff_modulus_128(2048));
parms.set_plain_modulus(1 << 8);
和SEAL manual中的该表。
我对数字54以及对parms.set_poly_modulus("1x^2048 + 1")
和parms.set_coeff_modulus(coeff_modulus_128(2048))
的数字特别感兴趣。
B)我正在尝试为我的用例找到正确的参数。
假设我在-180和+180之间有10000个小数,并且我想使用FractionalEncoder
对这些数字进行编码。预先执行的操作将是:减,加,乘,平方和求幂。结果将保存在单独的Ciphertext
变量中。
因此,就我的用例而言,什么是最佳参数:
n, q, t
in
parms.set_poly_modulus("1x^n + 1");
parms.set_coeff_modulus(coeff_modulus_128(q));
parms.set_plain_modulus(t);
a
中的 b
和seal::FractionalEncoder encoder(context.plain_modulus(), context.poly_modulus(), a, b, 2)
。我正在使用 a = 512 和 b = 128 ,对于我的用例来说,这太高了。
如果用例发生变化,如何自己计算这些参数?
答案 0 :(得分:1)
A)在您的示例中,您使用的是尺寸为2048的多项式模数,并且系数模数使用128位安全级别的默认值。要确切了解该值是什么,请查看SEAL/seal/util/globals.cpp
。系数模量是SmallModulus
个对象的向量,它们是表示 total 系数模量的最多60位因子的正整数。例如,对于您的参数,系数模量仅包含一个单一的质数因子0x3fffffff000001
,但是您会看到,对于较大的参数,它可以具有更多的因子。
安全级别取决于多项式模数的程度(越大,安全性越高)和 total 系数模数的位长(越小,意味着高安全性)。因此,对于固定的多项式模数,应该有最大的可接受系数模数,以提供固定的安全级别。由于不容易知道系数模数的上限是多少,因此SEAL可以方便地通过coeff_modulus_128
(以及coeff_modulus_192
和coeff_modulus_256
作为默认值,以默认值的形式提供更高的安全性) )。在某些情况下,您可能希望使用比默认值小的系数模数,但是除非您真的知道自己在做什么(否则也许甚至没有),否则永远不要使用更大的系数模数。使用Martin Albrecht的LWE估算器 https://bitbucket.org/malb/lwe-estimator获得54位的位长。
B)在这种情况下确定参数的典型工作流程是首先找出足够大的plain_modulus
,以使计算正确。如果您的噪声预算用尽了,只需调整coeff_modulus
直至其可用。
一旦找到足够大的plain_modulus
,请尝试通过将coeff_modulus
设置为最小值来优化噪声,使您的噪声预算不为零。为简单起见,您可以尝试通过coeff_modulus_128
获得的不同默认值。如果您真的很在意性能,则可能需要手动选择coeff_modulus
质数才能真正找到可行的最小值。
下一步,选择poly_modulus
足够大,以使您的总系数模量最多等于该poly_modulus
度的默认值。
最后,您可能需要手动调整在线性化过程中使用的decomposition_bit_count
。默认情况下,您应该使用值60,这会带来更好的计算性能,但会增加噪声。在某些情况下,您可能希望将此设置为如图30所示,如果您碰巧节省了一些额外的噪声预算,则可以切换到较小的加密参数。在大多数情况下,此级别的微调是不必要的。
最终得到的最佳参数到底是什么完全取决于您的计算,因此,如果没有非常具体的细节,就不可能在这里给出直接答案。
FractionalEncoder
的参数化是另一回事。我建议尝试使用不同的值,以了解这些选择如何影响准确性。选择a = 512,b = 128有什么问题?