gpt4 book ai didi

c++ - 使用 S.E.A.L. 对产品进行添加。图书馆

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:03 26 4
gpt4 key购买 nike

我正在尝试执行以下形式的运算:(A * B) + C。乘法工作正常,因为此时所有数字都具有相同的比例,但 A * B 的乘积有与 C 不同的比例。乘法会改变比例是有道理的,但我想知道是否有一种方法可以使用 SEAL 库执行这样的操作。

环境信息:

  1. 语言:C++
  2. 加密方案:CKKS
  3. 小型编码 double (例如 0.4531)
  4. 用于编码的比例:pow(2.0, 60) 就像这个例子

在此先感谢您,如果需要更多信息,请告诉我。

最佳答案

有多种方法可以让它发挥作用。例如,假设密文 A、B、C 都具有相同的标度 Z。那么 A * B 的标度为 Z^2。在这一点上,除非您有充分的理由不这样做,否则您还应该重新线性化 A * B。

要计算 A * B + C,您可以例如:

  • 用比例 Z^2 重新编码 C(如果你有明文)并改用它;
  • 使用multiply_plain将 C 与标量 1.0 明文相乘,比例为 Z 以将比例增加到 Z^2 但保持值不变(为此 CKKSEncoder::encode 有一个重载);
  • 首先重新缩放 A * B,使其具有缩放 Z^2/q_k,其中 q_k 是 coeff_modulus 中的最后一个素数。 .现在,您可以将 C 重新编码为精确缩放 Z^2/q_k(如果您有明文),或者将 C 与标量 1.0 明文相乘,如上所述将缩放精确更改为 Z^2/q_k;
  • 如果 Z 接近 q_k 使得 Z^2/q_k ~ Z,那么在重新缩放之后你可能只能使用 double &Ciphertext::scale()将 A * B 的比例精确设置为 C.scale()以小的乘法误差 ~ Z/q_k 为代价。例如,对于 A、B、C,您可以使用 static_cast<double>(parms.coeff_modulus().back()) 而不是缩放 2^60 .然后 Z^2/q_k = Z(准确)并且加法立即生效,无需任何比例切换。当然,在第二次乘法+重新缩放后,这不再有效,因为倒数第二个素数不再等于 Z(coeff_modulus 中的所有素数必须不同)。

关于c++ - 使用 S.E.A.L. 对产品进行添加。图书馆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53935770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com