1

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

环境信息:

  1. 语言:C++
  2. 加密方案:CKKS
  3. 小型编码双精度数(例如 0.4531)
  4. 用于编码的比例: pow(2.0, 60) 如示例

提前感谢您,如果需要更多信息,请告诉我。

4

1 回答 1

1

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

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

  • 使用比例 Z^2 重新编码 C(如果你有明文)并改用它;
  • 用于multiply_plain将 C 与标量 Z 的标量 1.0 明文相乘以将比例增加到 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()). 然后 Z^2/q_k = Z(精确),加法立即生效,无需任何比例切换。当然,在第二次乘法+重新缩放之后,这不再那么有效了,因为倒数第二个素数不再等于 Z(所有素数都coeff_modulus必须是不同的)。
于 2018-12-27T09:44:25.430 回答