void gen_params()

in pir.cpp [35:77]


void gen_params(uint64_t ele_num, uint64_t ele_size, uint32_t N, uint32_t logt,
                uint32_t d, EncryptionParameters &params,
                PirParams &pir_params) {
    
    // Determine the maximum size of each dimension

    // plain modulus = a power of 2 plus 1
    uint64_t plain_mod = (static_cast<uint64_t>(1) << logt) + 1;
    uint64_t plaintext_num = plaintexts_per_db(logt, N, ele_num, ele_size);

#ifdef DEBUG
    cout << "log(plain mod) before expand = " << logt << endl;
    cout << "number of FV plaintexts = " << plaintext_num << endl;
#endif

    vector<SmallModulus> coeff_mod_array;
    uint32_t logq = 0;

    for (uint32_t i = 0; i < 1; i++) {
        coeff_mod_array.emplace_back(SmallModulus());
        coeff_mod_array[i] = DefaultParams::small_mods_60bit(i);
        logq += coeff_mod_array[i].bit_count();
    }

    params.set_poly_modulus_degree(N);
    params.set_coeff_modulus(coeff_mod_array);
    params.set_plain_modulus(plain_mod);

    vector<uint64_t> nvec = get_dimensions(plaintext_num, d);

    uint32_t expansion_ratio = 0;
    for (uint32_t i = 0; i < params.coeff_modulus().size(); ++i) {
        double logqi = log2(params.coeff_modulus()[i].value());
        cout << "PIR: logqi = " << logqi << endl; 
        expansion_ratio += ceil(logqi / logt);
    }

    pir_params.d = d;
    pir_params.dbc = 6;
    pir_params.n = plaintext_num;
    pir_params.nvec = nvec;
    pir_params.expansion_ratio = expansion_ratio << 1; // because one ciphertext = two polys
}