90 #ifndef LBCRYPTO_MATH_DISCRETEGAUSSIANGENERATORGENERIC_H_ 91 #define LBCRYPTO_MATH_DISCRETEGAUSSIANGENERATORGENERIC_H_ 100 #include "math/backend.h" 101 #include "math/distributiongenerator.h" 102 #include "math/nbtheory.h" 106 enum BaseSamplerType { KNUTH_YAO = 0, PEIKERT = 1 };
108 class DiscreteGaussianGeneratorGeneric;
110 class SamplerCombiner;
125 if (counter % 31 == 0) {
126 sequence = (PseudoRandomNumberGenerator::GetPRNG())();
127 sequence = sequence << 1;
130 short bit = (sequence >> (31 - counter)) & 1;
137 uint32_t sequence = 0;
155 BaseSamplerType bType);
161 virtual int64_t GenerateInteger();
174 short RandomBit() {
return bg->Generate(); }
198 BaseSamplerType b_type;
202 std::vector<std::vector<short>> DDGTree;
210 std::vector<uint32_t> hammingWeights;
214 int32_t b_matrixSize;
219 int32_t firstNonZero;
223 std::vector<double> m_vals;
230 usint FindInVector(
const std::vector<double>& S,
double search)
const;
235 void GenerateDDGTree(
const std::vector<uint64_t>& probMatrix);
241 void Initialize(
double mean);
250 void GenerateProbMatrix(
double stddev,
double mean);
255 int64_t GenerateIntegerKnuthYao();
259 int64_t GenerateIntegerPeikert()
const;
275 : sampler1(s1), sampler2(s1), x1(z1), x2(z2) {}
281 return x1 * sampler1->GenerateInteger() + x2 * sampler2->GenerateInteger();
310 const int b,
double N);
319 int64_t GenerateInteger(
double mean,
double std);
320 int64_t GenerateInteger() {
return base_samplers[0]->GenerateInteger(); }
331 int64_t flipAndRound(
double center);
336 int64_t SampleC(int64_t center);
341 long double wide_variance, sampler_variance;
351 short extractBit(int64_t number,
int n) {
return (number >> n) & 1; }
355 #endif // LBCRYPTO_MATH_DISCRETEGAUSSIANGENERATORGENERIC_H_ Definition: discretegaussiangeneratorgeneric.h:144
Definition: discretegaussiangeneratorgeneric.h:117
Definition: stl_allocator.h:124
~SamplerCombiner()
Destructor.
Definition: discretegaussiangeneratorgeneric.h:286
Abstract class describing generator requirements.
Definition: distributiongenerator.h:188
The class for Generic Discrete Gaussion Distribution generator.
Definition: discretegaussiangeneratorgeneric.h:298
SamplerCombiner(BaseSampler *s1, BaseSampler *s2, int64_t z1, int64_t z2)
Constructor.
Definition: discretegaussiangeneratorgeneric.h:274
Definition: discretegaussiangeneratorgeneric.h:265
int64_t GenerateInteger()
Return the combined value for two samplers with given coefficients.
Definition: discretegaussiangeneratorgeneric.h:280
Definition: binfhecontext.h:36