void PIRClient::compute_inverse_scales()

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; 
    }
}