使用 S.E.A.L 对产品执行添加。图书馆

Perform Addition on a Product using the S.E.A.L. Library

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

环境信息:

  1. 语言:C++
  2. 加密方案:CKKS
  3. 小型编码双打(例如 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。例如,您可以使用 static_cast<double>(parms.coeff_modulus().back()),而不是 A、B、C 的比例 2^60。然后 Z^2/q_k = Z(准确)并且加法立即生效,无需任何比例切换。当然,在第二次乘法+重新缩放后,这不再有效,因为倒数第二个素数不再等于 Z(coeff_modulus 中的所有素数必须不同)。