31#ifndef BERTINI_RANDOM_HPP
32#define BERTINI_RANDOM_HPP
38#include <boost/random.hpp>
46 template <
unsigned long digits = 50>
50 using namespace boost::random;
52 static uniform_int_distribution<mpz_int> ui(-(mpz_int(1) << digits*1000L/301L), mpz_int(1) << digits*1000L/301L);
60 template <
unsigned long digits = 50>
63 using namespace boost::random;
65 static uniform_int_distribution<mpz_int> ui(-(mpz_int(1) << digits*1000L/301L), mpz_int(1) << digits*1000L/301L);
66 return mpq_rational(ui(mt),ui(mt));
75 template <
unsigned int length_in_digits>
79 using namespace boost::multiprecision;
80 using namespace boost::random;
82 static uniform_real_distribution<number<mpfr_float_backend<length_in_digits>, et_on> > distribution(0,1);
83 static independent_bits_engine<mt19937, length_in_digits*1000L/301L, mpz_int> bit_generator;
85 mpfr_float a{distribution(bit_generator)};
95 template <
unsigned int length_in_digits>
109 template <
unsigned int length_in_digits>
110 mpfr_float
RandomMp(
const mpfr_float & left,
const mpfr_float & right)
120 mpfr_float RandomMp();
127 mpfr_float RandomMp(
unsigned num_digits);
132 mpfr_float RandomMp(
const mpfr_float & a,
const mpfr_float & b);
137 mpfr_float RandomMp(
const mpfr_float & a,
const mpfr_float & b,
unsigned num_digits);
144 void RandomMpAssign(mpfr_float & a,
unsigned num_digits);
156namespace multiprecision{
159using complex = bertini::mpfr_complex;
170 auto cached = DefaultPrecision();
171 DefaultPrecision(num_digits);
172 complex temp(
RandomMp(mpfr_float(-1),mpfr_float(1),num_digits));
174 DefaultPrecision(cached);
182 return complex(
RandomMp(mpfr_float(-1),mpfr_float(1)));
190 auto cached = DefaultPrecision();
191 DefaultPrecision(num_digits);
192 auto result = complex(
RandomMp(mpfr_float(-1),mpfr_float(1),num_digits));
193 DefaultPrecision(cached);
208 return complex(
RandomMp(mpfr_float(-1),mpfr_float(1)),
RandomMp(mpfr_float(-1),mpfr_float(1)) );
217 complex returnme(
RandomMp(mpfr_float(-1),mpfr_float(1)),
RandomMp(mpfr_float(-1),mpfr_float(1)) );
218 return returnme / sqrt( abs(returnme));
221 inline complex RandomUnit()
227 void rand_assign(complex & a,
unsigned num_digits)
229 auto cached = DefaultPrecision();
230 DefaultPrecision(num_digits);
232 mpfr_complex temp( RandomMp(num_digits), RandomMp(num_digits) );
234 DefaultPrecision(cached);
238 void RandomComplexAssign(complex & a,
unsigned num_digits)
240 rand_assign(a,num_digits);
244 complex RandomComplex(
unsigned num_digits)
247 RandomComplexAssign(z, num_digits);
252 void RandomUnitAssign(complex & a,
unsigned num_digits)
254 auto cached = DefaultPrecision();
255 DefaultPrecision(num_digits);
256 a.precision(num_digits);
259 a = std::move(temp/sqrt(abs(temp)));
260 DefaultPrecision(cached);
264 complex RandomUnit(
unsigned num_digits)
267 RandomUnitAssign(a,num_digits);
The main multiprecision complex number type. This is essentially boost::multiprecision' complex.
mpz_int RandomInt()
Definition random.hpp:48
complex rand_unit()
Definition random.hpp:215
mpfr_float RandomMp()
Definition random.hpp:76
complex RandomReal()
Definition random.hpp:180
void RandomRealAssign(complex &a, unsigned num_digits)
Definition random.hpp:168
complex rand()
Definition random.hpp:206
mpq_rational RandomRat()
Definition random.hpp:61
void RandomMpAssign(mpfr_float &a)
Definition random.hpp:96