in pir_client.cpp [210:247]
void PIRClient::compute_inverse_scales(){
if (indices_.size() != pir_params_.nvec.size()){
throw invalid_argument("size mismatch");
}
int logt = floor(log2(params_.plain_modulus().value()));
uint64_t N = params_.poly_modulus_degree();
uint64_t t = params_.plain_modulus().value();
int logN = log2(N);
int logm = logN;
inverse_scales_.clear();
for(int i = 0; i < pir_params_.nvec.size(); i++){
uint64_t index_modN = indices_[i] % N;
uint64_t numCtxt = ceil ( (pir_params_.nvec[i] + 0.0) / N); // number of query ciphertexts.
uint64_t batchId = indices_[i] / N;
if (batchId == numCtxt - 1) {
cout << "Client: adjusting the logm value..." << endl;
logm = ceil(log2((pir_params_.nvec[i] % N)));
}
uint64_t inverse_scale;
int quo = logm / logt;
int mod = logm % logt;
inverse_scale = pow(2, logt - mod);
if ((quo +1) %2 != 0){
inverse_scale = params_.plain_modulus().value() - pow(2, logt - mod);
}
inverse_scales_.push_back(inverse_scale);
if ( (inverse_scale << logm) % t != 1){
throw logic_error("something wrong");
}
cout << "Client: logm, inverse scale, t = " << logm << ", " << inverse_scale << ", " << t << endl;
}
}