1

假设我计算了 2的加法乘法Ciphertexts,并将结果放入第三个。如果我想对我的结果Ciphertext(目标Chipertext)执行额外的数学运算,是否建议evaluator.relinearize()在这样做之前使用它?因为如果我理解正确,某些操作Ciphertext会导致结果Ciphertext大小大于 2。如果是,那么这将是重新线性化的好方法Ciphertext吗?

  • EvaluationKeys ev_keys;
  • int size = result.size();
  • keygen.generate_evaluation_keys(size - 2, ev_keys); // We need size - 2 ev_keys for performing this relinearization.
  • evaluator.relinearize(result, ev_keys);
4

1 回答 1

1

只会Evaluator::multiply增加密文的大小。每个密文的大小至少为 2(新加密的大小为 2),大小 a 和 b 密文的乘积产生大小为 a+b-1 的密文。因此,将两个大小为 2 的密文相乘,您最终会得到大小为 3 的密文。在几乎所有情况下,您都希望此时重新线性化以将大小降低到 2,因为对大小为 3 密文的进一步操作可以计算成本要高得多。

此规则有一些例外:假设您要计算许多产品的总和。在这种情况下,您可能只想重新线性化最终总和而不是单个被加数,因为计算大小为 3 密文的总和仍然非常快。

为了使重新线性化成为可能,生成密钥的一方还需要生成评估密钥,如下所示:

EvaluationKeys ev_keys;
keygen.generate_evaluation_keys(60, ev_keys);

稍后评估方可以将这些用作:

evaluator.relinearize(result, ev_keys);

这里我使用 60 作为decomposition_bit_countin generate_evaluation_keys,这是最快的也是最常见的选择。您可能永远不应该int countgenerate_evaluation_keys. 这适用于您让密文的大小超过 3 并且需要将它们从例如大小 4 或 5 减小到 2 的用例。

于 2018-09-03T19:31:15.757 回答