seal - 选择合适的plaintext_modulus
问题描述
在选择诸如 等参数时plaintext_modulus
,有什么好的策略吗?(除了猜测和检查,直到输出看起来正确)
特别是,我正在尝试IntegerEncoder
使用 BFV。我(可能是错误的)理解是,plaintext_modulus
不是被编码整数的模数,而是多项式表示中每个系数的模数。
当 B=2 时,这些系数看起来只是 0 或 1。但是,在应用了加法和乘法之类的操作之后,显然情况不再如此。有没有一种好的方法来确定系数的良好界限,以便挑选plaintext_modulus
?
解决方案
我(可能是错误的)理解是 plaintext_modulus 不是被编码整数的模数,而是多项式表示中每个系数的模数。
这是使用时的正确思维方式IntegerEncoder
。但是请注意,当使用BatchEncoder
( PolyCRTBuilder
in SEAL 2.*) 时,情况正好相反:明文向量中的每个槽都是一个整数模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| <= min{#(non_zero_coeffs(p)), #(non_zero_coeffs(q))} * |p||q|。
Costache等人IntegerEncoder
在https://eprint.iacr.org/2016/250中对类编码器中的系数增长进行了更深入的分析。,你可能想看看。
推荐阅读
- json - 在 Google 社区连接器中加入三个 api 端点
- c - 如何使用 libAV 库(ffmpeg)将 H264 编码数据放入 .mp4 等容器中?
- javascript - 我正在寻找一种简单的方法来删除重复的对象数组
- mongodb - 在 docker 上添加 MongoDB Sink 连接器?
- azure-cosmosdb - 在 Azure CosmosDb PatchItemAsync 中获取“指定的输入之一无效”
- javascript - 如何使标题出现在css中div框的顶部
- python - 搜索时使用 pytube 进行线程化
- mod-rewrite - AEM:资产的 URL 缩短
- javascript - 将书签存储在 chrome 根文件夹之外?
- amazon-web-services - AWS Sam delpoy 失败