The last tower in CKKS after a multiplication

I am sorry yesterday I posted this but accidentally deleted it

While exploring CKKS moduli and reading this paper: https://eprint.iacr.org/2020/1118.pdf, I tried something that I may need some confirmation:

I did Plaintext-Ciphertext multiplication two times with different inputs, and the plaintext was encoded right before the multiplication (both have the same level). After the first multiplication, I tried zero-ing the last tower of the plaintext. Surprisingly, the decryption went well even after the next multiplications, and the result is correct. My steps look like this:

p_1 = cc->MakeCKKSPackedPlaintext(x1, 1, c->GetLevel());
c = cc->EvalMult(c, p_1);
p_2 = cc->MakeCKKSPackedPlaintext(x2, 1, c->GetLevel()); 
zeroingLastTower(p_2);
c = cc->EvalMult(c, p_2);
// decryption

After zero-ing the tower I checked that the tower is now only zeros. In addition, I found that:

  • I can’t do that (the zero-ing with no issue) after the second multiplication or before the first multiplication
  • I am only able to zero-ing the Plaintext, not the Ciphertext

I believe this phenomenon is related to the paper. I guess “the noise” from this zero-ing is absorbed by the large \Delta' used initially, but I still don’t understand this behavior. I hope someone can help me to understand this. Thank you!

If you worked with one of the *AUTO scaling modes of CKKS, then rescaling there is done right before the next multiplication. In other words, the scaling factor was still at \Delta^2, or \Delta' \Delta, (hence still keeping one extra tower). The GetLevel method reads the number of towers. For instance, what you did should not work if you use FIXEDMANUAL and explicitly call Rescale after the previous multiplication. Basically, this behavior is related to lazy rescaling described in the paper.