In ckksrns-fhe.cpp line 477, the following function is called in FHECKKSRNS::EvalBootstrap:
AdjustCiphertext(raised, correction);
where the correction factor is calculated using the plaintext modulus, ciphertext modulus, and m_correctionFactor. To my understanding, this Adjust Ciphertext code is specific to use inside FHECKKSRNS::EvalBootstrap. FHECKKSRNS::AdjustCiphertext has the following lines (2117-2024 in ckksrns-fhe.cpp):
// Scaling down the message by a correction factor to emulate using a larger q0.
// This step is needed so we could use a scaling factor of up to 2^59 with q9 ~= 2^60.
double adjustmentFactor = (targetSF / sourceSF) * (modToDrop / sourceSF) * std::pow(2, -correction);
cc->EvalMultInPlace(ciphertext, adjustmentFactor);
My question is, when an actually small ciphertext modulus size is used (in my case, I set Scaling mod size to 20 for experimenting), this step may result in a ciphertext of zeros, when the correction factor becomes large and makes the adjustmentFactor small. Changing the plaintext modulus size did not help. What should I do in this case? Is using such small ciphertext modulus size is always prohibited?
Thank you so much in advance.