As per your suggestion i added this code in core library so i can change the modulus from higher to lower
std::vector<std::shared_ptr<LWECiphertextImpl>> SWITCHCKKSRNS::EvalFHEWChangeModulus(
std::vector<lbcrypto::LWECiphertext> LWEciphertexts, uint32_t fromModulus, uint32_t toModulus,uint32_t numCtxts) {
NativeInteger native_fromModulus(fromModulus);
NativeInteger native_toModulus(toModulus);
uint32_t n = m_ccLWE.GetParams()->GetLWEParams()->Getn(); // lattice parameter for additive LWE
#pragma omp parallel for
for (uint32_t i = 0; i < numCtxts; i++) {
auto original_a = LWEciphertexts[i]->GetA();
auto original_b = LWEciphertexts[i]->GetB();
// multiply by Q_LWE/Q' and round to Q_LWE
NativeVector a_round(n, toModulus);
for (uint32_t j = 0; j < n; ++j) {
a_round[j] = RoundqQAlter(original_a[j], native_toModulus, native_fromModulus);
}
NativeInteger b_round = RoundqQAlter(original_b, native_toModulus, native_fromModulus);
LWEciphertexts[i] = std::make_shared<LWECiphertextImpl>(std::move(a_round), std::move(b_round));
}
return LWEciphertexts;
}
i added this in python wrapper
.def("EvalFHEWChangeModulus", &CryptoContextImpl<DCRTPoly>::EvalFHEWChangeModulus,
cc_EvalCKKStoFHEW_docs,
py::arg("LWEciphertexts"),
py::arg("fromModulus"),
py::arg("toModulus"),
py::arg("numCtxts") = 0)
I was able to execute
cTemp1_new = cc.EvalFHEWChangeModulus(cTemp1,cTemp1[0].GetModulus(),LWESign[0].GetModulus(),len(cTemp1))
e_a1_result = [
ccLWE.EvalBinGate(AND, cTemp1_new[i], LWESign[i]) for i in range(len(cTemp1))
]
I am not getting any errors
But i am getting incorrect outputs.
can someone please help me with this