2
0
mirror of https://github.com/boostorg/random.git synced 2026-01-19 04:22:17 +00:00

Merge branch 'develop'

This commit is contained in:
Steven Watanabe
2018-06-25 16:30:58 -06:00
18 changed files with 7638 additions and 13 deletions

View File

@@ -27,6 +27,7 @@ doxygen_files =
discrete_distribution
exponential_distribution
extreme_value_distribution
faure
fisher_f_distribution
gamma_distribution
generate_canonical
@@ -41,6 +42,7 @@ doxygen_files =
lognormal_distribution
mersenne_twister
negative_binomial_distribution
niederreiter_base2
non_central_chi_squared_distribution
normal_distribution
piecewise_constant_distribution
@@ -52,6 +54,7 @@ doxygen_files =
seed_seq
shuffle_order
# shuffle_output
sobol
student_t_distribution
subtract_with_carry
taus88
@@ -93,6 +96,7 @@ doxygen reference :
boost=\"$(BOOST_ROOT)\" \\
random_distribution=\"@xmlonly <link linkend=\\\"boost_random.reference.concepts.random_distribution\\\">random distribution</link> @endxmlonly\" \\
pseudo_random_number_generator=\"@xmlonly <link linkend=\\\"boost_random.reference.concepts.pseudo_random_number_generator\\\">pseudo-random number generator</link> @endxmlonly\" \\
quasi_random_number_generator=\"@xmlonly <link linkend=\\\"boost_random.reference.concepts.quasi_random_number_generator\\\">quasi-random number generator</link> @endxmlonly\" \\
uniform_random_number_generator=\"@xmlonly <link linkend=\\\"boost_random.reference.concepts.uniform_random_number_generator\\\">uniform random number generator</link> @endxmlonly\" \\
nondeterministic_random_number_generator=\"@xmlonly <link linkend=\\\"boost_random.reference.concepts.non_deterministic_uniform_random_number_generator\\\">non-deterministic random number generator</link> @endxmlonly\" \\
generators=\"@xmlonly <link linkend=\\\"boost_random.reference.generators\\\">generators</link> @endxmlonly\" \\
@@ -107,6 +111,9 @@ doxygen reference :
rand48=\"@xmlonly <classname alt=\\\"boost::random::rand48\\\">rand48</classname> @endxmlonly\" \\
mt11213b=\"@xmlonly <classname alt=\\\"boost::random::mt11213b\\\">mt11213b</classname> @endxmlonly\" \\
mt19937=\"@xmlonly <classname alt=\\\"boost::random::mt19937\\\">mt19937</classname> @endxmlonly\" \\
niederreiter_base2_engine=\"@xmlonly <classname alt=\\\"boost::random::niederreiter_base2_engine\\\">niederreiter_base2_engine</classname> @endxmlonly\" \\
sobol_engine=\"@xmlonly <classname alt=\\\"boost::random::sobol_engine\\\">sobol_engine</classname> @endxmlonly\" \\
faure_engine=\"@xmlonly <classname alt=\\\"boost::random::faure_engine\\\">faure_engine</classname> @endxmlonly\" \\
ecuyer1988=\"@xmlonly <classname alt=\\\"boost::random::ecuyer1988\\\">ecuyer1988</classname> @endxmlonly\" \\
lagged_fibonacci607=\"@xmlonly <classname alt=\\\"boost::random::lagged_fibonacci607\\\">lagged_fibonacci607</classname> @endxmlonly\" \\
lagged_fibonacci44497=\"@xmlonly <classname alt=\\\"boost::random::lagged_fibonacci44497\\\">lagged_fibonacci44497</classname> @endxmlonly\" \\
@@ -127,6 +134,7 @@ doxygen reference :
\"BOOST_PREVENT_MACRO_SUBSTITUTION=\" \\
\"BOOST_STATIC_ASSERT(x)=\" \\
\"BOOST_STATIC_CONSTANT(type,value)=static const type value\" \\
\"BOOST_CONSTEXPR=constexpr\" \\
\"UINT64_C(value)=value ## ull\" \\
\"BOOST_RANDOM_DECL=\" \\
\"RealType(x)=x\" \\

View File

@@ -10,26 +10,26 @@
Random numbers are required in a number of different problem domains, such as
* numerics (simulation, Monte-Carlo integration)
* games (non-deterministic enemy behavior)
* security (key generation)
* testing (random coverage in white-box tests)
* numerics (simulation, Monte-Carlo integration)
* games (non-deterministic enemy behavior)
* security (key generation)
* testing (random coverage in white-box tests)
The Boost Random Number Generator Library provides a framework for random
number generators with well-defined properties so that the generators can be
used in the demanding numerics and security domains. For a general
introduction to random numbers in numerics, see
introduction to random numbers in numerics, see
[:"Numerical Recipes in C: The art of scientific computing", William H. Press,
Saul A. Teukolsky, William A. Vetterling, Brian P. Flannery, 2nd ed., 1992,
pp. 274-328]
Depending on the requirements of the problem domain, different variations of
random number generators are appropriate:
* non-deterministic random number generator
* pseudo-random number generator
* quasi-random number generator
Depending on the requirements of the problem domain, different variations of
random number generators are appropriate:
* non-deterministic random number generator
* pseudo-random number generator
* quasi-random number generator
All variations have some properties in common, the concepts (in the STL
sense) is called __UniformRandomNumberGenerator. This
@@ -38,8 +38,8 @@ concept will be defined in a subsequent section.
The goals for this library are the following:
* allow easy integration of third-party random-number generators
* provide easy-to-use front-end classes which model popular distributions
* provide maximum efficiency
* provide easy-to-use front-end classes which model popular distributions
* provide maximum efficiency
[endsect]
@@ -199,6 +199,76 @@ the generator, for example to re-run a test suite at a later time.]
[endsect]
[section Quasi-Random Number Generator]
A quasi-random number generator is a __UniformRandomNumberGenerator which
provides a deterministic sequence of quasi-random numbers, based on some
algorithm and internal state. [classref boost::random::niederreiter_base2_engine
Niederreiter base 2] generator is an example of such a [qrng quasi-random
number generator]. The "quasi" modifier is used to denote more clearly that the
values produced by such a generator are neither random nor pseudo-random, but
they form a low discrepancy sequence. The intuitive idea is that a low discrepancy
sequence is more evenly distributed than a pseudo random sequence would be.
For example, if we generate a low discrepancy sequence of 2D points on a square,
this square would be covered more evenly, and the number of points falling to any
part of the square would be proportional to the number of points in the whole square.
Such sequences share some properties of random variables and in certain applications
such as the quasi-Monte Carlo method their lower discrepancy is an important advantage.
[note The quasi-Monte Carlo method uses a low-discrepancy sequence such as the
Niederreiter base 2 sequence, the Sobol sequence, or the Faure sequence among the others.
The advantage of using low-discrepancy sequences is a probabilistically faster rate of
convergence. Quasi-Monte Carlo has a rate of convergence O(log(N)[sup s]/N),
whereas the rate of convergence for the Monte Carlo method, which uses a pseudo-random sequence,
is O(N[sup -0.5]).]
Harold Niederreiter gives an extensive overview on random number generation
and quasi-Monte Carlo methods in his book "Random number generation and
quasi-Monte Carlo methods, Society for Industrial and Applied Mathematics, 1992".
In addition to the __UniformRandomNumberGenerator requirements,
a quasi-random number generator has some additional requirements. In the
following table, `X` denotes a quasi-random number generator class, `u` is a value of `X`,
`v` is a const value of `X`, and `j` a value of type `unsigned long long`.
[table QuasiRandomNumberGenerator requirements
[[expression] [return type] [pre/post-condition]]
[[`X(s)`] [-] [creates an `s`-dimensional generator with a default seed. Dimension `s` is an integer no less than 1.]]
[[`v.dimension()`] [std::size_t] [the dimension of quasi-random domain.]]
[[`u.seed(i)`] [`void`] [seeds the generator with the integer `i`.]]
[[`u.discard(j)`] [`void`] [Advances the generator by `j` steps as if by
`j` calls to `u()`.]]
]
[note The `operator()` returns a successive element of an `s`-dimensional (`s` = `v.dimension()`) vector
at each invocation. When all elements are exhausted, `operator()` begins anew with the starting
element of a subsequent `s`-dimensional vector.]
Classes which model a quasi-random number generator shall also model
__EqualityComparable, i.e. implement `operator==`. Two quasi-random number
generators are defined to be /equivalent/ if they both return an identical
sequence of numbers starting from a given state.
Classes which model a quasi-random number generator shall also model the
__Streamable concept, i.e. implement `operator<<` and `operator>>`.
`operator<<` writes all current state of the quasi-random number generator
to the given `ostream` so that `operator>>` can restore the state at a later
time. The state shall be written in a platform-independent manner, but it is
assumed that the `locales` used for writing and reading be the same. The
quasi-random number generator with the restored state and the original at
the just-written state shall be equivalent.
Classes which model a quasi-random number generator should also model the
__CopyConstructible and __Assignable concepts. However, note that the
sequences of the original and the copy are strongly correlated (in fact,
they are identical), which may make them unsuitable for some problem domains.
Thus, copying quasi-random number generators is discouraged; they should
always be passed by (non-const) reference.
The classes __niederreiter_base2, __sobol, __faure are models for a quasi-random number generator.
[endsect]
[section Seed Sequence]
A SeedSeq represents a sequence of values that can be used to

View File

@@ -13,6 +13,7 @@
[template sup[text]'''<superscript>'''[text]'''</superscript>''']
[template prng[text] [link boost_random.reference.concepts.pseudo_random_number_generator [text]]]
[template qrng[text] [link boost_random.reference.concepts.quasi_random_number_generator [text]]]
[template concepts[text] [link boost_random.reference.concepts [text]]]
[template generators[text] [link boost_random.reference.generators [text]]]
[template distributions[text] [link boost_random.reference.distributions [text]]]
@@ -20,6 +21,7 @@
[def __NumberGenerator [link boost_random.reference.concepts.number_generator NumberGenerator]]
[def __UniformRandomNumberGenerator [link boost_random.reference.concepts.uniform_random_number_generator UniformRandomNumberGenerator]]
[def __PseudoRandomNumberGenerator [link boost_random.reference.concepts.pseudo_random_number_generator PseudoRandomNumberGenerator]]
[def __QuasiRandomNumberGenerator [link boost_random.reference.concepts.quasi_random_number_generator QuasiRandomNumberGenerator]]
[def __SeedSeq [link boost_random.reference.concepts.seed_sequence SeedSeq]]
[def __CopyConstructible [@boost:/doc/html/CopyConstructible.html CopyConstructible]]
@@ -64,6 +66,9 @@
[def __ranlux64_4_01 [classref boost::random::ranlux64_4_01 ranlux64_4_01]]
[def __ranlux24 [classref boost::random::ranlux24 ranlux24]]
[def __ranlux48 [classref boost::random::ranlux48 ranlux48]]
[def __niederreiter_base2 [classref boost::random::niederreiter_base2 niederreiter_base2]]
[def __sobol [classref boost::random::sobol sobol]]
[def __faure [classref boost::random::faure faure]]
[def __uniform_smallint [classref boost::random::uniform_smallint uniform_smallint]]
[def __uniform_int_distribution [classref boost::random::uniform_int_distribution uniform_int_distribution]]

View File

@@ -26,3 +26,10 @@
[password]
[endsect]
[section Generating quasi-random line-sphere intersections]
[import ../example/intersections.cpp]
[intersections]
[endsect]

View File

@@ -10,3 +10,4 @@
run die.cpp ;
run weighted_die.cpp ;
run password.cpp /boost//random ;
run intersections.cpp /boost//random ;

78
example/intersections.cpp Normal file
View File

@@ -0,0 +1,78 @@
// intersections.cpp
//
// Copyright (c) 2018
// Justinas V. Daugmaudis
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//[intersections
/*`
For the source of this example see
[@boost://libs/random/example/intersections.cpp intersections.cpp].
This example demonstrates generating quasi-randomly distributed chord
entry and exit points on an S[sup 2] sphere.
First we include the headers we need for __niederreiter_base2
and __uniform_01 distribution.
*/
#include <boost/random/niederreiter_base2.hpp>
#include <boost/random/uniform_01.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/tuple/tuple.hpp>
/*`
We use 4-dimensional __niederreiter_base2 as a source of randomness.
*/
boost::random::niederreiter_base2 gen(4);
int main()
{
typedef boost::tuple<double, double, double> point_t;
const std::size_t n_points = 100; // we will generate 100 points
std::vector<point_t> points;
points.reserve(n_points);
/*<< __niederreiter_base2 produces integers in the range [0, 2[sup 64]-1].
However, we want numbers in the range [0, 1). The distribution
__uniform_01 performs this transformation.
>>*/
boost::random::uniform_01<double> dist;
for (std::size_t i = 0; i != n_points; ++i)
{
/*`
Using formula from J. Rovira et al., "Point sampling with uniformly distributed lines", 2005
to compute uniformly distributed chord entry and exit points on the surface of a sphere.
*/
double cos_theta = 1 - 2 * dist(gen);
double sin_theta = std::sqrt(1 - cos_theta * cos_theta);
double phi = boost::math::constants::two_pi<double>() * dist(gen);
double sin_phi = std::sin(phi), cos_phi = std::cos(phi);
point_t point_on_sphere(sin_theta*sin_phi, cos_theta, sin_theta*cos_phi);
/*`
Here we assume that our sphere is a unit sphere at origin. If your sphere was
different then now would be the time to scale and translate the `point_on_sphere`.
*/
points.push_back(point_on_sphere);
}
/*`
Vector `points` now holds generated 3D points on a sphere.
*/
return 0;
}
//]

View File

@@ -0,0 +1,166 @@
/* boost random/detail/gray_coded_qrng.hpp header file
*
* Copyright Justinas Vygintas Daugmaudis 2010-2018
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_RANDOM_DETAIL_GRAY_CODED_QRNG_HPP
#define BOOST_RANDOM_DETAIL_GRAY_CODED_QRNG_HPP
#include <boost/random/detail/qrng_base.hpp>
#include <boost/multiprecision/integer.hpp> // lsb
#include <functional> // bit_xor
#include <boost/mpl/if.hpp>
#include <boost/integer/integer_mask.hpp>
//!\file
//!Describes the gray-coded quasi-random number generator base class template.
namespace boost {
namespace random {
namespace qrng_detail {
template<typename LatticeT>
class gray_coded_qrng
: public qrng_base<
gray_coded_qrng<LatticeT>
, LatticeT
, typename LatticeT::value_type
>
{
public:
typedef typename LatticeT::value_type result_type;
typedef result_type size_type;
private:
typedef gray_coded_qrng<LatticeT> self_t;
typedef qrng_base<self_t, LatticeT, size_type> base_t;
// The base needs to access modifying member f-ns, and we
// don't want these functions to be available for the public use
friend class qrng_base<self_t, LatticeT, size_type>;
// Respect lattice bit_count here
struct check_nothing {
inline static void bit_pos(unsigned) {}
inline static void code_size(size_type) {}
};
struct check_bit_range {
static void raise_bit_count() {
boost::throw_exception( std::range_error("gray_coded_qrng: bit_count") );
}
inline static void bit_pos(unsigned bit_pos) {
if (bit_pos >= LatticeT::bit_count)
raise_bit_count();
}
inline static void code_size(size_type code) {
if (code > (self_t::max)())
raise_bit_count();
}
};
// We only want to check whether bit pos is outside the range if given bit_count
// is narrower than the size_type, otherwise checks compile to nothing.
BOOST_STATIC_ASSERT(LatticeT::bit_count <= std::numeric_limits<size_type>::digits);
typedef typename mpl::if_c<
((LatticeT::bit_count) < std::numeric_limits<size_type>::digits)
, check_bit_range
, check_nothing
>::type check_bit_range_t;
public:
//!Returns: Tight lower bound on the set of values returned by operator().
//!
//!Throws: nothing.
static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return 0; }
//!Returns: Tight upper bound on the set of values returned by operator().
//!
//!Throws: nothing.
static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return low_bits_mask_t<LatticeT::bit_count>::sig_bits; }
explicit gray_coded_qrng(std::size_t dimension)
: base_t(dimension)
{}
// default copy c-tor is fine
// default assignment operator is fine
void seed()
{
set_zero_state();
update_quasi(0);
base_t::reset_seq(0);
}
void seed(const size_type init)
{
if (init != this->curr_seq())
{
// We don't want negative seeds.
check_seed_sign(init);
size_type seq_code = boost::next(init);
if (BOOST_UNLIKELY(!(init < seq_code)))
boost::throw_exception( std::range_error("gray_coded_qrng: seed") );
seq_code ^= (seq_code >> 1);
// Fail if we see that seq_code is outside bit range.
// We do that before we even touch engine state.
check_bit_range_t::code_size(seq_code);
set_zero_state();
for (unsigned r = 0; seq_code != 0; ++r, seq_code >>= 1)
{
if (seq_code & static_cast<size_type>(1))
update_quasi(r);
}
}
// Everything went well, set the new seq count
base_t::reset_seq(init);
}
private:
void compute_seq(size_type seq)
{
// Find the position of the least-significant zero in sequence count.
// This is the bit that changes in the Gray-code representation as
// the count is advanced.
// Xor'ing with max() has the effect of flipping all the bits in seq,
// except for the sign bit.
unsigned r = multiprecision::lsb(seq ^ (self_t::max)());
check_bit_range_t::bit_pos(r);
update_quasi(r);
}
void update_quasi(unsigned r)
{
// Calculate the next state.
std::transform(this->state_begin(), this->state_end(),
this->lattice.iter_at(r * this->dimension()), this->state_begin(),
std::bit_xor<result_type>());
}
void set_zero_state()
{
std::fill(this->state_begin(), this->state_end(), result_type /*zero*/ ());
}
};
} // namespace qrng_detail
} // namespace random
} // namespace boost
#endif // BOOST_RANDOM_DETAIL_GRAY_CODED_QRNG_HPP

View File

@@ -0,0 +1,513 @@
/* boost random/detail/nierderreiter_base2_table.hpp header file
*
* Copyright Justinas Vygintas Daugmaudis 2010-2018
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_RANDOM_DETAIL_NIEDERREITER_BASE2_TABLE_HPP
#define BOOST_RANDOM_DETAIL_NIEDERREITER_BASE2_TABLE_HPP
#include <boost/config.hpp>
namespace boost {
namespace random {
namespace detail {
namespace qrng_tables {
// Maximum allowed space dimension. This number of dimensions has been
// chosen because up to 4720th GF(2) prime the values fit to unsigned short,
// which produces a (still) reasonably small table.
#define BOOST_RANDOM_NIEDERREITER_BASE2_MAX_DIMENSION 4720
struct niederreiter_base2
{
BOOST_STATIC_CONSTANT(unsigned, max_dimension = BOOST_RANDOM_NIEDERREITER_BASE2_MAX_DIMENSION);
typedef unsigned short value_type;
// Binary irreducible polynomials (primes in the ring GF(2)[X]), evaluated at X=2.
// Mathematica code:
// Reap[
// Do[If[IrreduciblePolynomialQ[
// IntegerDigits[n, 2].x^Reverse[Range[0, Floor[Log[2, n]]]],
// Modulus -> 2], Sow[n]], {n, 2, 65535}]][[2, 1]]
static value_type polynomial(std::size_t n)
{
static const value_type nb2_a[max_dimension] = {
2, 3, 7, 11, 13, 19, 25, 31, 37, 41, 47, 55, 59, 61, 67, 73, 87, 91,
97, 103, 109, 115, 117, 131, 137, 143, 145, 157, 167, 171, 185, 191,
193, 203, 211, 213, 229, 239, 241, 247, 253, 283, 285, 299, 301, 313,
319, 333, 351, 355, 357, 361, 369, 375, 379, 391, 395, 397, 415, 419,
425, 433, 445, 451, 463, 471, 477, 487, 499, 501, 505, 515, 529, 535,
539, 545, 557, 563, 587, 601, 607, 613, 617, 623, 631, 637, 647, 661,
665, 675, 677, 687, 695, 701, 719, 721, 731, 757, 761, 769, 787, 789,
799, 803, 817, 827, 841, 847, 859, 865, 875, 877, 883, 895, 901, 911,
929, 949, 953, 967, 971, 973, 981, 985, 995, 1001, 1019, 1033, 1039,
1051, 1053, 1063, 1069, 1077, 1095, 1107, 1123, 1125, 1135, 1153,
1163, 1177, 1193, 1199, 1221, 1225, 1239, 1255, 1261, 1267, 1279,
1291, 1293, 1305, 1311, 1315, 1329, 1341, 1347, 1367, 1377, 1383,
1387, 1413, 1423, 1431, 1435, 1441, 1451, 1465, 1473, 1479, 1509,
1527, 1531, 1555, 1557, 1571, 1573, 1585, 1591, 1603, 1615, 1617,
1627, 1657, 1663, 1669, 1673, 1703, 1709, 1717, 1727, 1729, 1741,
1747, 1759, 1783, 1789, 1807, 1809, 1815, 1821, 1825, 1835, 1845,
1849, 1863, 1869, 1877, 1881, 1891, 1915, 1917, 1921, 1927, 1933,
1939, 1961, 1969, 1989, 2011, 2027, 2035, 2041, 2047, 2053, 2071,
2091, 2093, 2119, 2147, 2149, 2161, 2171, 2189, 2197, 2207, 2217,
2225, 2243, 2255, 2257, 2273, 2279, 2283, 2293, 2317, 2323, 2341,
2345, 2359, 2363, 2365, 2373, 2377, 2385, 2395, 2419, 2421, 2431,
2435, 2447, 2475, 2477, 2489, 2503, 2521, 2533, 2543, 2551, 2561,
2567, 2579, 2581, 2601, 2633, 2657, 2669, 2681, 2687, 2693, 2705,
2717, 2727, 2731, 2739, 2741, 2773, 2783, 2787, 2793, 2799, 2801,
2811, 2819, 2825, 2833, 2867, 2879, 2881, 2891, 2905, 2911, 2917,
2927, 2941, 2951, 2955, 2963, 2965, 2991, 2999, 3005, 3017, 3035,
3037, 3047, 3053, 3083, 3085, 3097, 3103, 3121, 3159, 3169, 3179,
3187, 3189, 3205, 3209, 3223, 3227, 3229, 3251, 3263, 3271, 3277,
3283, 3285, 3299, 3305, 3319, 3331, 3343, 3357, 3367, 3373, 3393,
3399, 3413, 3417, 3427, 3439, 3441, 3475, 3487, 3497, 3515, 3517,
3529, 3543, 3547, 3553, 3559, 3573, 3583, 3589, 3613, 3617, 3623,
3627, 3635, 3641, 3655, 3659, 3669, 3679, 3697, 3707, 3709, 3713,
3731, 3743, 3747, 3771, 3785, 3791, 3805, 3827, 3833, 3851, 3865,
3889, 3895, 3933, 3947, 3949, 3957, 3961, 3971, 3985, 3991, 3995,
4007, 4013, 4021, 4045, 4051, 4069, 4073, 4091, 4105, 4119, 4129,
4147, 4149, 4159, 4173, 4179, 4201, 4215, 4219, 4221, 4225, 4235,
4249, 4259, 4261, 4303, 4305, 4331, 4333, 4351, 4359, 4383, 4387,
4401, 4407, 4411, 4431, 4439, 4449, 4459, 4461, 4473, 4483, 4485,
4497, 4523, 4531, 4569, 4575, 4579, 4591, 4593, 4609, 4621, 4627,
4633, 4645, 4663, 4667, 4669, 4675, 4677, 4711, 4717, 4723, 4735,
4789, 4793, 4801, 4811, 4873, 4879, 4891, 4893, 4897, 4915, 4921,
4927, 4941, 4965, 4977, 5017, 5023, 5027, 5033, 5039, 5051, 5059,
5073, 5079, 5085, 5107, 5109, 5127, 5139, 5169, 5175, 5193, 5199,
5211, 5213, 5223, 5227, 5237, 5247, 5257, 5281, 5287, 5293, 5301,
5325, 5331, 5337, 5343, 5349, 5391, 5405, 5451, 5453, 5505, 5523,
5541, 5545, 5563, 5573, 5591, 5597, 5611, 5625, 5635, 5641, 5659,
5695, 5697, 5703, 5707, 5717, 5721, 5731, 5733, 5743, 5779, 5797,
5821, 5827, 5833, 5841, 5857, 5863, 5875, 5887, 5899, 5909, 5913,
5949, 5955, 5957, 5967, 5975, 5981, 6003, 6005, 6009, 6025, 6031,
6039, 6045, 6061, 6067, 6079, 6081, 6111, 6139, 6151, 6157, 6175,
6179, 6193, 6199, 6217, 6231, 6237, 6253, 6265, 6271, 6275, 6289,
6295, 6305, 6329, 6347, 6349, 6383, 6385, 6395, 6405, 6409, 6427,
6445, 6453, 6465, 6475, 6495, 6501, 6511, 6523, 6529, 6539, 6553,
6577, 6583, 6589, 6601, 6607, 6621, 6631, 6637, 6649, 6683, 6685,
6689, 6699, 6707, 6733, 6739, 6741, 6751, 6755, 6761, 6779, 6795,
6833, 6853, 6865, 6881, 6887, 6891, 6901, 6923, 6925, 6931, 6937,
6943, 6959, 6981, 6999, 7049, 7055, 7057, 7079, 7093, 7097, 7103,
7105, 7115, 7123, 7139, 7165, 7171, 7173, 7183, 7185, 7191, 7207,
7245, 7263, 7303, 7327, 7333, 7351, 7355, 7365, 7369, 7375, 7383,
7403, 7405, 7411, 7425, 7431, 7459, 7471, 7485, 7491, 7505, 7515,
7517, 7527, 7541, 7545, 7555, 7557, 7561, 7569, 7591, 7603, 7617,
7663, 7687, 7701, 7705, 7727, 7739, 7741, 7749, 7761, 7773, 7777,
7783, 7795, 7823, 7831, 7835, 7865, 7871, 7885, 7891, 7907, 7921,
7927, 7939, 7953, 7963, 7975, 7993, 8007, 8011, 8019, 8037, 8049,
8061, 8065, 8077, 8089, 8111, 8123, 8125, 8131, 8133, 8137, 8161,
8173, 8191, 8219, 8231, 8245, 8275, 8293, 8303, 8331, 8333, 8351,
8357, 8367, 8379, 8381, 8387, 8393, 8417, 8435, 8461, 8469, 8489,
8495, 8507, 8515, 8551, 8555, 8569, 8585, 8599, 8605, 8639, 8641,
8647, 8653, 8671, 8675, 8689, 8699, 8729, 8741, 8759, 8765, 8771,
8795, 8797, 8825, 8831, 8841, 8855, 8859, 8883, 8895, 8909, 8943,
8951, 8955, 8965, 8999, 9003, 9031, 9045, 9049, 9071, 9073, 9085,
9095, 9101, 9109, 9123, 9129, 9137, 9143, 9147, 9185, 9197, 9209,
9227, 9235, 9247, 9253, 9257, 9277, 9297, 9303, 9313, 9325, 9343,
9347, 9371, 9373, 9397, 9407, 9409, 9415, 9419, 9443, 9481, 9495,
9501, 9505, 9517, 9529, 9555, 9557, 9571, 9585, 9591, 9607, 9611,
9621, 9625, 9631, 9647, 9661, 9669, 9679, 9687, 9707, 9731, 9733,
9745, 9773, 9791, 9803, 9811, 9817, 9833, 9847, 9851, 9863, 9875,
9881, 9905, 9911, 9917, 9923, 9963, 9973, 10003, 10025, 10043, 10063,
10071, 10077, 10091, 10099, 10105, 10115, 10129, 10145, 10169, 10183,
10187, 10207, 10223, 10225, 10247, 10265, 10271, 10275, 10289, 10299,
10301, 10309, 10343, 10357, 10373, 10411, 10413, 10431, 10445, 10453,
10463, 10467, 10473, 10491, 10505, 10511, 10513, 10523, 10539, 10549,
10559, 10561, 10571, 10581, 10615, 10621, 10625, 10643, 10655, 10671,
10679, 10685, 10691, 10711, 10739, 10741, 10755, 10767, 10781, 10785,
10803, 10805, 10829, 10857, 10863, 10865, 10875, 10877, 10917, 10921,
10929, 10949, 10967, 10971, 10987, 10995, 11009, 11029, 11043, 11045,
11055, 11063, 11075, 11081, 11117, 11135, 11141, 11159, 11163, 11181,
11187, 11225, 11237, 11261, 11279, 11297, 11307, 11309, 11327, 11329,
11341, 11377, 11403, 11405, 11413, 11427, 11439, 11453, 11461, 11473,
11479, 11489, 11495, 11499, 11533, 11545, 11561, 11567, 11575, 11579,
11589, 11611, 11623, 11637, 11657, 11663, 11687, 11691, 11701, 11747,
11761, 11773, 11783, 11795, 11797, 11817, 11849, 11855, 11867, 11869,
11873, 11883, 11919, 11921, 11927, 11933, 11947, 11955, 11961, 11999,
12027, 12029, 12037, 12041, 12049, 12055, 12095, 12097, 12107, 12109,
12121, 12127, 12133, 12137, 12181, 12197, 12207, 12209, 12239, 12253,
12263, 12269, 12277, 12287, 12295, 12309, 12313, 12335, 12361, 12367,
12391, 12409, 12415, 12433, 12449, 12469, 12479, 12481, 12499, 12505,
12517, 12527, 12549, 12559, 12597, 12615, 12621, 12639, 12643, 12657,
12667, 12707, 12713, 12727, 12741, 12745, 12763, 12769, 12779, 12781,
12787, 12799, 12809, 12815, 12829, 12839, 12857, 12875, 12883, 12889,
12901, 12929, 12947, 12953, 12959, 12969, 12983, 12987, 12995, 13015,
13019, 13031, 13063, 13077, 13103, 13137, 13149, 13173, 13207, 13211,
13227, 13241, 13249, 13255, 13269, 13283, 13285, 13303, 13307, 13321,
13339, 13351, 13377, 13389, 13407, 13417, 13431, 13435, 13447, 13459,
13465, 13477, 13501, 13513, 13531, 13543, 13561, 13581, 13599, 13605,
13617, 13623, 13637, 13647, 13661, 13677, 13683, 13695, 13725, 13729,
13753, 13773, 13781, 13785, 13795, 13801, 13807, 13825, 13835, 13855,
13861, 13871, 13883, 13897, 13905, 13915, 13939, 13941, 13969, 13979,
13981, 13997, 14027, 14035, 14037, 14051, 14063, 14085, 14095, 14107,
14113, 14125, 14137, 14145, 14151, 14163, 14193, 14199, 14219, 14229,
14233, 14243, 14277, 14287, 14289, 14295, 14301, 14305, 14323, 14339,
14341, 14359, 14365, 14375, 14387, 14411, 14425, 14441, 14449, 14499,
14513, 14523, 14537, 14543, 14561, 14579, 14585, 14593, 14599, 14603,
14611, 14641, 14671, 14695, 14701, 14723, 14725, 14743, 14753, 14759,
14765, 14795, 14797, 14803, 14831, 14839, 14845, 14855, 14889, 14895,
14909, 14929, 14941, 14945, 14951, 14963, 14965, 14985, 15033, 15039,
15053, 15059, 15061, 15071, 15077, 15081, 15099, 15121, 15147, 15149,
15157, 15167, 15187, 15193, 15203, 15205, 15215, 15217, 15223, 15243,
15257, 15269, 15273, 15287, 15291, 15313, 15335, 15347, 15359, 15373,
15379, 15381, 15391, 15395, 15397, 15419, 15439, 15453, 15469, 15491,
15503, 15517, 15527, 15531, 15545, 15559, 15593, 15611, 15613, 15619,
15639, 15643, 15649, 15661, 15667, 15669, 15681, 15693, 15717, 15721,
15741, 15745, 15765, 15793, 15799, 15811, 15825, 15835, 15847, 15851,
15865, 15877, 15881, 15887, 15899, 15915, 15935, 15937, 15955, 15973,
15977, 16011, 16035, 16061, 16069, 16087, 16093, 16097, 16121, 16141,
16153, 16159, 16165, 16183, 16189, 16195, 16197, 16201, 16209, 16215,
16225, 16259, 16265, 16273, 16299, 16309, 16355, 16375, 16381, 16417,
16427, 16435, 16441, 16447, 16467, 16479, 16485, 16507, 16519, 16553,
16559, 16571, 16573, 16591, 16599, 16619, 16627, 16633, 16651, 16653,
16659, 16699, 16707, 16713, 16727, 16743, 16749, 16785, 16795, 16797,
16807, 16811, 16813, 16821, 16853, 16857, 16881, 16897, 16909, 16965,
16969, 16983, 16993, 17011, 17017, 17023, 17027, 17029, 17053, 17057,
17095, 17099, 17101, 17123, 17129, 17135, 17155, 17161, 17179, 17185,
17191, 17215, 17257, 17275, 17277, 17287, 17301, 17327, 17353, 17373,
17387, 17389, 17407, 17419, 17421, 17475, 17501, 17523, 17545, 17601,
17619, 17621, 17631, 17635, 17649, 17659, 17667, 17673, 17679, 17707,
17721, 17753, 17775, 17783, 17789, 17805, 17817, 17823, 17829, 17847,
17861, 17865, 17873, 17879, 17895, 17907, 17919, 17935, 17949, 17959,
17973, 17991, 18009, 18019, 18033, 18043, 18061, 18067, 18069, 18083,
18085, 18117, 18127, 18139, 18155, 18175, 18213, 18225, 18243, 18255,
18303, 18313, 18321, 18331, 18343, 18357, 18369, 18387, 18393, 18405,
18409, 18415, 18429, 18451, 18457, 18463, 18491, 18499, 18513, 18523,
18529, 18535, 18559, 18563, 18577, 18623, 18631, 18659, 18673, 18679,
18685, 18717, 18721, 18733, 18745, 18753, 18771, 18783, 18789, 18793,
18807, 18823, 18827, 18857, 18895, 18897, 18909, 18913, 18919, 18967,
18997, 19033, 19045, 19067, 19073, 19079, 19083, 19091, 19107, 19119,
19133, 19145, 19165, 19181, 19193, 19231, 19255, 19273, 19291, 19297,
19307, 19309, 19315, 19321, 19333, 19343, 19351, 19361, 19371, 19379,
19385, 19403, 19405, 19413, 19423, 19441, 19451, 19465, 19483, 19485,
19495, 19499, 19519, 19527, 19531, 19539, 19541, 19557, 19581, 19597,
19621, 19645, 19653, 19665, 19671, 19693, 19711, 19733, 19743, 19753,
19761, 19781, 19791, 19793, 19829, 19845, 19855, 19885, 19891, 19905,
19923, 19953, 19963, 19969, 19989, 20003, 20023, 20035, 20041, 20049,
20075, 20077, 20099, 20123, 20147, 20179, 20197, 20201, 20207, 20253,
20257, 20299, 20309, 20319, 20329, 20335, 20353, 20365, 20383, 20389,
20393, 20407, 20411, 20439, 20459, 20461, 20473, 20487, 20511, 20517,
20571, 20573, 20641, 20683, 20693, 20697, 20707, 20713, 20719, 20731,
20763, 20769, 20781, 20799, 20819, 20825, 20831, 20847, 20861, 20875,
20889, 20901, 20913, 20919, 20943, 20945, 20955, 20971, 20973, 20981,
20991, 20997, 21007, 21037, 21093, 21105, 21131, 21145, 21155, 21169,
21181, 21187, 21189, 21199, 21201, 21223, 21227, 21241, 21249, 21273,
21285, 21289, 21303, 21321, 21339, 21351, 21365, 21403, 21405, 21415,
21433, 21439, 21447, 21459, 21477, 21489, 21501, 21507, 21519, 21527,
21557, 21561, 21575, 21593, 21599, 21627, 21645, 21651, 21653, 21663,
21681, 21687, 21691, 21725, 21729, 21739, 21779, 21785, 21807, 21815,
21863, 21867, 21877, 21881, 21887, 21891, 21893, 21905, 21911, 21933,
21953, 21971, 21983, 21993, 22007, 22023, 22029, 22037, 22051, 22057,
22063, 22065, 22103, 22109, 22171, 22187, 22189, 22195, 22209, 22215,
22221, 22257, 22263, 22267, 22315, 22317, 22335, 22347, 22357, 22361,
22371, 22373, 22397, 22419, 22447, 22461, 22467, 22469, 22487, 22503,
22515, 22531, 22545, 22561, 22573, 22579, 22581, 22591, 22593, 22653,
22663, 22667, 22677, 22681, 22691, 22703, 22705, 22737, 22749, 22759,
22763, 22777, 22783, 22803, 22819, 22843, 22863, 22911, 22927, 22935,
22941, 22945, 22951, 22955, 22965, 22987, 23007, 23017, 23037, 23053,
23059, 23071, 23077, 23099, 23101, 23107, 23109, 23113, 23157, 23183,
23207, 23221, 23233, 23251, 23253, 23257, 23287, 23311, 23319, 23325,
23339, 23347, 23353, 23361, 23395, 23401, 23415, 23449, 23459, 23465,
23491, 23493, 23521, 23531, 23545, 23559, 23563, 23577, 23601, 23607,
23625, 23645, 23661, 23673, 23683, 23713, 23743, 23745, 23755, 23757,
23781, 23813, 23825, 23837, 23859, 23861, 23879, 23919, 23943, 23949,
23957, 23967, 23971, 23977, 23995, 24009, 24015, 24027, 24033, 24067,
24079, 24091, 24109, 24135, 24139, 24163, 24189, 24193, 24217, 24229,
24233, 24279, 24283, 24295, 24309, 24327, 24333, 24345, 24351, 24355,
24381, 24387, 24389, 24401, 24417, 24427, 24437, 24457, 24471, 24491,
24525, 24543, 24547, 24549, 24561, 24587, 24589, 24597, 24623, 24637,
24655, 24657, 24673, 24679, 24683, 24713, 24727, 24733, 24737, 24747,
24755, 24761, 24787, 24789, 24823, 24841, 24849, 24877, 24889, 24897,
24915, 24945, 24957, 24991, 24997, 25007, 25019, 25051, 25069, 25077,
25087, 25131, 25139, 25141, 25145, 25159, 25165, 25187, 25199, 25213,
25229, 25247, 25253, 25257, 25265, 25271, 25303, 25307, 25309, 25323,
25325, 25331, 25343, 25379, 25393, 25399, 25405, 25435, 25453, 25461,
25477, 25481, 25489, 25505, 25535, 25583, 25597, 25609, 25623, 25645,
25665, 25671, 25677, 25685, 25739, 25749, 25759, 25769, 25777, 25831,
25845, 25857, 25867, 25881, 25911, 25915, 25923, 25925, 25929, 25947,
25987, 26001, 26023, 26029, 26041, 26047, 26067, 26069, 26073, 26085,
26095, 26097, 26103, 26113, 26119, 26125, 26147, 26171, 26191, 26205,
26219, 26221, 26227, 26243, 26255, 26263, 26279, 26283, 26293, 26297,
26329, 26335, 26345, 26385, 26395, 26401, 26419, 26443, 26463, 26473,
26487, 26497, 26531, 26543, 26551, 26577, 26599, 26603, 26613, 26627,
26641, 26651, 26653, 26667, 26689, 26707, 26735, 26743, 26763, 26765,
26771, 26783, 26789, 26793, 26821, 26825, 26879, 26887, 26905, 26927,
26941, 26967, 26987, 26995, 26997, 27001, 27013, 27023, 27035, 27037,
27041, 27051, 27079, 27085, 27113, 27137, 27143, 27147, 27161, 27171,
27183, 27217, 27227, 27239, 27243, 27245, 27253, 27267, 27287, 27315,
27317, 27327, 27329, 27339, 27341, 27369, 27375, 27387, 27389, 27395,
27415, 27435, 27443, 27449, 27463, 27467, 27477, 27497, 27517, 27521,
27533, 27541, 27551, 27555, 27557, 27569, 27575, 27589, 27607, 27617,
27629, 27635, 27641, 27659, 27673, 27695, 27709, 27717, 27735, 27745,
27763, 27829, 27833, 27839, 27841, 27847, 27851, 27877, 27889, 27909,
27913, 27919, 27927, 27947, 27987, 28003, 28005, 28009, 28027, 28067,
28081, 28091, 28093, 28099, 28101, 28125, 28169, 28199, 28205, 28211,
28225, 28237, 28243, 28271, 28283, 28289, 28295, 28309, 28335, 28343,
28355, 28379, 28381, 28409, 28417, 28437, 28457, 28465, 28475, 28495,
28503, 28507, 28513, 28549, 28561, 28567, 28587, 28597, 28615, 28633,
28639, 28649, 28677, 28701, 28715, 28723, 28725, 28747, 28797, 28801,
28813, 28841, 28855, 28859, 28873, 28879, 28893, 28897, 28947, 28949,
28953, 28963, 28977, 28983, 28989, 29021, 29035, 29065, 29079, 29083,
29089, 29109, 29119, 29131, 29151, 29157, 29175, 29179, 29209, 29215,
29231, 29233, 29243, 29263, 29281, 29287, 29327, 29357, 29363, 29377,
29389, 29395, 29407, 29413, 29425, 29431, 29443, 29449, 29479, 29483,
29505, 29525, 29541, 29551, 29581, 29587, 29605, 29629, 29641, 29649,
29671, 29683, 29685, 29695, 29715, 29717, 29737, 29775, 29783, 29787,
29803, 29805, 29827, 29867, 29875, 29895, 29901, 29909, 29919, 29929,
29947, 29949, 29975, 29979, 29985, 30005, 30017, 30027, 30071, 30075,
30081, 30105, 30115, 30141, 30159, 30161, 30187, 30197, 30201, 30207,
30237, 30265, 30279, 30291, 30293, 30303, 30307, 30309, 30313, 30343,
30357, 30367, 30371, 30383, 30395, 30405, 30417, 30443, 30451, 30457,
30475, 30511, 30537, 30545, 30551, 30573, 30579, 30595, 30601, 30631,
30637, 30645, 30663, 30675, 30677, 30703, 30741, 30757, 30769, 30781,
30799, 30801, 30811, 30829, 30887, 30893, 30899, 30911, 30923, 30925,
30937, 30943, 30953, 30959, 30979, 30991, 30999, 31015, 31027, 31053,
31065, 31087, 31089, 31099, 31105, 31111, 31141, 31153, 31173, 31177,
31191, 31197, 31235, 31259, 31271, 31275, 31285, 31295, 31307, 31317,
31351, 31361, 31373, 31401, 31415, 31419, 31427, 31457, 31475, 31477,
31499, 31523, 31547, 31557, 31567, 31569, 31581, 31591, 31609, 31621,
31631, 31649, 31659, 31673, 31699, 31715, 31729, 31735, 31749, 31753,
31783, 31789, 31833, 31849, 31869, 31883, 31891, 31893, 31907, 31927,
31939, 31953, 31965, 31979, 31993, 31999, 32001, 32021, 32055, 32069,
32073, 32115, 32121, 32143, 32145, 32151, 32167, 32179, 32199, 32205,
32213, 32233, 32251, 32253, 32257, 32269, 32281, 32303, 32325, 32353,
32373, 32383, 32393, 32399, 32411, 32413, 32427, 32447, 32455, 32467,
32483, 32485, 32521, 32545, 32575, 32589, 32597, 32625, 32651, 32653,
32665, 32671, 32675, 32689, 32707, 32709, 32721, 32727, 32737, 32743,
32771, 32785, 32791, 32813, 32821, 32863, 32879, 32887, 32897, 32903,
32915, 32933, 32945, 32957, 32963, 32975, 32989, 32999, 33013, 33023,
33025, 33045, 33061, 33111, 33117, 33121, 33133, 33145, 33157, 33185,
33191, 33209, 33227, 33229, 33237, 33247, 33277, 33299, 33339, 33349,
33407, 33417, 33423, 33435, 33483, 33497, 33507, 33521, 33559, 33563,
33579, 33587, 33607, 33613, 33631, 33635, 33641, 33649, 33675, 33685,
33689, 33711, 33723, 33725, 33733, 33745, 33781, 33817, 33827, 33839,
33841, 33847, 33865, 33895, 33901, 33913, 33923, 33925, 33943, 33953,
33973, 34015, 34031, 34039, 34043, 34045, 34077, 34081, 34087, 34099,
34119, 34123, 34143, 34161, 34171, 34177, 34189, 34211, 34225, 34231,
34245, 34249, 34267, 34285, 34291, 34313, 34321, 34333, 34347, 34389,
34393, 34405, 34429, 34433, 34451, 34473, 34479, 34487, 34499, 34523,
34547, 34559, 34571, 34573, 34581, 34591, 34601, 34609, 34667, 34693,
34697, 34703, 34717, 34731, 34733, 34739, 34751, 34783, 34793, 34801,
34807, 34817, 34823, 34853, 34871, 34875, 34889, 34909, 34913, 34931,
34937, 34947, 34959, 34961, 34995, 34997, 35015, 35033, 35075, 35077,
35081, 35089, 35095, 35111, 35173, 35197, 35221, 35225, 35247, 35279,
35281, 35291, 35293, 35309, 35327, 35351, 35385, 35413, 35427, 35429,
35441, 35451, 35463, 35467, 35487, 35503, 35505, 35549, 35595, 35597,
35643, 35645, 35651, 35693, 35699, 35729, 35741, 35777, 35787, 35797,
35801, 35813, 35825, 35873, 35879, 35911, 35925, 35929, 35939, 35945,
35975, 35987, 36003, 36009, 36027, 36041, 36065, 36075, 36097, 36103,
36107, 36133, 36143, 36163, 36177, 36187, 36205, 36223, 36229, 36233,
36251, 36257, 36287, 36299, 36301, 36325, 36329, 36335, 36343, 36363,
36383, 36411, 36433, 36439, 36467, 36469, 36495, 36503, 36507, 36513,
36543, 36545, 36563, 36575, 36581, 36603, 36623, 36647, 36651, 36665,
36673, 36691, 36693, 36709, 36727, 36733, 36773, 36791, 36797, 36809,
36817, 36833, 36839, 36875, 36889, 36895, 36901, 36919, 36925, 36931,
36951, 36961, 36973, 36981, 37001, 37009, 37019, 37021, 37037, 37091,
37125, 37129, 37135, 37143, 37147, 37149, 37185, 37197, 37239, 37243,
37273, 37283, 37289, 37297, 37309, 37327, 37345, 37379, 37393, 37403,
37409, 37415, 37427, 37439, 37453, 37459, 37471, 37499, 37511, 37525,
37539, 37559, 37577, 37597, 37621, 37625, 37651, 37681, 37687, 37701,
37705, 37719, 37747, 37759, 37763, 37789, 37793, 37813, 37835, 37855,
37871, 37873, 37883, 37903, 37931, 37933, 37941, 37963, 37971, 38007,
38013, 38027, 38035, 38041, 38053, 38057, 38075, 38085, 38103, 38107,
38113, 38119, 38133, 38143, 38151, 38165, 38185, 38193, 38205, 38213,
38241, 38251, 38281, 38299, 38317, 38349, 38367, 38371, 38377, 38419,
38421, 38447, 38449, 38455, 38461, 38467, 38493, 38503, 38521, 38551,
38573, 38593, 38603, 38611, 38623, 38639, 38651, 38661, 38699, 38709,
38713, 38733, 38755, 38805, 38815, 38819, 38821, 38825, 38833, 38875,
38877, 38881, 38899, 38911, 38921, 38945, 38957, 38983, 39061, 39065,
39087, 39099, 39107, 39109, 39127, 39133, 39143, 39155, 39161, 39179,
39193, 39205, 39209, 39215, 39223, 39235, 39237, 39259, 39277, 39295,
39305, 39313, 39323, 39353, 39359, 39361, 39371, 39381, 39395, 39397,
39461, 39473, 39503, 39511, 39515, 39517, 39521, 39533, 39545, 39551,
39557, 39575, 39581, 39595, 39609, 39623, 39627, 39651, 39675, 39697,
39707, 39725, 39731, 39745, 39763, 39775, 39791, 39799, 39805, 39815,
39819, 39827, 39863, 39869, 39889, 39915, 39929, 39935, 39957, 39967,
39983, 39995, 39997, 40017, 40029, 40039, 40051, 40053, 40057, 40069,
40127, 40135, 40149, 40165, 40169, 40177, 40183, 40195, 40277, 40281,
40291, 40311, 40321, 40331, 40345, 40351, 40357, 40381, 40451, 40465,
40471, 40481, 40487, 40505, 40519, 40533, 40537, 40543, 40547, 40553,
40577, 40607, 40611, 40685, 40691, 40715, 40723, 40729, 40739, 40751,
40777, 40783, 40807, 40859, 40877, 40883, 40885, 40909, 40921, 40951,
40971, 40981, 40995, 40997, 41007, 41027, 41051, 41053, 41063, 41067,
41069, 41087, 41097, 41105, 41127, 41141, 41165, 41183, 41193, 41211,
41219, 41231, 41245, 41249, 41255, 41267, 41269, 41273, 41287, 41305,
41327, 41339, 41345, 41375, 41393, 41413, 41423, 41441, 41487, 41501,
41517, 41525, 41537, 41543, 41557, 41571, 41583, 41625, 41641, 41659,
41661, 41669, 41673, 41687, 41691, 41709, 41735, 41739, 41741, 41753,
41759, 41763, 41769, 41797, 41835, 41843, 41861, 41871, 41879, 41889,
41907, 41921, 41933, 41941, 41987, 41989, 41993, 42001, 42067, 42073,
42085, 42113, 42119, 42123, 42133, 42137, 42149, 42159, 42161, 42173,
42179, 42203, 42219, 42221, 42241, 42275, 42277, 42281, 42319, 42355,
42371, 42407, 42425, 42439, 42445, 42473, 42481, 42491, 42515, 42533,
42543, 42551, 42557, 42577, 42593, 42611, 42641, 42651, 42653, 42695,
42737, 42749, 42779, 42795, 42809, 42847, 42865, 42893, 42905, 42929,
42939, 42941, 42959, 42961, 42973, 42983, 43013, 43051, 43059, 43065,
43083, 43085, 43093, 43113, 43119, 43133, 43137, 43155, 43167, 43171,
43177, 43191, 43215, 43229, 43233, 43243, 43275, 43283, 43289, 43301,
43337, 43381, 43409, 43431, 43437, 43455, 43457, 43497, 43503, 43511,
43533, 43541, 43567, 43569, 43587, 43589, 43599, 43601, 43617, 43641,
43677, 43691, 43693, 43699, 43705, 43731, 43743, 43761, 43779, 43791,
43805, 43829, 43833, 43847, 43875, 43901, 43905, 43915, 43929, 43963,
43973, 43985, 43991, 43995, 44007, 44019, 44033, 44039, 44045, 44051,
44073, 44087, 44091, 44101, 44123, 44141, 44147, 44159, 44165, 44175,
44183, 44231, 44245, 44255, 44265, 44285, 44293, 44305, 44315, 44321,
44363, 44365, 44399, 44451, 44463, 44489, 44509, 44519, 44523, 44537,
44553, 44573, 44589, 44601, 44607, 44621, 44639, 44643, 44657, 44663,
44667, 44685, 44693, 44707, 44731, 44759, 44765, 44775, 44789, 44801,
44819, 44831, 44841, 44847, 44859, 44867, 44873, 44903, 44917, 44943,
44957, 44971, 44993, 45011, 45027, 45047, 45053, 45071, 45083, 45101,
45109, 45119, 45141, 45175, 45197, 45203, 45231, 45251, 45253, 45265,
45281, 45299, 45319, 45323, 45325, 45373, 45399, 45405, 45429, 45455,
45463, 45469, 45473, 45511, 45535, 45541, 45579, 45587, 45589, 45635,
45641, 45647, 45685, 45695, 45705, 45723, 45749, 45761, 45791, 45801,
45807, 45815, 45829, 45847, 45863, 45923, 45947, 45953, 45971, 45989,
45993, 46001, 46007, 46021, 46039, 46043, 46045, 46073, 46081, 46093,
46105, 46111, 46121, 46147, 46149, 46167, 46189, 46197, 46207, 46247,
46271, 46297, 46319, 46327, 46345, 46365, 46387, 46399, 46407, 46419,
46421, 46441, 46455, 46459, 46485, 46505, 46523, 46531, 46551, 46561,
46567, 46571, 46585, 46597, 46601, 46615, 46619, 46625, 46631, 46637,
46643, 46645, 46667, 46681, 46715, 46721, 46731, 46745, 46767, 46769,
46801, 46823, 46827, 46855, 46879, 46885, 46917, 46935, 46939, 46955,
46969, 46979, 46993, 46999, 47005, 47009, 47027, 47051, 47101, 47135,
47173, 47183, 47201, 47221, 47237, 47241, 47261, 47265, 47277, 47295,
47315, 47317, 47355, 47363, 47369, 47389, 47399, 47403, 47431, 47445,
47449, 47461, 47479, 47501, 47535, 47547, 47555, 47561, 47569, 47585,
47597, 47603, 47605, 47621, 47631, 47633, 47659, 47673, 47705, 47721,
47727, 47745, 47751, 47757, 47763, 47799, 47831, 47859, 47871, 47873,
47879, 47893, 47897, 47907, 47933, 47939, 47945, 47951, 47953, 47963,
47975, 47989, 48017, 48053, 48063, 48075, 48077, 48101, 48105, 48137,
48179, 48185, 48227, 48229, 48233, 48251, 48267, 48269, 48287, 48297,
48323, 48337, 48349, 48385, 48403, 48421, 48431, 48439, 48453, 48487,
48511, 48515, 48521, 48569, 48577, 48595, 48601, 48613, 48625, 48647,
48661, 48675, 48681, 48695, 48727, 48731, 48737, 48747, 48767, 48771,
48785, 48811, 48853, 48857, 48881, 48919, 48929, 48935, 48947, 48949,
48979, 48997, 49025, 49035, 49059, 49079, 49091, 49115, 49133, 49141,
49151, 49153, 49159, 49171, 49183, 49189, 49225, 49267, 49273, 49285,
49297, 49303, 49309, 49319, 49337, 49355, 49365, 49379, 49403, 49425,
49441, 49459, 49471, 49483, 49503, 49519, 49527, 49531, 49533, 49555,
49573, 49597, 49603, 49609, 49627, 49639, 49645, 49669, 49673, 49687,
49709, 49741, 49747, 49749, 49769, 49817, 49841, 49871, 49873, 49885,
49909, 49921, 49933, 49945, 49957, 49967, 49981, 50007, 50011, 50017,
50035, 50051, 50075, 50077, 50091, 50093, 50111, 50119, 50147, 50159,
50173, 50181, 50209, 50227, 50247, 50251, 50271, 50287, 50301, 50323,
50335, 50341, 50359, 50373, 50391, 50397, 50411, 50425, 50431, 50443,
50453, 50479, 50481, 50505, 50523, 50549, 50553, 50569, 50587, 50593,
50611, 50613, 50623, 50635, 50655, 50665, 50671, 50685, 50735, 50737,
50749, 50757, 50769, 50795, 50805, 50809, 50831, 50839, 50859, 50867,
50873, 50881, 50887, 50893, 50901, 50915, 50921, 50939, 50947, 50953,
51009, 51027, 51033, 51043, 51063, 51097, 51103, 51113, 51139, 51159,
51163, 51189, 51203, 51227, 51253, 51265, 51277, 51295, 51301, 51305,
51349, 51389, 51401, 51445, 51449, 51455, 51457, 51469, 51477, 51487,
51491, 51497, 51505, 51511, 51515, 51547, 51549, 51553, 51583, 51587,
51599, 51627, 51655, 51659, 51661, 51673, 51749, 51753, 51759, 51779,
51785, 51815, 51855, 51885, 51903, 51929, 51939, 51951, 51953, 51965,
51991, 51995, 51997, 52011, 52031, 52053, 52073, 52081, 52091, 52103,
52157, 52183, 52199, 52213, 52231, 52245, 52259, 52285, 52297, 52315,
52333, 52351, 52355, 52357, 52379, 52385, 52391, 52397, 52403, 52417,
52441, 52471, 52475, 52477, 52497, 52523, 52531, 52565, 52579, 52591,
52615, 52639, 52643, 52663, 52677, 52687, 52695, 52705, 52715, 52717,
52729, 52735, 52739, 52753, 52775, 52789, 52793, 52837, 52847, 52849,
52895, 52901, 52923, 52931, 52933, 52937, 52945, 52951, 52979, 52991,
53005, 53017, 53023, 53039, 53085, 53089, 53099, 53107, 53113, 53135,
53147, 53149, 53153, 53163, 53191, 53205, 53225, 53239, 53253, 53257,
53311, 53319, 53325, 53361, 53367, 53383, 53387, 53389, 53397, 53401,
53411, 53425, 53445, 53455, 53457, 53463, 53473, 53497, 53515, 53541,
53545, 53551, 53565, 53585, 53595, 53613, 53659, 53689, 53695, 53697,
53717, 53721, 53743, 53757, 53767, 53781, 53791, 53795, 53801, 53815,
53847, 53867, 53869, 53891, 53903, 53921, 53941, 53963, 54019, 54039,
54055, 54081, 54091, 54105, 54111, 54121, 54135, 54139, 54145, 54163,
54169, 54179, 54193, 54217, 54225, 54237, 54247, 54253, 54293, 54313,
54331, 54365, 54369, 54379, 54423, 54429, 54443, 54451, 54463, 54465,
54483, 54501, 54505, 54513, 54543, 54555, 54567, 54571, 54599, 54613,
54617, 54627, 54653, 54675, 54711, 54723, 54753, 54759, 54771, 54773,
54789, 54823, 54827, 54859, 54879, 54883, 54895, 54909, 54919, 54953,
54967, 54981, 54999, 55009, 55021, 55027, 55061, 55075, 55077, 55089,
55143, 55149, 55167, 55213, 55219, 55221, 55231, 55257, 55287, 55291,
55309, 55315, 55369, 55383, 55405, 55433, 55439, 55451, 55463, 55467,
55477, 55489, 55495, 55507, 55513, 55525, 55561, 55579, 55603, 55617,
55623, 55629, 55647, 55653, 55665, 55691, 55705, 55711, 55715, 55721,
55729, 55747, 55767, 55795, 55801, 55813, 55831, 55847, 55859, 55861,
55871, 55897, 55933, 55947, 55955, 55961, 55971, 55985, 56003, 56029,
56045, 56071, 56095, 56101, 56105, 56123, 56133, 56143, 56161, 56195,
56209, 56225, 56263, 56269, 56277, 56287, 56291, 56297, 56303, 56315,
56317, 56337, 56363, 56373, 56377, 56385, 56431, 56433, 56467, 56479,
56495, 56529, 56535, 56539, 56565, 56601, 56617, 56625, 56645, 56663,
56679, 56691, 56693, 56733, 56749, 56769, 56789, 56805, 56823, 56827,
56839, 56879, 56893, 56905, 56911, 56913, 56941, 56949, 56963, 56965,
56969, 56993, 57005, 57035, 57037, 57043, 57091, 57093, 57111, 57117,
57121, 57139, 57177, 57187, 57193, 57199, 57201, 57253, 57275, 57289,
57307, 57323, 57347, 57359, 57361, 57395, 57397, 57415, 57419, 57439,
57467, 57469, 57485, 57503, 57513, 57521, 57527, 57541, 57559, 57563,
57565, 57581, 57599, 57601, 57611, 57637, 57649, 57673, 57679, 57681,
57693, 57703, 57707, 57727, 57779, 57811, 57817, 57839, 57863, 57867,
57881, 57891, 57905, 57925, 57935, 57959, 57977, 57989, 57999, 58011,
58013, 58017, 58027, 58029, 58047, 58049, 58069, 58127, 58129, 58139,
58165, 58169, 58201, 58211, 58213, 58231, 58253, 58259, 58271, 58277,
58287, 58295, 58307, 58331, 58355, 58367, 58399, 58417, 58441, 58459,
58475, 58477, 58483, 58489, 58501, 58513, 58519, 58525, 58529, 58539,
58571, 58573, 58591, 58609, 58621, 58627, 58629, 58647, 58651, 58669,
58675, 58753, 58773, 58789, 58799, 58855, 58885, 58913, 58937, 58943,
58951, 58963, 58985, 59015, 59067, 59069, 59095, 59101, 59115, 59125,
59129, 59137, 59161, 59177, 59245, 59253, 59267, 59279, 59303, 59307,
59309, 59317, 59339, 59347, 59349, 59365, 59377, 59383, 59393, 59439,
59459, 59471, 59473, 59483, 59501, 59513, 59529, 59537, 59559, 59583,
59585, 59595, 59597, 59603, 59643, 59645, 59651, 59663, 59681, 59687,
59691, 59701, 59737, 59743, 59747, 59753, 59761, 59789, 59831, 59845,
59855, 59863, 59885, 59913, 59931, 59949, 59979, 59993, 60017, 60029,
60033, 60045, 60091, 60099, 60105, 60119, 60141, 60159, 60167, 60171,
60185, 60195, 60201, 60219, 60229, 60247, 60253, 60263, 60267, 60275,
60277, 60311, 60315, 60333, 60339, 60365, 60371, 60373, 60387, 60425,
60433, 60449, 60469, 60491, 60511, 60517, 60521, 60541, 60563, 60569,
60591, 60599, 60605, 60617, 60623, 60671, 60679, 60693, 60707, 60727,
60745, 60765, 60769, 60779, 60823, 60833, 60843, 60851, 60871, 60877,
60889, 60895, 60911, 60913, 60925, 60929, 60939, 60941, 60959, 60969,
61045, 61059, 61065, 61085, 61101, 61113, 61127, 61131, 61145, 61155,
61169, 61175, 61199, 61217, 61229, 61235, 61241, 61261, 61303, 61333,
61343, 61361, 61371, 61409, 61415, 61419, 61427, 61429, 61433, 61447,
61453, 61471, 61481, 61487, 61509, 61533, 61573, 61577, 61591, 61611,
61631, 61639, 61653, 61663, 61681, 61687, 61713, 61723, 61749, 61761,
61767, 61771, 61779, 61795, 61809, 61837, 61843, 61893, 61921, 61927,
61939, 61941, 61951, 61975, 61981, 62023, 62029, 62037, 62041, 62063,
62075, 62087, 62111, 62117, 62171, 62173, 62201, 62207, 62209, 62219,
62229, 62255, 62263, 62275, 62341, 62345, 62353, 62359, 62387, 62431,
62437, 62469, 62479, 62487, 62497, 62521, 62547, 62549, 62563, 62565,
62569, 62587, 62603, 62617, 62627, 62641, 62653, 62659, 62671, 62707,
62709, 62713, 62733, 62745, 62757, 62775, 62779, 62801, 62817, 62829,
62865, 62877, 62887, 62901, 62911, 62913, 62919, 62977, 62997, 63007,
63011, 63035, 63045, 63055, 63069, 63083, 63091, 63107, 63109, 63155,
63157, 63193, 63215, 63227, 63265, 63277, 63295, 63309, 63315, 63337,
63343, 63367, 63371, 63381, 63395, 63409, 63415, 63427, 63433, 63451,
63487, 63491, 63497, 63503, 63517, 63527, 63533, 63545, 63551, 63563,
63599, 63601, 63607, 63635, 63685, 63707, 63713, 63725, 63731, 63733,
63751, 63765, 63779, 63803, 63805, 63823, 63825, 63859, 63865, 63877,
63899, 63923, 63929, 63943, 63971, 63977, 63991, 64001, 64007, 64019,
64035, 64055, 64073, 64107, 64117, 64121, 64127, 64131, 64151, 64155,
64161, 64193, 64203, 64217, 64223, 64229, 64261, 64271, 64289, 64295,
64309, 64333, 64341, 64351, 64361, 64369, 64385, 64397, 64419, 64425,
64439, 64457, 64463, 64475, 64481, 64523, 64525, 64543, 64585, 64603,
64615, 64629, 64643, 64685, 64723, 64751, 64783, 64791, 64797, 64811,
64813, 64825, 64839, 64851, 64881, 64907, 64917, 64921, 64931, 64943,
64945, 64963, 64989, 64993, 65003, 65029, 65069, 65075, 65077, 65089,
65101, 65113, 65119, 65149, 65159, 65171, 65177, 65201, 65213, 65225,
65259, 65279, 65281, 65287, 65299, 65315, 65321, 65335, 65359, 65367,
65373, 65377, 65395, 65407, 65423, 65425, 65459, 65479, 65497, 65513,
65519, 65533};
return nb2_a[n];
}
};
} // namespace qrng_tables
} // namespace detail
} // namespace random
} // namespace boost
#endif // BOOST_RANDOM_DETAIL_NIEDERREITER_BASE2_TABLE_HPP

View File

@@ -0,0 +1,291 @@
/* boost random/detail/qrng_base.hpp header file
*
* Copyright Justinas Vygintas Daugmaudis 2010-2018
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_RANDOM_DETAIL_QRNG_BASE_HPP
#define BOOST_RANDOM_DETAIL_QRNG_BASE_HPP
#include <stdexcept>
#include <vector>
#include <limits>
#include <istream>
#include <ostream>
#include <sstream>
#include <boost/cstdint.hpp>
#include <boost/random/detail/operators.hpp>
#include <boost/throw_exception.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/random/detail/disable_warnings.hpp>
//!\file
//!Describes the quasi-random number generator base class template.
namespace boost {
namespace random {
namespace qrng_detail {
// If the seed is a signed integer type, then we need to
// check that the value is positive:
template <typename Integer>
inline void check_seed_sign(const Integer& v, const mpl::true_)
{
if (v < 0)
{
boost::throw_exception( std::range_error("seed must be a positive integer") );
}
}
template <typename Integer>
inline void check_seed_sign(const Integer&, const mpl::false_) {}
template <typename Integer>
inline void check_seed_sign(const Integer& v)
{
check_seed_sign(v, mpl::bool_<std::numeric_limits<Integer>::is_signed>());
}
template<typename DerivedT, typename LatticeT, typename SizeT>
class qrng_base
{
public:
typedef SizeT size_type;
typedef typename LatticeT::value_type result_type;
explicit qrng_base(std::size_t dimension)
// Guard against invalid dimensions before creating the lattice
: lattice(prevent_zero_dimension(dimension))
, quasi_state(dimension)
{
derived().seed();
}
// default copy c-tor is fine
// default assignment operator is fine
//!Returns: The dimension of of the quasi-random domain.
//!
//!Throws: nothing.
std::size_t dimension() const { return quasi_state.size(); }
//!Returns: Returns a successive element of an s-dimensional
//!(s = X::dimension()) vector at each invocation. When all elements are
//!exhausted, X::operator() begins anew with the starting element of a
//!subsequent s-dimensional vector.
//!
//!Throws: range_error.
result_type operator()()
{
return curr_elem != dimension() ? load_cached(): next_state();
}
//!Fills a range with quasi-random values.
template<typename Iter> void generate(Iter first, Iter last)
{
for (; first != last; ++first)
*first = this->operator()();
}
//!Effects: Advances *this state as if z consecutive
//!X::operator() invocations were executed.
//!
//!Throws: range_error.
void discard(boost::uintmax_t z)
{
const std::size_t dimension_value = dimension();
// Compiler knows how to optimize subsequent x / y and x % y
// statements. In fact, gcc does this even at -O1, so don't
// be tempted to "optimize" % via subtraction and multiplication.
boost::uintmax_t vec_n = z / dimension_value;
std::size_t carry = curr_elem + (z % dimension_value);
vec_n += carry / dimension_value;
carry = carry % dimension_value;
// Avoid overdiscarding by branchlessly correcting the triple
// (D, S + 1, 0) to (D, S, D) (see equality operator)
const bool corr = (!carry) & static_cast<bool>(vec_n);
// Discards vec_n (with correction) consecutive s-dimensional vectors
discard_vector(vec_n - static_cast<boost::uintmax_t>(corr));
#ifdef BOOST_MSVC
#pragma warning(push)
// disable unary minus operator applied to an unsigned type,
// result still unsigned.
#pragma warning(disable:4146)
#endif
// Sets up the proper position of the element-to-read
// curr_elem = carry + corr*dimension_value
curr_elem = carry ^ (-static_cast<std::size_t>(corr) & dimension_value);
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
}
//!Writes the textual representation of the generator to a @c std::ostream.
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, qrng_base, s)
{
os << s.dimension() << " " << s.seq_count << " " << s.curr_elem;
return os;
}
//!Reads the textual representation of the generator from a @c std::istream.
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, qrng_base, s)
{
std::size_t dim;
size_type seed;
boost::uintmax_t z;
if (is >> dim >> std::ws >> seed >> std::ws >> z) // initialize iff success!
{
// Check seed sign before resizing the lattice and/or recomputing state
check_seed_sign(seed);
if (s.dimension() != prevent_zero_dimension(dim))
{
s.lattice.resize(dim);
s.quasi_state.resize(dim);
}
// Fast-forward to the correct state
s.derived().seed(seed);
if (z != 0) s.discard(z);
}
return is;
}
//!Returns true if the two generators will produce identical sequences of outputs.
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(qrng_base, x, y)
{
const std::size_t dimension_value = x.dimension();
// Note that two generators with different seq_counts and curr_elems can
// produce the same sequence because the generator triple
// (D, S, D) is equivalent to (D, S + 1, 0), where D is dimension, S -- seq_count,
// and the last one is curr_elem.
return (dimension_value == y.dimension()) &&
// |x.seq_count - y.seq_count| <= 1
!((x.seq_count < y.seq_count ? y.seq_count - x.seq_count : x.seq_count - y.seq_count)
> static_cast<size_type>(1)) &&
// Potential overflows don't matter here, since we've already ascertained
// that sequence counts differ by no more than 1, so if they overflow, they
// can overflow together.
(x.seq_count + (x.curr_elem / dimension_value) == y.seq_count + (y.curr_elem / dimension_value)) &&
(x.curr_elem % dimension_value == y.curr_elem % dimension_value);
}
//!Returns true if the two generators will produce different sequences of outputs.
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(qrng_base)
protected:
typedef std::vector<result_type> state_type;
typedef typename state_type::iterator state_iterator;
// Getters
size_type curr_seq() const { return seq_count; }
state_iterator state_begin() { return quasi_state.begin(); }
state_iterator state_end() { return quasi_state.end(); }
// Setters
void reset_seq(size_type seq)
{
seq_count = seq;
curr_elem = 0u;
}
private:
DerivedT& derived() throw()
{
return *static_cast<DerivedT * const>(this);
}
// Load the result from the saved state.
result_type load_cached()
{
return quasi_state[curr_elem++];
}
result_type next_state()
{
size_type new_seq = seq_count;
if (BOOST_LIKELY(++new_seq > seq_count))
{
derived().compute_seq(new_seq);
reset_seq(new_seq);
return load_cached();
}
boost::throw_exception( std::range_error("qrng_base: next_state") );
}
// Discards z consecutive s-dimensional vectors,
// and preserves the position of the element-to-read
void discard_vector(boost::uintmax_t z)
{
const boost::uintmax_t max_z = std::numeric_limits<size_type>::max() - seq_count;
// Don't allow seq_count + z overflows here
if (max_z < z)
boost::throw_exception( std::range_error("qrng_base: discard_vector") );
std::size_t tmp = curr_elem;
derived().seed(static_cast<size_type>(seq_count + z));
curr_elem = tmp;
}
static std::size_t prevent_zero_dimension(std::size_t dimension)
{
if (dimension == 0)
boost::throw_exception( std::invalid_argument("qrng_base: zero dimension") );
return dimension;
}
// Member variables are so ordered with the intention
// that the typical memory access pattern would be
// incremental. Moreover, lattice is put before quasi_state
// because we want to construct lattice first. Lattices
// can do some kind of dimension sanity check (as in
// dimension_assert below), and if that fails then we don't
// need to do any more work.
private:
std::size_t curr_elem;
size_type seq_count;
protected:
LatticeT lattice;
private:
state_type quasi_state;
};
inline void dimension_assert(const char* generator, std::size_t dim, std::size_t maxdim)
{
if (!dim || dim > maxdim)
{
std::ostringstream os;
os << "The " << generator << " quasi-random number generator only supports dimensions in range [1; "
<< maxdim << "], but dimension " << dim << " was supplied.";
boost::throw_exception( std::invalid_argument(os.str()) );
}
}
} // namespace qrng_detail
} // namespace random
} // namespace boost
#include <boost/random/detail/enable_warnings.hpp>
#endif // BOOST_RANDOM_DETAIL_QRNG_BASE_HPP

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,367 @@
/* boost random/faure.hpp header file
*
* Copyright Justinas Vygintas Daugmaudis 2010-2018
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_RANDOM_FAURE_HPP
#define BOOST_RANDOM_FAURE_HPP
#include <boost/random/detail/qrng_base.hpp>
#include <cmath>
#include <vector>
#include <algorithm>
#include <boost/assert.hpp>
namespace boost {
namespace random {
/** @cond */
namespace detail {
namespace qrng_tables {
// There is no particular reason why 187 first primes were chosen
// to be put into this table. The only reason was, perhaps, that
// the number of dimensions for Faure generator would be around
// the same order of magnitude as the number of dimensions supported
// by the Sobol qrng.
struct primes
{
typedef unsigned short value_type;
BOOST_STATIC_CONSTANT(int, number_of_primes = 187);
// A function that returns lower bound prime for a given n
static value_type lower_bound(std::size_t n)
{
static const value_type prim_a[number_of_primes] = {
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251,
257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619,
631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787,
797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953,
967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031,
1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093,
1097, 1103, 1109, 1117 };
qrng_detail::dimension_assert("Faure", n, prim_a[number_of_primes - 1]);
return *std::lower_bound(prim_a, prim_a + number_of_primes, n);
}
};
} // namespace qrng_tables
} // namespace detail
namespace qrng_detail {
namespace fr {
// Returns the integer part of the logarithm base Base of arg.
// In erroneous situations, e.g., integer_log(base, 0) the function
// returns 0 and does not report the error. This is the intended
// behavior.
template <typename T>
inline T integer_log(T base, T arg)
{
T ilog = T();
while (base <= arg)
{
arg /= base; ++ilog;
}
return ilog;
}
// Perform exponentiation by squaring (potential for code reuse in multiprecision::powm)
template <typename T>
inline T integer_pow(T base, T e)
{
T result = static_cast<T>(1);
while (e)
{
if (e & static_cast<T>(1))
result *= base;
e >>= 1;
base *= base;
}
return result;
}
} // namespace fr
// Computes a table of binomial coefficients modulo qs.
template<typename RealType, typename SeqSizeT, typename PrimeTable>
struct binomial_coefficients
{
typedef RealType value_type;
typedef SeqSizeT size_type;
// Binomial values modulo qs_base will never be bigger than qs_base.
// We can choose an appropriate integer type to hold modulo values and
// shave off memory footprint.
typedef typename PrimeTable::value_type packed_uint_t;
// default copy c-tor is fine
explicit binomial_coefficients(std::size_t dimension)
{
resize(dimension);
}
void resize(std::size_t dimension)
{
qs_base = PrimeTable::lower_bound(dimension);
// Throw away previously computed coefficients.
// This will trigger recomputation on next update
coeff.clear();
}
template <typename Iterator>
void update(size_type seq, Iterator first, Iterator last)
{
if (first != last)
{
const size_type ilog = fr::integer_log(static_cast<size_type>(qs_base), seq);
const size_type hisum = ilog + 1;
if (coeff.size() != size_hint(hisum)) {
ytemp.resize(static_cast<std::size_t>(hisum)); // cast safe because log is small
compute_coefficients(hisum);
qs_pow = fr::integer_pow(static_cast<size_type>(qs_base), ilog);
}
*first = compute_recip(seq, ytemp.rbegin());
// Find other components using the Faure method.
++first;
for ( ; first != last; ++first)
{
*first = RealType();
RealType r = static_cast<RealType>(1);
for (size_type i = 0; i != hisum; ++i)
{
RealType ztemp = ytemp[static_cast<std::size_t>(i)] * upper_element(i, i, hisum);
for (size_type j = i + 1; j != hisum; ++j)
ztemp += ytemp[static_cast<std::size_t>(j)] * upper_element(i, j, hisum);
// Sum ( J <= I <= HISUM ) ( old ytemp(i) * binom(i,j) ) mod QS.
ytemp[static_cast<std::size_t>(i)] = std::fmod(ztemp, static_cast<RealType>(qs_base));
r *= static_cast<RealType>(qs_base);
*first += ytemp[static_cast<std::size_t>(i)] / r;
}
}
}
}
private:
inline static size_type size_hint(size_type n)
{
return n * (n + 1) / 2;
}
packed_uint_t& upper_element(size_type i, size_type j, size_type dim)
{
BOOST_ASSERT( i < dim );
BOOST_ASSERT( j < dim );
BOOST_ASSERT( i <= j );
return coeff[static_cast<std::size_t>((i * (2 * dim - i + 1)) / 2 + j - i)];
}
template<typename Iterator>
RealType compute_recip(size_type seq, Iterator out) const
{
// Here we do
// Sum ( 0 <= J <= HISUM ) YTEMP(J) * QS**J
// Sum ( 0 <= J <= HISUM ) YTEMP(J) / QS**(J+1)
// in one go
RealType r = RealType();
size_type m, k = qs_pow;
for( ; k != 0; ++out, seq = m, k /= qs_base )
{
m = seq % k;
RealType v = static_cast<RealType>((seq - m) / k); // RealType <- size type
r += v;
r /= static_cast<RealType>(qs_base);
*out = v; // saves double dereference
}
return r;
}
void compute_coefficients(const size_type n)
{
// Resize and initialize to zero
coeff.resize(static_cast<std::size_t>(size_hint(n)));
std::fill(coeff.begin(), coeff.end(), packed_uint_t());
// The first row and the diagonal is assigned to 1
upper_element(0, 0, n) = 1;
for (size_type i = 1; i < n; ++i)
{
upper_element(0, i, n) = 1;
upper_element(i, i, n) = 1;
}
// Computes binomial coefficients MOD qs_base
for (size_type i = 1; i < n; ++i)
{
for (size_type j = i + 1; j < n; ++j)
{
upper_element(i, j, n) = ( upper_element(i, j-1, n) +
upper_element(i-1, j-1, n) ) % qs_base;
}
}
}
private:
packed_uint_t qs_base;
// here we cache precomputed data; note that binomial coefficients have
// to be recomputed iff the integer part of the logarithm of seq changes,
// which happens relatively rarely.
std::vector<packed_uint_t> coeff; // packed upper (!) triangular matrix
std::vector<RealType> ytemp;
size_type qs_pow;
};
} // namespace qrng_detail
typedef detail::qrng_tables::primes default_faure_prime_table;
/** @endcond */
//!Instantiations of class template faure_engine model a \quasi_random_number_generator.
//!The faure_engine uses the algorithm described in
//! \blockquote
//!Henri Faure,
//!Discrepance de suites associees a un systeme de numeration (en dimension s),
//!Acta Arithmetica,
//!Volume 41, 1982, pages 337-351.
//! \endblockquote
//
//! \blockquote
//!Bennett Fox,
//!Algorithm 647:
//!Implementation and Relative Efficiency of Quasirandom
//!Sequence Generators,
//!ACM Transactions on Mathematical Software,
//!Volume 12, Number 4, December 1986, pages 362-376.
//! \endblockquote
//!
//!In the following documentation @c X denotes the concrete class of the template
//!faure_engine returning objects of type @c RealType, u and v are the values of @c X.
//!
//!Some member functions may throw exceptions of type @c std::bad_alloc.
template<typename RealType, typename SeqSizeT, typename PrimeTable = default_faure_prime_table>
class faure_engine
: public qrng_detail::qrng_base<
faure_engine<RealType, SeqSizeT, PrimeTable>
, qrng_detail::binomial_coefficients<RealType, SeqSizeT, PrimeTable>
, SeqSizeT
>
{
typedef faure_engine<RealType, SeqSizeT, PrimeTable> self_t;
typedef qrng_detail::binomial_coefficients<RealType, SeqSizeT, PrimeTable> lattice_t;
typedef qrng_detail::qrng_base<self_t, lattice_t, SeqSizeT> base_t;
friend class qrng_detail::qrng_base<self_t, lattice_t, SeqSizeT>;
public:
typedef RealType result_type;
/** @copydoc boost::random::niederreiter_base2_engine::min() */
static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return static_cast<result_type>(0); }
/** @copydoc boost::random::niederreiter_base2_engine::max() */
static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return static_cast<result_type>(1); }
//!Effects: Constructs the `s`-dimensional default Faure quasi-random number generator.
//!
//!Throws: bad_alloc, invalid_argument.
explicit faure_engine(std::size_t s)
: base_t(s) // initialize the binomial table here
{}
/** @copydetails boost::random::niederreiter_base2_engine::seed(UIntType)
* Throws: bad_alloc.
*/
void seed(SeqSizeT init = 0)
{
compute_seq(init);
base_t::reset_seq(init);
}
#ifdef BOOST_RANDOM_DOXYGEN
//=========================Doxygen needs this!==============================
/** @copydoc boost::random::niederreiter_base2_engine::dimension() */
std::size_t dimension() const { return base_t::dimension(); }
/** @copydoc boost::random::niederreiter_base2_engine::operator()() */
result_type operator()()
{
return base_t::operator()();
}
/** @copydoc boost::random::niederreiter_base2_engine::discard(boost::uintmax_t)
* Throws: bad_alloc.
*/
void discard(boost::uintmax_t z)
{
base_t::discard(z);
}
/** Returns true if the two generators will produce identical sequences of outputs. */
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(faure_engine, x, y)
{ return static_cast<const base_t&>(x) == y; }
/** Returns true if the two generators will produce different sequences of outputs. */
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(faure_engine)
/** Writes the textual representation of the generator to a @c std::ostream. */
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, faure_engine, s)
{ return os << static_cast<const base_t&>(s); }
/** Reads the textual representation of the generator from a @c std::istream. */
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, faure_engine, s)
{ return is >> static_cast<base_t&>(s); }
#endif // BOOST_RANDOM_DOXYGEN
private:
/** @cond hide_private_members */
void compute_seq(SeqSizeT seq)
{
qrng_detail::check_seed_sign(seq);
this->lattice.update(seq, this->state_begin(), this->state_end());
}
/** @endcond */
};
/**
* @attention This specialization of \faure_engine supports up to 1117 dimensions.
*
* However, it is possible to provide your own prime table to \faure_engine should the default one be insufficient.
*/
typedef faure_engine<double, boost::uint_least64_t, default_faure_prime_table> faure;
} // namespace random
} // namespace boost
#endif // BOOST_RANDOM_FAURE_HPP

View File

@@ -0,0 +1,360 @@
/* boost random/nierderreiter_base2.hpp header file
*
* Copyright Justinas Vygintas Daugmaudis 2010-2018
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_RANDOM_NIEDERREITER_BASE2_HPP
#define BOOST_RANDOM_NIEDERREITER_BASE2_HPP
#include <boost/random/detail/niederreiter_base2_table.hpp>
#include <boost/random/detail/gray_coded_qrng.hpp>
#include <boost/dynamic_bitset.hpp>
namespace boost {
namespace random {
/** @cond */
namespace qrng_detail {
namespace nb2 {
// Return the base 2 logarithm for a given bitset v
template <typename DynamicBitset>
inline typename DynamicBitset::size_type
bitset_log2(const DynamicBitset& v)
{
if (v.none())
boost::throw_exception( std::invalid_argument("bitset_log2") );
typename DynamicBitset::size_type hibit = v.size() - 1;
while (!v.test(hibit))
--hibit;
return hibit;
}
// Multiply polynomials over Z_2.
template <typename PolynomialT, typename DynamicBitset>
inline void modulo2_multiply(PolynomialT P, DynamicBitset& v, DynamicBitset& pt)
{
pt.reset(); // pt == 0
for (; P; P >>= 1, v <<= 1)
if (P & 1) pt ^= v;
pt.swap(v);
}
// Calculate the values of the constants V(J,R) as
// described in BFN section 3.3.
//
// pb = polynomial defined in section 2.3 of BFN.
template <typename DynamicBitset>
inline void calculate_v(const DynamicBitset& pb,
typename DynamicBitset::size_type kj,
typename DynamicBitset::size_type pb_degree,
DynamicBitset& v)
{
typedef typename DynamicBitset::size_type size_type;
// Now choose values of V in accordance with
// the conditions in section 3.3.
size_type r = 0;
for ( ; r != kj; ++r)
v.reset(r);
// Quoting from BFN: "Our program currently sets each K_q
// equal to eq. This has the effect of setting all unrestricted
// values of v to 1."
for ( ; r < pb_degree; ++r)
v.set(r);
// Calculate the remaining V's using the recursion of section 2.3,
// remembering that the B's have the opposite sign.
for ( ; r != v.size(); ++r)
{
bool term = false;
for (typename DynamicBitset::size_type k = 0; k < pb_degree; ++k)
{
term ^= pb.test(k) & v[r + k - pb_degree];
}
v[r] = term;
}
}
} // namespace nb2
template<typename UIntType, unsigned w, typename Nb2Table>
struct niederreiter_base2_lattice
{
typedef UIntType value_type;
BOOST_STATIC_ASSERT(w > 0u);
BOOST_STATIC_CONSTANT(unsigned, bit_count = w);
private:
typedef std::vector<value_type> container_type;
public:
explicit niederreiter_base2_lattice(std::size_t dimension)
{
resize(dimension);
}
void resize(std::size_t dimension)
{
typedef boost::dynamic_bitset<> bitset_type;
dimension_assert("Niederreiter base 2", dimension, Nb2Table::max_dimension);
// Initialize the bit array
container_type cj(bit_count * dimension);
// Reserve temporary space for lattice computation
bitset_type v, pb, tmp;
// Compute Niedderreiter base 2 lattice
for (std::size_t dim = 0; dim != dimension; ++dim)
{
const typename Nb2Table::value_type poly = Nb2Table::polynomial(dim);
if (poly > std::numeric_limits<value_type>::max()) {
boost::throw_exception( std::range_error("niederreiter_base2: polynomial value outside the given value type range") );
}
const unsigned degree = multiprecision::msb(poly); // integer log2(poly)
const unsigned space_required = degree * ((bit_count / degree) + 1); // ~ degree + bit_count
v.resize(degree + bit_count - 1);
// For each dimension, we need to calculate powers of an
// appropriate irreducible polynomial, see Niederreiter
// page 65, just below equation (19).
// Copy the appropriate irreducible polynomial into PX,
// and its degree into E. Set polynomial B = PX ** 0 = 1.
// M is the degree of B. Subsequently B will hold higher
// powers of PX.
pb.resize(space_required); tmp.resize(space_required);
typename bitset_type::size_type kj, pb_degree = 0;
pb.reset(); // pb == 0
pb.set(pb_degree); // set the proper bit for the pb_degree
value_type j = high_bit_mask_t<bit_count - 1>::high_bit;
do
{
// Now choose a value of Kj as defined in section 3.3.
// We must have 0 <= Kj < E*J = M.
// The limit condition on Kj does not seem to be very relevant
// in this program.
kj = pb_degree;
// Now multiply B by PX so B becomes PX**J.
// In section 2.3, the values of Bi are defined with a minus sign :
// don't forget this if you use them later!
nb2::modulo2_multiply(poly, pb, tmp);
pb_degree += degree;
if (pb_degree >= pb.size()) {
// Note that it is quite possible for kj to become bigger than
// the new computed value of pb_degree.
pb_degree = nb2::bitset_log2(pb);
}
// If U = 0, we need to set B to the next power of PX
// and recalculate V.
nb2::calculate_v(pb, kj, pb_degree, v);
// Niederreiter (page 56, after equation (7), defines two
// variables Q and U. We do not need Q explicitly, but we
// do need U.
// Advance Niederreiter's state variables.
for (unsigned u = 0; j && u != degree; ++u, j >>= 1)
{
// Now C is obtained from V. Niederreiter
// obtains A from V (page 65, near the bottom), and then gets
// C from A (page 56, equation (7)). However this can be done
// in one step. Here CI(J,R) corresponds to
// Niederreiter's C(I,J,R), whose values we pack into array
// CJ so that CJ(I,R) holds all the values of C(I,J,R) for J from 1 to NBITS.
for (unsigned r = 0; r != bit_count; ++r) {
value_type& num = cj[dimension * r + dim];
// set the jth bit in num
num = (num & ~j) | (-v[r + u] & j);
}
}
} while (j != 0);
}
bits.swap(cj);
}
typename container_type::const_iterator iter_at(std::size_t n) const
{
BOOST_ASSERT(!(n > bits.size()));
return bits.begin() + n;
}
private:
container_type bits;
};
} // namespace qrng_detail
typedef detail::qrng_tables::niederreiter_base2 default_niederreiter_base2_table;
/** @endcond */
//!Instantiations of class template niederreiter_base2_engine model a \quasi_random_number_generator.
//!The niederreiter_base2_engine uses the algorithm described in
//! \blockquote
//!Bratley, Fox, Niederreiter, ACM Trans. Model. Comp. Sim. 2, 195 (1992).
//! \endblockquote
//!
//!\attention niederreiter_base2_engine skips trivial zeroes at the start of the sequence. For example,
//!the beginning of the 2-dimensional Niederreiter base 2 sequence in @c uniform_01 distribution will look
//!like this:
//!\code{.cpp}
//!0.5, 0.5,
//!0.75, 0.25,
//!0.25, 0.75,
//!0.375, 0.375,
//!0.875, 0.875,
//!...
//!\endcode
//!
//!In the following documentation @c X denotes the concrete class of the template
//!niederreiter_base2_engine returning objects of type @c UIntType, u and v are the values of @c X.
//!
//!Some member functions may throw exceptions of type std::range_error. This
//!happens when the quasi-random domain is exhausted and the generator cannot produce
//!any more values. The length of the low discrepancy sequence is given by
//! \f$L=Dimension \times (2^{w} - 1)\f$.
template<typename UIntType, unsigned w, typename Nb2Table = default_niederreiter_base2_table>
class niederreiter_base2_engine
: public qrng_detail::gray_coded_qrng<
qrng_detail::niederreiter_base2_lattice<UIntType, w, Nb2Table>
>
{
typedef qrng_detail::niederreiter_base2_lattice<UIntType, w, Nb2Table> lattice_t;
typedef qrng_detail::gray_coded_qrng<lattice_t> base_t;
public:
//!Effects: Constructs the default `s`-dimensional Niederreiter base 2 quasi-random number generator.
//!
//!Throws: bad_alloc, invalid_argument, range_error.
explicit niederreiter_base2_engine(std::size_t s)
: base_t(s) // initialize lattice here
{}
#ifdef BOOST_RANDOM_DOXYGEN
//=========================Doxygen needs this!==============================
typedef UIntType result_type;
//!Returns: Tight lower bound on the set of values returned by operator().
//!
//!Throws: nothing.
static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return (base_t::min)(); }
//!Returns: Tight upper bound on the set of values returned by operator().
//!
//!Throws: nothing.
static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return (base_t::max)(); }
//!Returns: The dimension of of the quasi-random domain.
//!
//!Throws: nothing.
std::size_t dimension() const { return base_t::dimension(); }
//!Effects: Resets the quasi-random number generator state to
//!the one given by the default construction. Equivalent to u.seed(0).
//!
//!\brief Throws: nothing.
void seed()
{
base_t::seed();
}
//!Effects: Effectively sets the quasi-random number generator state to the `init`-th
//!vector in the `s`-dimensional quasi-random domain, where `s` == X::dimension().
//!\code
//!X u, v;
//!for(int i = 0; i < N; ++i)
//! for( std::size_t j = 0; j < u.dimension(); ++j )
//! u();
//!v.seed(N);
//!assert(u() == v());
//!\endcode
//!
//!\brief Throws: range_error.
void seed(UIntType init)
{
base_t::seed(init);
}
//!Returns: Returns a successive element of an `s`-dimensional
//!(s = X::dimension()) vector at each invocation. When all elements are
//!exhausted, X::operator() begins anew with the starting element of a
//!subsequent `s`-dimensional vector.
//!
//!Throws: range_error.
result_type operator()()
{
return base_t::operator()();
}
//!Effects: Advances *this state as if `z` consecutive
//!X::operator() invocations were executed.
//!\code
//!X u = v;
//!for(int i = 0; i < N; ++i)
//! u();
//!v.discard(N);
//!assert(u() == v());
//!\endcode
//!
//!Throws: range_error.
void discard(boost::uintmax_t z)
{
base_t::discard(z);
}
//!Returns true if the two generators will produce identical sequences of outputs.
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(niederreiter_base2_engine, x, y)
{ return static_cast<const base_t&>(x) == y; }
//!Returns true if the two generators will produce different sequences of outputs.
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(niederreiter_base2_engine)
//!Writes the textual representation of the generator to a @c std::ostream.
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, niederreiter_base2_engine, s)
{ return os << static_cast<const base_t&>(s); }
//!Reads the textual representation of the generator from a @c std::istream.
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, niederreiter_base2_engine, s)
{ return is >> static_cast<base_t&>(s); }
#endif // BOOST_RANDOM_DOXYGEN
};
/**
* @attention This specialization of \niederreiter_base2_engine supports up to 4720 dimensions.
*
* Binary irreducible polynomials (primes in the ring `GF(2)[X]`, evaluated at `X=2`) were generated
* while condition `max(prime)` < 2<sup>16</sup> was satisfied.
*
* There are exactly 4720 such primes, which yields a Niederreiter base 2 table for 4720 dimensions.
*
* However, it is possible to provide your own table to \niederreiter_base2_engine should the default one be insufficient.
*/
typedef niederreiter_base2_engine<boost::uint_least64_t, 64u, default_niederreiter_base2_table> niederreiter_base2;
} // namespace random
} // namespace boost
#endif // BOOST_RANDOM_NIEDERREITER_BASE2_HPP

View File

@@ -0,0 +1,237 @@
/* boost random/sobol.hpp header file
*
* Copyright Justinas Vygintas Daugmaudis 2010-2018
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_RANDOM_SOBOL_HPP
#define BOOST_RANDOM_SOBOL_HPP
#include <boost/random/detail/sobol_table.hpp>
#include <boost/random/detail/gray_coded_qrng.hpp>
namespace boost {
namespace random {
/** @cond */
namespace qrng_detail {
// sobol_lattice sets up the random-number generator to produce a Sobol
// sequence of at most max dims-dimensional quasi-random vectors.
// Adapted from ACM TOMS algorithm 659, see
// http://doi.acm.org/10.1145/42288.214372
template<typename UIntType, unsigned w, typename SobolTables>
struct sobol_lattice
{
typedef UIntType value_type;
BOOST_STATIC_ASSERT(w > 0u);
BOOST_STATIC_CONSTANT(unsigned, bit_count = w);
private:
typedef std::vector<value_type> container_type;
public:
explicit sobol_lattice(std::size_t dimension)
{
resize(dimension);
}
// default copy c-tor is fine
void resize(std::size_t dimension)
{
dimension_assert("Sobol", dimension, SobolTables::max_dimension);
// Initialize the bit array
container_type cj(bit_count * dimension);
// Initialize direction table in dimension 0
for (unsigned k = 0; k != bit_count; ++k)
cj[dimension*k] = static_cast<value_type>(1);
// Initialize in remaining dimensions.
for (std::size_t dim = 1; dim < dimension; ++dim)
{
const typename SobolTables::value_type poly = SobolTables::polynomial(dim-1);
if (poly > std::numeric_limits<value_type>::max()) {
boost::throw_exception( std::range_error("sobol: polynomial value outside the given value type range") );
}
const unsigned degree = multiprecision::msb(poly); // integer log2(poly)
// set initial values of m from table
for (unsigned k = 0; k != degree; ++k)
cj[dimension*k + dim] = SobolTables::minit(dim-1, k);
// Calculate remaining elements for this dimension,
// as explained in Bratley+Fox, section 2.
for (unsigned j = degree; j < bit_count; ++j)
{
typename SobolTables::value_type p_i = poly;
const std::size_t bit_offset = dimension*j + dim;
cj[bit_offset] = cj[dimension*(j-degree) + dim];
for (unsigned k = 0; k != degree; ++k, p_i >>= 1)
{
int rem = degree - k;
cj[bit_offset] ^= ((p_i & 1) * cj[dimension*(j-rem) + dim]) << rem;
}
}
}
// Shift columns by appropriate power of 2.
unsigned p = 1u;
for (int j = bit_count-1-1; j >= 0; --j, ++p)
{
const std::size_t bit_offset = dimension * j;
for (std::size_t dim = 0; dim != dimension; ++dim)
cj[bit_offset + dim] <<= p;
}
bits.swap(cj);
}
typename container_type::const_iterator iter_at(std::size_t n) const
{
BOOST_ASSERT(!(n > bits.size()));
return bits.begin() + n;
}
private:
container_type bits;
};
} // namespace qrng_detail
typedef detail::qrng_tables::sobol default_sobol_table;
/** @endcond */
//!Instantiations of class template sobol_engine model a \quasi_random_number_generator.
//!The sobol_engine uses the algorithm described in
//! \blockquote
//![Bratley+Fox, TOMS 14, 88 (1988)]
//!and [Antonov+Saleev, USSR Comput. Maths. Math. Phys. 19, 252 (1980)]
//! \endblockquote
//!
//!\attention sobol_engine skips trivial zeroes at the start of the sequence. For example, the beginning
//!of the 2-dimensional Sobol sequence in @c uniform_01 distribution will look like this:
//!\code{.cpp}
//!0.5, 0.5,
//!0.75, 0.25,
//!0.25, 0.75,
//!0.375, 0.375,
//!0.875, 0.875,
//!...
//!\endcode
//!
//!In the following documentation @c X denotes the concrete class of the template
//!sobol_engine returning objects of type @c UIntType, u and v are the values of @c X.
//!
//!Some member functions may throw exceptions of type @c std::range_error. This
//!happens when the quasi-random domain is exhausted and the generator cannot produce
//!any more values. The length of the low discrepancy sequence is given by \f$L=Dimension \times (2^{w} - 1)\f$.
template<typename UIntType, unsigned w, typename SobolTables = default_sobol_table>
class sobol_engine
: public qrng_detail::gray_coded_qrng<
qrng_detail::sobol_lattice<UIntType, w, SobolTables>
>
{
typedef qrng_detail::sobol_lattice<UIntType, w, SobolTables> lattice_t;
typedef qrng_detail::gray_coded_qrng<lattice_t> base_t;
public:
//!Effects: Constructs the default `s`-dimensional Sobol quasi-random number generator.
//!
//!Throws: bad_alloc, invalid_argument, range_error.
explicit sobol_engine(std::size_t s)
: base_t(s)
{}
// default copy c-tor is fine
#ifdef BOOST_RANDOM_DOXYGEN
//=========================Doxygen needs this!==============================
typedef UIntType result_type;
/** @copydoc boost::random::niederreiter_base2_engine::min() */
static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return (base_t::min)(); }
/** @copydoc boost::random::niederreiter_base2_engine::max() */
static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return (base_t::max)(); }
/** @copydoc boost::random::niederreiter_base2_engine::dimension() */
std::size_t dimension() const { return base_t::dimension(); }
/** @copydoc boost::random::niederreiter_base2_engine::seed() */
void seed()
{
base_t::seed();
}
/** @copydoc boost::random::niederreiter_base2_engine::seed(UIntType) */
void seed(UIntType init)
{
base_t::seed(init);
}
/** @copydoc boost::random::niederreiter_base2_engine::operator()() */
result_type operator()()
{
return base_t::operator()();
}
/** @copydoc boost::random::niederreiter_base2_engine::discard(boost::uintmax_t) */
void discard(boost::uintmax_t z)
{
base_t::discard(z);
}
/** Returns true if the two generators will produce identical sequences of outputs. */
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(sobol_engine, x, y)
{ return static_cast<const base_t&>(x) == y; }
/** Returns true if the two generators will produce different sequences of outputs. */
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(sobol_engine)
/** Writes the textual representation of the generator to a @c std::ostream. */
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, sobol_engine, s)
{ return os << static_cast<const base_t&>(s); }
/** Reads the textual representation of the generator from a @c std::istream. */
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, sobol_engine, s)
{ return is >> static_cast<base_t&>(s); }
#endif // BOOST_RANDOM_DOXYGEN
};
/**
* @attention This specialization of \sobol_engine supports up to 3667 dimensions.
*
* Data on the primitive binary polynomials `a` and the corresponding starting values `m`
* for Sobol sequences in up to 21201 dimensions was taken from
*
* @blockquote
* S. Joe and F. Y. Kuo, Constructing Sobol sequences with better two-dimensional projections,
* SIAM J. Sci. Comput. 30, 2635-2654 (2008).
* @endblockquote
*
* See the original tables up to dimension 21201: https://web.archive.org/web/20170802022909/http://web.maths.unsw.edu.au/~fkuo/sobol/new-joe-kuo-6.21201
*
* For practical reasons the default table uses only the subset of binary polynomials `a` < 2<sup>16</sup>.
*
* However, it is possible to provide your own table to \sobol_engine should the default one be insufficient.
*/
typedef sobol_engine<boost::uint_least64_t, 64u, default_sobol_table> sobol;
} // namespace random
} // namespace boost
#endif // BOOST_RANDOM_SOBOL_HPP

View File

@@ -55,6 +55,10 @@ run test_lagged_fibonacci23209.cpp /boost//unit_test_framework ;
run test_lagged_fibonacci44497.cpp /boost//unit_test_framework ;
run test_zero_seed.cpp /boost//unit_test_framework ;
run niederreiter_base2_validate.cpp /boost//unit_test_framework ;
run sobol_validate.cpp /boost//unit_test_framework ;
run faure_validate.cpp /boost//unit_test_framework ;
# Disable by default. These don't add much and the larger
# ones can overflow the stack.
explicit test_lagged_fibonacci1279 test_lagged_fibonacci2281

375
test/faure_validate.cpp Normal file
View File

@@ -0,0 +1,375 @@
// Copyright Justinas Vygintas Daugmaudis, 2010.
// Use, modification and distribution is subject to the
// Boost Software License, Version 1.0. (See accompanying
// file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
#include <boost/random/faure.hpp>
#include <boost/utility.hpp>
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include "test_qrng_functions.hpp"
//
// DESCRIPTION:
// ~~~~~~~~~~~~
//
// This file tests the faure quasi-random number generator.
// These tests compare our results with values produced by the original
// version of ACM TOMS Algorithm 647, which is available in the
// TOMS subdirectory in http://www.netlib.org
//
// For independently generated datasets look at http://people.sc.fsu.edu/~jburkardt/datasets/faure/
// Spatial dimension: 2
// N: 100
// Base: 2
// Vectors skipped: 15
static const double faure_02_100[100][2] =
{
{ 0.9375000000, 0.0625000000 },
{ 0.0312500000, 0.5312500000 },
{ 0.5312500000, 0.0312500000 },
{ 0.2812500000, 0.2812500000 },
{ 0.7812500000, 0.7812500000 },
{ 0.1562500000, 0.1562500000 },
{ 0.6562500000, 0.6562500000 },
{ 0.4062500000, 0.9062500000 },
{ 0.9062500000, 0.4062500000 },
{ 0.0937500000, 0.4687500000 },
{ 0.5937500000, 0.9687500000 },
{ 0.3437500000, 0.7187500000 },
{ 0.8437500000, 0.2187500000 },
{ 0.2187500000, 0.8437500000 },
{ 0.7187500000, 0.3437500000 },
{ 0.4687500000, 0.0937500000 },
{ 0.9687500000, 0.5937500000 },
{ 0.0156250000, 0.7968750000 },
{ 0.5156250000, 0.2968750000 },
{ 0.2656250000, 0.0468750000 },
{ 0.7656250000, 0.5468750000 },
{ 0.1406250000, 0.4218750000 },
{ 0.6406250000, 0.9218750000 },
{ 0.3906250000, 0.6718750000 },
{ 0.8906250000, 0.1718750000 },
{ 0.0781250000, 0.2343750000 },
{ 0.5781250000, 0.7343750000 },
{ 0.3281250000, 0.9843750000 },
{ 0.8281250000, 0.4843750000 },
{ 0.2031250000, 0.6093750000 },
{ 0.7031250000, 0.1093750000 },
{ 0.4531250000, 0.3593750000 },
{ 0.9531250000, 0.8593750000 },
{ 0.0468750000, 0.2656250000 },
{ 0.5468750000, 0.7656250000 },
{ 0.2968750000, 0.5156250000 },
{ 0.7968750000, 0.0156250000 },
{ 0.1718750000, 0.8906250000 },
{ 0.6718750000, 0.3906250000 },
{ 0.4218750000, 0.1406250000 },
{ 0.9218750000, 0.6406250000 },
{ 0.1093750000, 0.7031250000 },
{ 0.6093750000, 0.2031250000 },
{ 0.3593750000, 0.4531250000 },
{ 0.8593750000, 0.9531250000 },
{ 0.2343750000, 0.0781250000 },
{ 0.7343750000, 0.5781250000 },
{ 0.4843750000, 0.8281250000 },
{ 0.9843750000, 0.3281250000 },
{ 0.0078125000, 0.6640625000 },
{ 0.5078125000, 0.1640625000 },
{ 0.2578125000, 0.4140625000 },
{ 0.7578125000, 0.9140625000 },
{ 0.1328125000, 0.0390625000 },
{ 0.6328125000, 0.5390625000 },
{ 0.3828125000, 0.7890625000 },
{ 0.8828125000, 0.2890625000 },
{ 0.0703125000, 0.3515625000 },
{ 0.5703125000, 0.8515625000 },
{ 0.3203125000, 0.6015625000 },
{ 0.8203125000, 0.1015625000 },
{ 0.1953125000, 0.9765625000 },
{ 0.6953125000, 0.4765625000 },
{ 0.4453125000, 0.2265625000 },
{ 0.9453125000, 0.7265625000 },
{ 0.0390625000, 0.1328125000 },
{ 0.5390625000, 0.6328125000 },
{ 0.2890625000, 0.8828125000 },
{ 0.7890625000, 0.3828125000 },
{ 0.1640625000, 0.5078125000 },
{ 0.6640625000, 0.0078125000 },
{ 0.4140625000, 0.2578125000 },
{ 0.9140625000, 0.7578125000 },
{ 0.1015625000, 0.8203125000 },
{ 0.6015625000, 0.3203125000 },
{ 0.3515625000, 0.0703125000 },
{ 0.8515625000, 0.5703125000 },
{ 0.2265625000, 0.4453125000 },
{ 0.7265625000, 0.9453125000 },
{ 0.4765625000, 0.6953125000 },
{ 0.9765625000, 0.1953125000 },
{ 0.0234375000, 0.3984375000 },
{ 0.5234375000, 0.8984375000 },
{ 0.2734375000, 0.6484375000 },
{ 0.7734375000, 0.1484375000 },
{ 0.1484375000, 0.7734375000 },
{ 0.6484375000, 0.2734375000 },
{ 0.3984375000, 0.0234375000 },
{ 0.8984375000, 0.5234375000 },
{ 0.0859375000, 0.5859375000 },
{ 0.5859375000, 0.0859375000 },
{ 0.3359375000, 0.3359375000 },
{ 0.8359375000, 0.8359375000 },
{ 0.2109375000, 0.2109375000 },
{ 0.7109375000, 0.7109375000 },
{ 0.4609375000, 0.9609375000 },
{ 0.9609375000, 0.4609375000 },
{ 0.0546875000, 0.9296875000 },
{ 0.5546875000, 0.4296875000 },
{ 0.3046875000, 0.1796875000 }
};
// Spatial dimension: 7
// N: 100
// Base: 7
// Vectors skipped: 2400
static const double faure_07_100[100][7] =
{
{ 0.9995835069, 0.4602249063, 0.9412744690, 0.3202832153, 0.9850062474, 0.8334027489, 0.1103706789 },
{ 0.0000594990, 0.2437079788, 0.3765692866, 0.6493722854, 0.6685309692, 0.3582435890, 0.2228833224 },
{ 0.1429166419, 0.3865651217, 0.5194264295, 0.7922294282, 0.8113881121, 0.5011007318, 0.3657404653 },
{ 0.2857737847, 0.5294222645, 0.6622835723, 0.9350865711, 0.9542452550, 0.6439578747, 0.5085976081 },
{ 0.4286309276, 0.6722794074, 0.8051407152, 0.0779437139, 0.0971023978, 0.7868150176, 0.6514547510 },
{ 0.5714880704, 0.8151365502, 0.9479978580, 0.2208008568, 0.2399595407, 0.9296721604, 0.7943118939 },
{ 0.7143452133, 0.9579936931, 0.0908550009, 0.3636579996, 0.3828166835, 0.0725293033, 0.9371690367 },
{ 0.8572023562, 0.1008508360, 0.2337121437, 0.5065151425, 0.5256738264, 0.2153864461, 0.0800261796 },
{ 0.0204676623, 0.4069732849, 0.6826917356, 0.0983518772, 0.2603677039, 0.0929374665, 0.1004343428 },
{ 0.1633248051, 0.5498304278, 0.8255488784, 0.2412090201, 0.4032248468, 0.2357946094, 0.2432914857 },
{ 0.3061819480, 0.6926875707, 0.9684060213, 0.3840661629, 0.5460819896, 0.3786517522, 0.3861486285 },
{ 0.4490390909, 0.8355447135, 0.1112631642, 0.5269233058, 0.6889391325, 0.5215088951, 0.5290057714 },
{ 0.5918962337, 0.9784018564, 0.2541203070, 0.6697804486, 0.8317962754, 0.6643660380, 0.6718629143 },
{ 0.7347533766, 0.1212589992, 0.3969774499, 0.8126375915, 0.9746534182, 0.8072231808, 0.8147200571 },
{ 0.8776105194, 0.2641161421, 0.5398345927, 0.9554947343, 0.1175105611, 0.9500803237, 0.9575772000 },
{ 0.0408758255, 0.5702385911, 0.9888141846, 0.5473314690, 0.8522044386, 0.8276313441, 0.9779853632 },
{ 0.1837329684, 0.7130957339, 0.1316713274, 0.6901886119, 0.9950615815, 0.9704884869, 0.1208425061 },
{ 0.3265901113, 0.8559528768, 0.2745284703, 0.8330457547, 0.1379187243, 0.1133456298, 0.2636996490 },
{ 0.4694472541, 0.9988100196, 0.4173856131, 0.9759028976, 0.2807758672, 0.2562027727, 0.4065567918 },
{ 0.6123043970, 0.1416671625, 0.5602427560, 0.1187600405, 0.4236330101, 0.3990599155, 0.5494139347 },
{ 0.7551615398, 0.2845243053, 0.7030998989, 0.2616171833, 0.5664901529, 0.5419170584, 0.6922710775 },
{ 0.8980186827, 0.4273814482, 0.8459570417, 0.4044743262, 0.7093472958, 0.6847742012, 0.8351282204 },
{ 0.0612839888, 0.5906467543, 0.1520794907, 0.9963110609, 0.3011840305, 0.5623252216, 0.8555363836 },
{ 0.2041411317, 0.7335038972, 0.2949366335, 0.1391682037, 0.4440411733, 0.7051823645, 0.9983935265 },
{ 0.3469982745, 0.8763610400, 0.4377937764, 0.2820253466, 0.5868983162, 0.8480395073, 0.1412506694 },
{ 0.4898554174, 0.0192181829, 0.5806509193, 0.4248824894, 0.7297554590, 0.9908966502, 0.2841078122 },
{ 0.6327125602, 0.1620753258, 0.7235080621, 0.5677396323, 0.8726126019, 0.1337537931, 0.4269649551 },
{ 0.7755697031, 0.3049324686, 0.8663652050, 0.7105967752, 0.0154697447, 0.2766109359, 0.5698220979 },
{ 0.9184268460, 0.4477896115, 0.0092223478, 0.8534539180, 0.1583268876, 0.4194680788, 0.7126792408 },
{ 0.0816921521, 0.7539120605, 0.4582019397, 0.3024335098, 0.8930207652, 0.1541619563, 0.5902302612 },
{ 0.2245492949, 0.8967692033, 0.6010590825, 0.4452906527, 0.0358779080, 0.2970190992, 0.7330874041 },
{ 0.3674064378, 0.0396263462, 0.7439162254, 0.5881477956, 0.1787350509, 0.4398762420, 0.8759445469 },
{ 0.5102635807, 0.1824834890, 0.8867733682, 0.7310049384, 0.3215921937, 0.5827333849, 0.0188016898 },
{ 0.6531207235, 0.3253406319, 0.0296305111, 0.8738620813, 0.4644493366, 0.7255905278, 0.1616588326 },
{ 0.7959778664, 0.4681977747, 0.1724876540, 0.0167192241, 0.6073064794, 0.8684476706, 0.3045159755 },
{ 0.9388350092, 0.6110549176, 0.3153447968, 0.1595763670, 0.7501636223, 0.0113048135, 0.4473731183 },
{ 0.1021003153, 0.9171773666, 0.7643243886, 0.7514131017, 0.4848574999, 0.8888558339, 0.4677812816 },
{ 0.2449574582, 0.0600345094, 0.9071815315, 0.8942702445, 0.6277146427, 0.0317129767, 0.6106384245 },
{ 0.3878146011, 0.2028916523, 0.0500386744, 0.0371273874, 0.7705717856, 0.1745701196, 0.7534955673 },
{ 0.5306717439, 0.3457487951, 0.1928958172, 0.1799845303, 0.9134289284, 0.3174272625, 0.8963527102 },
{ 0.6735288868, 0.4886059380, 0.3357529601, 0.3228416731, 0.0562860713, 0.4602844053, 0.0392098530 },
{ 0.8163860296, 0.6314630809, 0.4786101029, 0.4656988160, 0.1991432141, 0.6031415482, 0.1820669959 },
{ 0.9592431725, 0.7743202237, 0.6214672458, 0.6085559588, 0.3420003570, 0.7459986910, 0.3249241388 },
{ 0.1225084786, 0.0804426727, 0.0704468376, 0.2003926935, 0.0766942345, 0.6235497114, 0.3453323020 },
{ 0.2653656215, 0.2232998156, 0.2133039805, 0.3432498364, 0.2195513774, 0.7664068543, 0.4881894449 },
{ 0.4082227643, 0.3661569584, 0.3561611233, 0.4861069792, 0.3624085203, 0.9092639971, 0.6310465877 },
{ 0.5510799072, 0.5090141013, 0.4990182662, 0.6289641221, 0.5052656631, 0.0521211400, 0.7739037306 },
{ 0.6939370500, 0.6518712441, 0.6418754091, 0.7718212649, 0.6481228060, 0.1949782829, 0.9167608734 },
{ 0.8367941929, 0.7947283870, 0.7847325519, 0.9146784078, 0.7909799488, 0.3378354257, 0.0596180163 },
{ 0.9796513358, 0.9375855298, 0.9275896948, 0.0575355507, 0.9338370917, 0.4806925686, 0.2024751592 },
{ 0.0029749509, 0.4098887368, 0.8896888201, 0.9175938597, 0.9775688701, 0.9938121021, 0.3074314274 },
{ 0.1458320938, 0.5527458797, 0.0325459630, 0.0604510026, 0.1204260130, 0.1366692450, 0.4502885702 },
{ 0.2886892366, 0.6956030226, 0.1754031058, 0.2033081454, 0.2632831558, 0.2795263878, 0.5931457131 },
{ 0.4315463795, 0.8384601654, 0.3182602487, 0.3461652883, 0.4061402987, 0.4223835307, 0.7360028560 },
{ 0.5744035223, 0.9813173083, 0.4611173916, 0.4890224311, 0.5489974415, 0.5652406735, 0.8788599988 },
{ 0.7172606652, 0.1241744511, 0.6039745344, 0.6318795740, 0.6918545844, 0.7080978164, 0.0217171417 },
{ 0.8601178081, 0.2670315940, 0.7468316773, 0.7747367168, 0.8347117273, 0.8509549592, 0.1645742845 },
{ 0.0233831142, 0.4302969001, 0.1958112691, 0.3665734515, 0.5694056048, 0.5856488368, 0.1849824478 },
{ 0.1662402570, 0.5731540430, 0.3386684120, 0.5094305944, 0.7122627477, 0.7285059797, 0.3278395906 },
{ 0.3090973999, 0.7160111858, 0.4815255548, 0.6522877373, 0.8551198905, 0.8713631225, 0.4706967335 },
{ 0.4519545428, 0.8588683287, 0.6243826977, 0.7951448801, 0.9979770334, 0.0142202654, 0.6135538764 },
{ 0.5948116856, 0.0017254715, 0.7672398405, 0.9380020230, 0.1408341762, 0.1570774082, 0.7564110192 },
{ 0.7376688285, 0.1445826144, 0.9100969834, 0.0808591658, 0.2836913191, 0.2999345511, 0.8992681621 },
{ 0.8805259713, 0.2874397572, 0.0529541263, 0.2237163087, 0.4265484620, 0.4427916939, 0.0421253049 },
{ 0.0437912774, 0.5935622062, 0.5019337181, 0.8155530434, 0.0183851966, 0.3203427143, 0.0625334682 },
{ 0.1866484203, 0.7364193491, 0.6447908610, 0.9584101862, 0.1612423395, 0.4631998572, 0.2053906111 },
{ 0.3295055632, 0.8792764919, 0.7876480038, 0.1012673291, 0.3040994824, 0.6060570001, 0.3482477539 },
{ 0.4723627060, 0.0221336348, 0.9305051467, 0.2441244719, 0.4469566252, 0.7489141429, 0.4911048968 },
{ 0.6152198489, 0.1649907777, 0.0733622895, 0.3869816148, 0.5898137681, 0.8917712858, 0.6339620396 },
{ 0.7580769917, 0.3078479205, 0.2162194324, 0.5298387577, 0.7326709109, 0.0346284286, 0.7768191825 },
{ 0.9009341346, 0.4507050634, 0.3590765752, 0.6726959005, 0.8755280538, 0.1774855715, 0.9196763253 },
{ 0.0641994407, 0.7568275123, 0.8080561671, 0.2645326352, 0.6102219313, 0.0550365919, 0.9400844886 },
{ 0.2070565836, 0.8996846552, 0.9509133099, 0.4073897781, 0.7530790742, 0.1978937348, 0.0829416315 },
{ 0.3499137264, 0.0425417981, 0.0937704528, 0.5502469209, 0.8959362171, 0.3407508776, 0.2257987743 },
{ 0.4927708693, 0.1853989409, 0.2366275956, 0.6931040638, 0.0387933599, 0.4836080205, 0.3686559172 },
{ 0.6356280121, 0.3282560838, 0.3794847385, 0.8359612066, 0.1816505028, 0.6264651633, 0.5115130600 },
{ 0.7784851550, 0.4711132266, 0.5223418814, 0.9788183495, 0.3245076456, 0.7693223062, 0.6543702029 },
{ 0.9213422979, 0.6139703695, 0.6651990242, 0.1216754924, 0.4673647885, 0.9121794490, 0.7972273457 },
{ 0.0846076040, 0.9200928185, 0.1141786161, 0.7135122270, 0.2020586660, 0.7897304694, 0.8176355090 },
{ 0.2274647468, 0.0629499613, 0.2570357589, 0.8563693699, 0.3449158089, 0.9325876123, 0.9604926519 },
{ 0.3703218897, 0.2058071042, 0.3998929018, 0.9992265128, 0.4877729517, 0.0754447552, 0.1033497947 },
{ 0.5131790325, 0.3486642470, 0.5427500446, 0.1420836556, 0.6306300946, 0.2183018980, 0.2462069376 },
{ 0.6560361754, 0.4915213899, 0.6856071875, 0.2849407985, 0.7734872375, 0.3611590409, 0.3890640804 },
{ 0.7988933183, 0.6343785328, 0.8284643303, 0.4277979413, 0.9163443803, 0.5040161837, 0.5319212233 },
{ 0.9417504611, 0.7772356756, 0.9713214732, 0.5706550842, 0.0592015232, 0.6468733266, 0.6747783662 },
{ 0.1050157672, 0.0833581246, 0.4203010650, 0.0196346760, 0.7938954007, 0.5244243470, 0.6951865294 },
{ 0.2478729101, 0.2262152674, 0.5631582079, 0.1624918189, 0.9367525436, 0.6672814899, 0.8380436723 },
{ 0.3907300530, 0.3690724103, 0.7060153507, 0.3053489617, 0.0796096864, 0.8101386327, 0.9809008151 },
{ 0.5335871958, 0.5119295532, 0.8488724936, 0.4482061046, 0.2224668293, 0.9529957756, 0.1237579580 },
{ 0.6764443387, 0.6547866960, 0.9917296365, 0.5910632475, 0.3653239722, 0.0958529184, 0.2666151009 },
{ 0.8193014815, 0.7976438389, 0.1345867793, 0.7339203903, 0.5081811150, 0.2387100613, 0.4094722437 },
{ 0.9621586244, 0.9405009817, 0.2774439222, 0.8767775332, 0.6510382579, 0.3815672041, 0.5523293866 },
{ 0.1254239305, 0.2466234307, 0.5835663712, 0.4686142679, 0.3857321354, 0.2591182245, 0.4298804070 },
{ 0.2682810734, 0.3894805736, 0.7264235140, 0.6114714107, 0.5285892783, 0.4019753674, 0.5727375498 },
{ 0.4111382162, 0.5323377164, 0.8692806569, 0.7543285536, 0.6714464211, 0.5448325103, 0.7155946927 },
{ 0.5539953591, 0.6751948593, 0.0121377997, 0.8971856964, 0.8143035640, 0.6876896531, 0.8584518355 },
{ 0.6968525019, 0.8180520021, 0.1549949426, 0.0400428393, 0.9571607068, 0.8305467960, 0.0013089784 },
{ 0.8397096448, 0.9609091450, 0.2978520854, 0.1828999822, 0.1000178497, 0.9734039388, 0.1441661213 },
{ 0.9825667876, 0.1037662879, 0.4407092283, 0.3257571250, 0.2428749926, 0.1162610817, 0.2870232641 },
{ 0.0058904028, 0.4536205153, 0.5456654965, 0.1654072708, 0.2661986077, 0.4865234724, 0.5552448385 }
};
// Spatial dimension: 16
// N: 100
// Base: 17
// Vectors skipped: 83520
static const double faure_16_100[100][16] =
{
{ 0.9999880270, 0.8056057758, 0.1198740437, 0.6486751835, 0.0390680188, 0.8792878438, 0.8198536895, 0.5009039643, 0.6317812287, 0.8007207768, 0.6547814322, 0.8998455478, 0.1276086254, 0.0370326026, 0.2198129812, 0.3230085847 },
{ 0.0000007043, 0.0739342061, 0.9946008647, 0.7862221336, 0.0647149678, 0.7918135418, 0.2862640393, 0.2779667248, 0.9710738476, 0.9743784057, 0.2536854063, 0.2482376746, 0.8023258680, 0.1164384864, 0.8034393604, 0.9496301388 },
{ 0.0588242337, 0.1327577355, 0.0534243941, 0.8450456630, 0.1235384972, 0.8506370712, 0.3450875687, 0.3367902542, 0.0298973770, 0.0332019351, 0.3125089358, 0.3070612041, 0.8611493974, 0.1752620158, 0.8622628899, 0.0084536682 },
{ 0.1176477631, 0.1915812649, 0.1122479236, 0.9038691925, 0.1823620266, 0.9094606006, 0.4039110981, 0.3956137836, 0.0887209064, 0.0920254645, 0.3713324652, 0.3658847335, 0.9199729269, 0.2340855452, 0.9210864193, 0.0672771976 },
{ 0.1764712925, 0.2504047943, 0.1710714530, 0.9626927219, 0.2411855560, 0.9682841300, 0.4627346275, 0.4544373131, 0.1475444358, 0.1508489939, 0.4301559946, 0.4247082629, 0.9787964563, 0.2929090746, 0.9799099487, 0.1261007270 },
{ 0.2352948219, 0.3092283237, 0.2298949824, 0.0215162513, 0.3000090854, 0.0271076594, 0.5215581569, 0.5132608425, 0.2063679652, 0.2096725234, 0.4889795240, 0.4835317923, 0.0376199857, 0.3517326041, 0.0387334781, 0.1849242565 },
{ 0.2941183514, 0.3680518531, 0.2887185118, 0.0803397807, 0.3588326148, 0.0859311888, 0.5803816863, 0.5720843719, 0.2651914946, 0.2684960528, 0.5478030534, 0.5423553217, 0.0964435151, 0.4105561335, 0.0975570075, 0.2437477859 },
{ 0.3529418808, 0.4268753825, 0.3475420412, 0.1391633101, 0.4176561442, 0.1447547183, 0.6392052157, 0.6309079013, 0.3240150240, 0.3273195822, 0.6066265828, 0.6011788511, 0.1552670445, 0.4693796629, 0.1563805369, 0.3025713153 },
{ 0.4117654102, 0.4856989119, 0.4063655706, 0.1979868395, 0.4764796737, 0.2035782477, 0.6980287451, 0.6897314307, 0.3828385535, 0.3861431116, 0.6654501122, 0.6600023805, 0.2140905739, 0.5282031923, 0.2152040663, 0.3613948447 },
{ 0.4705889396, 0.5445224413, 0.4651891000, 0.2568103689, 0.5353032031, 0.2624017771, 0.7568522746, 0.7485549601, 0.4416620829, 0.4449666410, 0.7242736416, 0.7188259099, 0.2729141033, 0.5870267217, 0.2740275957, 0.4202183741 },
{ 0.5294124690, 0.6033459708, 0.5240126294, 0.3156338983, 0.5941267325, 0.3212253065, 0.8156758040, 0.8073784895, 0.5004856123, 0.5037901704, 0.7830971711, 0.7776494393, 0.3317376327, 0.6458502511, 0.3328511251, 0.4790419035 },
{ 0.5882359984, 0.6621695002, 0.5828361589, 0.3744574278, 0.6529502619, 0.3800488359, 0.8744993334, 0.8662020189, 0.5593091417, 0.5626136998, 0.8419207005, 0.8364729688, 0.3905611621, 0.7046737805, 0.3916746546, 0.5378654329 },
{ 0.6470595278, 0.7209930296, 0.6416596883, 0.4332809572, 0.7117737913, 0.4388723653, 0.9333228628, 0.9250255483, 0.6181326711, 0.6214372292, 0.9007442299, 0.8952964982, 0.4493846916, 0.7634973099, 0.4504981840, 0.5966889623 },
{ 0.7058830572, 0.7798165590, 0.7004832177, 0.4921044866, 0.7705973207, 0.4976958947, 0.9921463922, 0.9838490778, 0.6769562005, 0.6802607587, 0.9595677593, 0.9541200276, 0.5082082210, 0.8223208394, 0.5093217134, 0.6555124918 },
{ 0.7647065866, 0.8386400884, 0.7593067471, 0.5509280160, 0.8294208501, 0.5565194241, 0.0509699216, 0.0426726072, 0.7357797299, 0.7390842881, 0.0183912887, 0.0129435570, 0.5670317504, 0.8811443688, 0.5681452428, 0.7143360212 },
{ 0.8235301161, 0.8974636178, 0.8181302765, 0.6097515454, 0.8882443795, 0.6153429536, 0.1097934510, 0.1014961366, 0.7946032593, 0.7979078175, 0.0772148181, 0.0717670864, 0.6258552798, 0.9399678982, 0.6269687722, 0.7731595506 },
{ 0.8823536455, 0.9562871472, 0.8769538059, 0.6685750748, 0.9470679090, 0.6741664830, 0.1686169804, 0.1603196660, 0.8534267888, 0.8567313469, 0.1360383475, 0.1305906158, 0.6846788092, 0.9987914276, 0.6857923016, 0.8319830800 },
{ 0.9411771749, 0.0151106766, 0.9357773353, 0.7273986042, 0.0058914384, 0.7329900124, 0.2274405099, 0.2191431954, 0.9122503182, 0.9155548763, 0.1948618769, 0.1894141452, 0.7435023386, 0.0576149570, 0.7446158310, 0.8908066094 },
{ 0.0034609119, 0.1362179431, 0.1157081312, 0.9661529295, 0.3034692930, 0.0893913965, 0.6426654233, 0.6931916383, 0.4451222905, 0.5072503780, 0.8453809081, 0.8987567058, 0.5116684286, 0.8257810470, 0.6304289798, 0.8354432876 },
{ 0.0622844413, 0.1950414725, 0.1745316606, 0.0249764589, 0.3622928224, 0.1482149259, 0.7014889528, 0.7520151677, 0.5039458199, 0.5660739074, 0.9042044375, 0.9575802352, 0.5704919580, 0.8846045764, 0.6892525092, 0.8942668170 },
{ 0.1211079707, 0.2538650019, 0.2333551900, 0.0837999883, 0.4211163519, 0.2070384553, 0.7603124822, 0.8108386971, 0.5627693493, 0.6248974369, 0.9630279669, 0.0164037646, 0.6293154874, 0.9434281058, 0.7480760386, 0.9530903464 },
{ 0.1799315001, 0.3126885313, 0.2921787194, 0.1426235177, 0.4799398813, 0.2658619847, 0.8191360116, 0.8696622265, 0.6215928787, 0.6837209663, 0.0218514963, 0.0752272940, 0.6881390168, 0.0022516352, 0.8068995681, 0.0119138758 },
{ 0.2387550296, 0.3715120607, 0.3510022488, 0.2014470471, 0.5387634107, 0.3246855141, 0.8779595410, 0.9284857560, 0.6804164081, 0.7425444957, 0.0806750257, 0.1340508234, 0.7469625462, 0.0610751646, 0.8657230975, 0.0707374052 },
{ 0.2975785590, 0.4303355901, 0.4098257782, 0.2602705765, 0.5975869401, 0.3835090435, 0.9367830704, 0.9873092854, 0.7392399375, 0.8013680251, 0.1394985551, 0.1928743528, 0.8057860756, 0.1198986940, 0.9245466269, 0.1295609347 },
{ 0.3564020884, 0.4891591195, 0.4686493076, 0.3190941060, 0.6564104695, 0.4423325729, 0.9956065998, 0.0461328148, 0.7980634670, 0.8601915545, 0.1983220845, 0.2516978823, 0.8646096051, 0.1787222234, 0.9833701563, 0.1883844641 },
{ 0.4152256178, 0.5479826490, 0.5274728371, 0.3779176354, 0.7152339989, 0.5011561023, 0.0544301292, 0.1049563442, 0.8568869964, 0.9190150839, 0.2571456140, 0.3105214117, 0.9234331345, 0.2375457528, 0.0421936857, 0.2472079935 },
{ 0.4740491472, 0.6068061784, 0.5862963665, 0.4367411648, 0.7740575283, 0.5599796318, 0.1132536586, 0.1637798736, 0.9157105258, 0.9778386133, 0.3159691434, 0.3693449411, 0.9822566639, 0.2963692823, 0.1010172151, 0.3060315229 },
{ 0.5328726766, 0.6656297078, 0.6451198959, 0.4955646942, 0.8328810577, 0.6188031612, 0.1720771881, 0.2226034030, 0.9745340552, 0.0366621427, 0.3747926728, 0.4281684705, 0.0410801933, 0.3551928117, 0.1598407445, 0.3648550523 },
{ 0.5916962060, 0.7244532372, 0.7039434253, 0.5543882236, 0.8917045872, 0.6776266906, 0.2309007175, 0.2814269324, 0.0333575846, 0.0954856721, 0.4336162022, 0.4869919999, 0.0999037227, 0.4140163411, 0.2186642739, 0.4236785817 },
{ 0.6505197354, 0.7832767666, 0.7627669547, 0.6132117530, 0.9505281166, 0.7364502200, 0.2897242469, 0.3402504618, 0.0921811140, 0.1543092016, 0.4924397316, 0.5458155293, 0.1587272521, 0.4728398705, 0.2774878033, 0.4825021111 },
{ 0.7093432648, 0.8421002960, 0.8215904841, 0.6720352824, 0.0093516460, 0.7952737494, 0.3485477763, 0.3990739913, 0.1510046434, 0.2131327310, 0.5512632610, 0.6046390587, 0.2175507815, 0.5316633999, 0.3363113328, 0.5413256405 },
{ 0.7681667943, 0.9009238254, 0.8804140135, 0.7308588118, 0.0681751754, 0.8540972788, 0.4073713057, 0.4578975207, 0.2098281728, 0.2719562604, 0.6100867904, 0.6634625881, 0.2763743109, 0.5904869293, 0.3951348622, 0.6001491700 },
{ 0.8269903237, 0.9597473548, 0.9392375429, 0.7896823412, 0.1269987048, 0.9129208082, 0.4661948351, 0.5167210501, 0.2686517022, 0.3307797898, 0.6689103198, 0.7222861175, 0.3351978403, 0.6493104587, 0.4539583916, 0.6589726994 },
{ 0.8858138531, 0.0185708843, 0.9980610723, 0.8485058707, 0.1858222342, 0.9717443376, 0.5250183645, 0.5755445795, 0.3274752317, 0.3896033192, 0.7277338493, 0.7811096470, 0.3940213698, 0.7081339881, 0.5127819210, 0.7177962288 },
{ 0.9446373825, 0.0773944137, 0.0568846018, 0.9073294001, 0.2446457636, 0.0305678670, 0.5838418939, 0.6343681089, 0.3862987611, 0.4484268486, 0.7865573787, 0.8399331764, 0.4528448992, 0.7669575176, 0.5716054504, 0.7766197582 },
{ 0.0069211195, 0.1985016801, 0.1779918682, 0.1460837253, 0.5422236183, 0.3869692511, 0.9990668074, 0.1084165518, 0.9191707334, 0.0401223503, 0.4370764098, 0.5492757369, 0.2210109891, 0.5939471369, 0.4574185992, 0.7212564364 },
{ 0.0657446489, 0.2573252095, 0.2368153976, 0.2049072547, 0.6010471477, 0.4457927805, 0.0578903368, 0.1672400812, 0.9779942628, 0.0989458798, 0.4958999392, 0.6080992663, 0.2798345185, 0.6527706663, 0.5162421286, 0.7800799658 },
{ 0.1245681783, 0.3161487389, 0.2956389270, 0.2637307842, 0.6598706771, 0.5046163100, 0.1167138663, 0.2260636106, 0.0368177922, 0.1577694092, 0.5547234686, 0.6669227957, 0.3386580480, 0.7115941958, 0.5750656580, 0.8389034952 },
{ 0.1833917078, 0.3749722683, 0.3544624564, 0.3225543136, 0.7186942065, 0.5634398394, 0.1755373957, 0.2848871400, 0.0956413216, 0.2165929386, 0.6135469980, 0.7257463252, 0.3974815774, 0.7704177252, 0.6338891874, 0.8977270246 },
{ 0.2422152372, 0.4337957977, 0.4132859858, 0.3813778430, 0.7775177359, 0.6222633688, 0.2343609251, 0.3437106695, 0.1544648510, 0.2754164680, 0.6723705275, 0.7845698546, 0.4563051068, 0.8292412546, 0.6927127168, 0.9565505540 },
{ 0.3010387666, 0.4926193272, 0.4721095153, 0.4402013724, 0.8363412654, 0.6810868982, 0.2931844545, 0.4025341989, 0.2132883804, 0.3342399974, 0.7311940569, 0.8433933840, 0.5151286362, 0.8880647840, 0.7515362463, 0.0153740834 },
{ 0.3598622960, 0.5514428566, 0.5309330447, 0.4990249018, 0.8951647948, 0.7399104276, 0.3520079839, 0.4613577283, 0.2721119099, 0.3930635268, 0.7900175863, 0.9022169134, 0.5739521656, 0.9468883134, 0.8103597757, 0.0741976129 },
{ 0.4186858254, 0.6102663860, 0.5897565741, 0.5578484312, 0.9539883242, 0.7987339570, 0.4108315133, 0.5201812577, 0.3309354393, 0.4518870562, 0.8488411157, 0.9610404428, 0.6327756950, 0.0057118428, 0.8691833051, 0.1330211423 },
{ 0.4775093548, 0.6690899154, 0.6485801035, 0.6166719606, 0.0128118536, 0.8575574864, 0.4696550427, 0.5790047871, 0.3897589687, 0.5107105856, 0.9076646451, 0.0198639722, 0.6915992244, 0.0645353722, 0.9280068345, 0.1918446717 },
{ 0.5363328842, 0.7279134448, 0.7074036329, 0.6754954900, 0.0716353830, 0.9163810158, 0.5284785721, 0.6378283165, 0.4485824981, 0.5695341151, 0.9664881745, 0.0786875016, 0.7504227538, 0.1233589016, 0.9868303639, 0.2506682011 },
{ 0.5951564136, 0.7867369742, 0.7662271623, 0.7343190195, 0.1304589124, 0.9752045452, 0.5873021015, 0.6966518459, 0.5074060275, 0.6283576445, 0.0253117039, 0.1375110310, 0.8092462833, 0.1821824310, 0.0456538933, 0.3094917305 },
{ 0.6539799431, 0.8455605036, 0.8250506917, 0.7931425489, 0.1892824418, 0.0340280747, 0.6461256310, 0.7554753753, 0.5662295569, 0.6871811739, 0.0841352333, 0.1963345605, 0.8680698127, 0.2410059605, 0.1044774227, 0.3683152599 },
{ 0.7128034725, 0.9043840330, 0.8838742211, 0.8519660783, 0.2481059712, 0.0928516041, 0.7049491604, 0.8142989047, 0.6250530863, 0.7460047033, 0.1429587627, 0.2551580899, 0.9268933421, 0.2998294899, 0.1633009521, 0.4271387893 },
{ 0.7716270019, 0.9632075625, 0.9426977505, 0.9107896077, 0.3069295006, 0.1516751335, 0.7637726898, 0.8731224342, 0.6838766157, 0.8048282327, 0.2017822922, 0.3139816193, 0.9857168715, 0.3586530193, 0.2221244815, 0.4859623187 },
{ 0.8304505313, 0.0220310919, 0.0015212800, 0.9696131371, 0.3657530301, 0.2104986629, 0.8225962192, 0.9319459636, 0.7427001452, 0.8636517621, 0.2606058216, 0.3728051487, 0.0445404009, 0.4174765487, 0.2809480110, 0.5447858482 },
{ 0.8892740607, 0.0808546213, 0.0603448094, 0.0284366665, 0.4245765595, 0.2693221923, 0.8814197486, 0.9907694930, 0.8015236746, 0.9224752915, 0.3194293510, 0.4316286781, 0.1033639303, 0.4763000781, 0.3397715404, 0.6036093776 },
{ 0.9480975901, 0.1396781507, 0.1191683388, 0.0872601959, 0.4834000889, 0.3281457217, 0.9402432780, 0.0495930224, 0.8603472040, 0.9812988209, 0.3782528804, 0.4904522075, 0.1621874597, 0.5351236075, 0.3985950698, 0.6624329070 },
{ 0.0103813271, 0.2607854171, 0.2990991346, 0.3260145212, 0.7809779436, 0.6845471058, 0.2966446621, 0.5236414653, 0.3932191763, 0.5729943227, 0.0287719115, 0.1997947681, 0.9303535497, 0.3621132269, 0.2844082186, 0.6070695852 },
{ 0.0692048565, 0.3196089465, 0.3579226640, 0.3848380506, 0.8398014730, 0.7433706352, 0.3554681915, 0.5824649947, 0.4520427057, 0.6318178521, 0.0875954409, 0.2586182975, 0.9891770791, 0.4209367563, 0.3432317480, 0.6658931146 },
{ 0.1280283860, 0.3784324759, 0.4167461935, 0.4436615800, 0.8986250024, 0.8021941646, 0.4142917209, 0.6412885241, 0.5108662351, 0.6906413815, 0.1464189704, 0.3174418269, 0.0480006085, 0.4797602857, 0.4020552774, 0.7247166440 },
{ 0.1868519154, 0.4372560054, 0.4755697229, 0.5024851094, 0.9574485318, 0.8610176940, 0.4731152503, 0.7001120535, 0.5696897645, 0.7494649109, 0.2052424998, 0.3762653563, 0.1068241379, 0.5385838151, 0.4608788068, 0.7835401734 },
{ 0.2456754448, 0.4960795348, 0.5343932523, 0.5613086388, 0.0162720612, 0.9198412234, 0.5319387798, 0.7589355829, 0.6285132939, 0.8082884403, 0.2640660292, 0.4350888857, 0.1656476673, 0.5974073445, 0.5197023362, 0.8423637028 },
{ 0.3044989742, 0.5549030642, 0.5932167817, 0.6201321682, 0.0750955906, 0.9786647529, 0.5907623092, 0.8177591124, 0.6873368234, 0.8671119697, 0.3228895586, 0.4939124151, 0.2244711967, 0.6562308740, 0.5785258656, 0.9011872322 },
{ 0.3633225036, 0.6137265936, 0.6520403111, 0.6789556977, 0.1339191200, 0.0374882823, 0.6495858386, 0.8765826418, 0.7461603528, 0.9259354991, 0.3817130880, 0.5527359445, 0.2832947262, 0.7150544034, 0.6373493950, 0.9600107616 },
{ 0.4221460330, 0.6725501230, 0.7108638405, 0.7377792271, 0.1927426494, 0.0963118117, 0.7084093680, 0.9354061712, 0.8049838822, 0.9847590286, 0.4405366174, 0.6115594739, 0.3421182556, 0.7738779328, 0.6961729245, 0.0188342911 },
{ 0.4809695624, 0.7313736524, 0.7696873699, 0.7966027565, 0.2515661788, 0.1551353411, 0.7672328974, 0.9942297006, 0.8638074116, 0.0435825580, 0.4993601468, 0.6703830034, 0.4009417850, 0.8327014622, 0.7549964539, 0.0776578205 },
{ 0.5397930918, 0.7901971818, 0.8285108993, 0.8554262859, 0.3103897083, 0.2139588705, 0.8260564268, 0.0530532300, 0.9226309410, 0.1024060874, 0.5581836762, 0.7292065328, 0.4597653144, 0.8915249916, 0.8138199833, 0.1364813499 },
{ 0.5986166213, 0.8490207112, 0.8873344287, 0.9142498153, 0.3692132377, 0.2727823999, 0.8848799562, 0.1118767594, 0.9814544704, 0.1612296168, 0.6170072057, 0.7880300622, 0.5185888438, 0.9503485210, 0.8726435127, 0.1953048793 },
{ 0.6574401507, 0.9078442407, 0.9461579582, 0.9730733447, 0.4280367671, 0.3316059293, 0.9437034856, 0.1707002888, 0.0402779998, 0.2200531462, 0.6758307351, 0.8468535916, 0.5774123732, 0.0091720504, 0.9314670421, 0.2541284087 },
{ 0.7162636801, 0.9666677701, 0.0049814876, 0.0318968741, 0.4868602965, 0.3904294587, 0.0025270150, 0.2295238182, 0.0991015292, 0.2788766756, 0.7346542645, 0.9056771210, 0.6362359026, 0.0679955798, 0.9902905715, 0.3129519381 },
{ 0.7750872095, 0.0254912995, 0.0638050170, 0.0907204035, 0.5456838259, 0.4492529882, 0.0613505445, 0.2883473477, 0.1579250587, 0.3377002050, 0.7934777939, 0.9645006504, 0.6950594320, 0.1268191092, 0.0491141009, 0.3717754675 },
{ 0.8339107389, 0.0843148289, 0.1226285464, 0.1495439329, 0.6045073553, 0.5080765176, 0.1201740739, 0.3471708771, 0.2167485881, 0.3965237344, 0.8523013233, 0.0233241798, 0.7538829615, 0.1856426387, 0.1079376303, 0.4305989969 },
{ 0.8927342683, 0.1431383583, 0.1814520758, 0.2083674624, 0.6633308847, 0.5669000470, 0.1789976033, 0.4059944065, 0.2755721175, 0.4553472638, 0.9111248527, 0.0821477092, 0.8127064909, 0.2444661681, 0.1667611598, 0.4894225264 },
{ 0.9515577977, 0.2019618877, 0.2402756052, 0.2671909918, 0.7221544141, 0.6257235764, 0.2378211327, 0.4648179359, 0.3343956469, 0.5141707933, 0.9699483821, 0.1409712387, 0.8715300203, 0.3032896975, 0.2255846892, 0.5482460558 },
{ 0.0138415347, 0.3230691541, 0.4202064011, 0.5059453170, 0.0197322688, 0.9821249605, 0.6530460462, 0.9388663788, 0.8672676192, 0.1058662950, 0.6204674133, 0.8503137992, 0.6396961102, 0.1302793169, 0.1113978380, 0.4928827340 },
{ 0.0726650642, 0.3818926836, 0.4790299305, 0.5647688464, 0.0785557982, 0.0409484899, 0.7118695756, 0.9976899082, 0.9260911486, 0.1646898244, 0.6792909427, 0.9091373286, 0.6985196397, 0.1891028463, 0.1702213674, 0.5517062634 },
{ 0.1314885936, 0.4407162130, 0.5378534599, 0.6235923759, 0.1373793276, 0.0997720193, 0.7706931050, 0.0565134376, 0.9849146780, 0.2235133538, 0.7381144721, 0.9679608580, 0.7573431691, 0.2479263757, 0.2290448968, 0.6105297928 },
{ 0.1903121230, 0.4995397424, 0.5966769893, 0.6824159053, 0.1962028570, 0.1585955487, 0.8295166344, 0.1153369670, 0.0437382074, 0.2823368832, 0.7969380015, 0.0267843874, 0.8161666985, 0.3067499051, 0.2878684262, 0.6693533222 },
{ 0.2491356524, 0.5583632718, 0.6555005187, 0.7412394347, 0.2550263865, 0.2174190781, 0.8883401638, 0.1741604964, 0.1025617369, 0.3411604126, 0.8557615309, 0.0856079169, 0.8749902279, 0.3655734345, 0.3466919556, 0.7281768516 },
{ 0.3079591818, 0.6171868012, 0.7143240481, 0.8000629641, 0.3138499159, 0.2762426075, 0.9471636932, 0.2329840259, 0.1613852663, 0.3999839420, 0.9145850603, 0.1444314463, 0.9338137573, 0.4243969639, 0.4055154850, 0.7870003810 },
{ 0.3667827112, 0.6760103306, 0.7731475775, 0.8588864935, 0.3726734453, 0.3350661369, 0.0059872227, 0.2918075553, 0.2202087957, 0.4588074715, 0.9734085897, 0.2032549757, 0.9926372867, 0.4832204933, 0.4643390144, 0.8458239104 },
{ 0.4256062406, 0.7348338600, 0.8319711069, 0.9177100229, 0.4314969747, 0.3938896664, 0.0648107521, 0.3506310847, 0.2790323251, 0.5176310009, 0.0322321192, 0.2620785051, 0.0514608161, 0.5420440227, 0.5231625438, 0.9046474398 },
{ 0.4844297700, 0.7936573894, 0.8907946364, 0.9765335523, 0.4903205041, 0.4527131958, 0.1236342815, 0.4094546141, 0.3378558545, 0.5764545303, 0.0910556486, 0.3209020345, 0.1102843455, 0.6008675522, 0.5819860732, 0.9634709693 },
{ 0.5432532995, 0.8524809189, 0.9496181658, 0.0353570817, 0.5491440335, 0.5115367252, 0.1824578109, 0.4682781435, 0.3966793839, 0.6352780597, 0.1498791780, 0.3797255639, 0.1691078749, 0.6596910816, 0.6408096027, 0.0222944987 },
{ 0.6020768289, 0.9113044483, 0.0084416952, 0.0941806111, 0.6079675629, 0.5703602546, 0.2412813403, 0.5271016729, 0.4555029133, 0.6941015891, 0.2087027074, 0.4385490933, 0.2279314044, 0.7185146110, 0.6996331321, 0.0811180281 },
{ 0.6609003583, 0.9701279777, 0.0672652246, 0.1530041406, 0.6667910923, 0.6291837840, 0.3001048697, 0.5859252023, 0.5143264427, 0.7529251185, 0.2675262368, 0.4973726227, 0.2867549338, 0.7773381404, 0.7584566615, 0.1399415575 },
{ 0.7197238877, 0.0289515071, 0.1260887540, 0.2118276700, 0.7256146218, 0.6880073134, 0.3589283991, 0.6447487317, 0.5731499721, 0.8117486479, 0.3263497662, 0.5561961521, 0.3455784632, 0.8361616698, 0.8172801909, 0.1987650869 },
{ 0.7785474171, 0.0877750365, 0.1849122834, 0.2706511994, 0.7844381512, 0.7468308428, 0.4177519285, 0.7035722612, 0.6319735016, 0.8705721773, 0.3851732956, 0.6150196816, 0.4044019926, 0.8949851992, 0.8761037203, 0.2575886163 },
{ 0.8373709465, 0.1465985659, 0.2437358128, 0.3294747288, 0.8432616806, 0.8056543722, 0.4765754580, 0.7623957906, 0.6907970310, 0.9293957068, 0.4439968250, 0.6738432110, 0.4632255220, 0.9538087286, 0.9349272497, 0.3164121457 },
{ 0.8961944759, 0.2054220953, 0.3025593422, 0.3882982582, 0.9020852100, 0.8644779016, 0.5353989874, 0.8212193200, 0.7496205604, 0.9882192362, 0.5028203544, 0.7326667404, 0.5220490514, 0.0126322580, 0.9937507791, 0.3752356751 },
{ 0.9550180053, 0.2642456247, 0.3613828717, 0.4471217876, 0.9609087394, 0.9233014311, 0.5942225168, 0.8800428494, 0.8084440898, 0.0470427656, 0.5616438839, 0.7914902698, 0.5808725808, 0.0714557874, 0.0525743085, 0.4340592046 },
{ 0.0173017424, 0.3853528912, 0.5413136675, 0.6858761129, 0.2584865941, 0.2797028151, 0.0094474303, 0.2952677629, 0.3413160621, 0.6387382673, 0.2121629150, 0.5008328303, 0.3490386708, 0.8984454068, 0.9383874573, 0.3786958828 },
{ 0.0761252718, 0.4441764206, 0.6001371969, 0.7446996423, 0.3173101235, 0.3385263446, 0.0682709597, 0.3540912923, 0.4001395915, 0.6975617967, 0.2709864444, 0.5596563598, 0.4078622002, 0.9572689362, 0.9972109867, 0.4375194122 },
{ 0.1349488012, 0.5029999500, 0.6589607263, 0.8035231717, 0.3761336529, 0.3973498740, 0.1270944891, 0.4129148217, 0.4589631209, 0.7563853261, 0.3298099738, 0.6184798892, 0.4666857296, 0.0160924656, 0.0560345162, 0.4963429416 },
{ 0.1937723306, 0.5618234794, 0.7177842557, 0.8623467011, 0.4349571823, 0.4561734034, 0.1859180185, 0.4717383511, 0.5177866503, 0.8152088555, 0.3886335032, 0.6773034186, 0.5255092590, 0.0749159951, 0.1148580456, 0.5551664710 },
{ 0.2525958600, 0.6206470088, 0.7766077852, 0.9211702305, 0.4937807117, 0.5149969328, 0.2447415479, 0.5305618805, 0.5766101798, 0.8740323850, 0.4474570326, 0.7361269480, 0.5843327884, 0.1337395245, 0.1736815750, 0.6139900004 },
{ 0.3114193894, 0.6794705382, 0.8354313146, 0.9799937599, 0.5526042411, 0.5738204622, 0.3035650773, 0.5893854099, 0.6354337092, 0.9328559144, 0.5062805621, 0.7949504774, 0.6431563179, 0.1925630539, 0.2325051044, 0.6728135298 },
{ 0.3702429188, 0.7382940676, 0.8942548440, 0.0388172893, 0.6114277705, 0.6326439916, 0.3623886067, 0.6482089394, 0.6942572386, 0.9916794438, 0.5651040915, 0.8537740068, 0.7019798473, 0.2513865833, 0.2913286338, 0.7316370592 },
{ 0.4290664482, 0.7971175971, 0.9530783734, 0.0976408188, 0.6702513000, 0.6914675210, 0.4212121362, 0.7070324688, 0.7530807680, 0.0505029732, 0.6239276209, 0.9125975362, 0.7608033767, 0.3102101127, 0.3501521632, 0.7904605886 },
{ 0.4878899777, 0.8559411265, 0.0119019028, 0.1564643482, 0.7290748294, 0.7502910504, 0.4800356656, 0.7658559982, 0.8119042974, 0.1093265026, 0.6827511503, 0.9714210656, 0.8196269061, 0.3690336421, 0.4089756926, 0.8492841180 },
{ 0.5467135071, 0.9147646559, 0.0707254322, 0.2152878776, 0.7878983588, 0.8091145798, 0.5388591950, 0.8246795276, 0.8707278268, 0.1681500320, 0.7415746797, 0.0302445951, 0.8784504355, 0.4278571715, 0.4677992220, 0.9081076475 },
{ 0.6055370365, 0.9735881853, 0.1295489616, 0.2741114070, 0.8467218882, 0.8679381093, 0.5976827244, 0.8835030570, 0.9295513562, 0.2269735614, 0.8003982091, 0.0890681245, 0.9372739649, 0.4866807009, 0.5266227514, 0.9669311769 },
{ 0.6643605659, 0.0324117147, 0.1883724910, 0.3329349364, 0.9055454176, 0.9267616387, 0.6565062538, 0.9423265864, 0.9883748856, 0.2857970908, 0.8592217385, 0.1478916539, 0.9960974943, 0.5455042304, 0.5854462809, 0.0257547063 },
{ 0.7231840953, 0.0912352441, 0.2471960204, 0.3917584658, 0.9643689470, 0.9855851681, 0.7153297832, 0.0011501158, 0.0471984151, 0.3446206202, 0.9180452679, 0.2067151833, 0.0549210237, 0.6043277598, 0.6442698103, 0.0845782357 },
{ 0.7820076247, 0.1500587735, 0.3060195499, 0.4505819952, 0.0231924764, 0.0444086975, 0.7741533126, 0.0599736452, 0.1060219445, 0.4034441497, 0.9768687974, 0.2655387127, 0.1137445531, 0.6631512892, 0.7030933397, 0.1434017651 }
};
QRNG_VALIDATION_TEST_FUNCTIONS(faure)
BOOST_AUTO_TEST_CASE( validate_faure )
{
test_faure_values(faure_02_100, 15);
test_faure_values(faure_07_100, 2400);
test_faure_values(faure_16_100, 83520);
}
BOOST_AUTO_TEST_CASE( validate_faure_seed )
{
test_faure_seed(faure_02_100, 15);
test_faure_seed(faure_07_100, 2400);
test_faure_seed(faure_16_100, 83520);
}
BOOST_AUTO_TEST_CASE( validate_faure_discard )
{
test_faure_discard(faure_02_100, 15);
test_faure_discard(faure_07_100, 2400);
test_faure_discard(faure_16_100, 83520);
}

View File

@@ -0,0 +1,379 @@
// Copyright Justinas Vygintas Daugmaudis, 2010-2018.
// Use, modification and distribution is subject to the
// Boost Software License, Version 1.0. (See accompanying
// file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
#include <boost/random/niederreiter_base2.hpp>
#include <boost/utility.hpp>
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include "test_qrng_functions.hpp"
//
// DESCRIPTION:
// ~~~~~~~~~~~~
//
// This file tests the faure quasi-random number generator.
// These tests compare our results with values produced by the original
// version of ACM TOMS Algorithm 738, which is available in the
// TOMS subdirectory in http://www.netlib.org
//
// For independently generated datasets look at http://people.sc.fsu.edu/~jburkardt/datasets/niederreiter2/
// Spatial dimension: 2
// N: 100
// Vectors skipped: 4095
static const double niederreiter_base2_02_100[100][2] =
{
{ 0.0003662109, 0.4705810548 },
{ 0.5003662111, 0.9705810549 },
{ 0.7503662111, 0.2205810547 },
{ 0.2503662110, 0.7205810549 },
{ 0.3753662110, 0.0955810547 },
{ 0.8753662111, 0.5955810548 },
{ 0.6253662111, 0.3455810548 },
{ 0.1253662110, 0.8455810549 },
{ 0.1878662110, 0.1580810547 },
{ 0.6878662111, 0.6580810548 },
{ 0.9378662112, 0.4080810548 },
{ 0.4378662110, 0.9080810549 },
{ 0.3128662110, 0.2830810548 },
{ 0.8128662111, 0.7830810549 },
{ 0.5628662111, 0.0330810547 },
{ 0.0628662110, 0.5330810548 },
{ 0.0941162110, 0.0018310547 },
{ 0.5941162111, 0.5018310548 },
{ 0.8441162111, 0.2518310547 },
{ 0.3441162110, 0.7518310549 },
{ 0.4691162110, 0.3768310548 },
{ 0.9691162112, 0.8768310549 },
{ 0.7191162111, 0.1268310547 },
{ 0.2191162110, 0.6268310548 },
{ 0.1566162110, 0.3143310548 },
{ 0.6566162111, 0.8143310549 },
{ 0.9066162111, 0.0643310547 },
{ 0.4066162110, 0.5643310548 },
{ 0.2816162110, 0.1893310547 },
{ 0.7816162111, 0.6893310548 },
{ 0.5316162111, 0.4393310548 },
{ 0.0316162109, 0.9393310549 },
{ 0.0472412109, 0.2362060547 },
{ 0.5472412111, 0.7362060549 },
{ 0.7972412111, 0.4862060548 },
{ 0.2972412110, 0.9862060549 },
{ 0.4222412110, 0.3612060548 },
{ 0.9222412112, 0.8612060549 },
{ 0.6722412111, 0.1112060547 },
{ 0.1722412110, 0.6112060548 },
{ 0.2347412110, 0.4237060548 },
{ 0.7347412111, 0.9237060549 },
{ 0.9847412112, 0.1737060547 },
{ 0.4847412111, 0.6737060548 },
{ 0.3597412110, 0.0487060547 },
{ 0.8597412111, 0.5487060548 },
{ 0.6097412111, 0.2987060548 },
{ 0.1097412110, 0.7987060549 },
{ 0.0784912110, 0.2674560547 },
{ 0.5784912111, 0.7674560549 },
{ 0.8284912111, 0.0174560547 },
{ 0.3284912110, 0.5174560548 },
{ 0.4534912110, 0.1424560547 },
{ 0.9534912112, 0.6424560548 },
{ 0.7034912111, 0.3924560548 },
{ 0.2034912110, 0.8924560549 },
{ 0.1409912110, 0.0799560547 },
{ 0.6409912111, 0.5799560548 },
{ 0.8909912111, 0.3299560548 },
{ 0.3909912110, 0.8299560549 },
{ 0.2659912110, 0.4549560548 },
{ 0.7659912111, 0.9549560549 },
{ 0.5159912111, 0.2049560547 },
{ 0.0159912109, 0.7049560549 },
{ 0.0238037109, 0.1190185547 },
{ 0.5238037111, 0.6190185548 },
{ 0.7738037111, 0.3690185548 },
{ 0.2738037110, 0.8690185549 },
{ 0.3988037110, 0.4940185548 },
{ 0.8988037111, 0.9940185549 },
{ 0.6488037111, 0.2440185547 },
{ 0.1488037110, 0.7440185549 },
{ 0.2113037110, 0.3065185548 },
{ 0.7113037111, 0.8065185549 },
{ 0.9613037112, 0.0565185547 },
{ 0.4613037110, 0.5565185548 },
{ 0.3363037110, 0.1815185547 },
{ 0.8363037111, 0.6815185548 },
{ 0.5863037111, 0.4315185548 },
{ 0.0863037110, 0.9315185549 },
{ 0.1175537110, 0.4002685548 },
{ 0.6175537111, 0.9002685549 },
{ 0.8675537111, 0.1502685547 },
{ 0.3675537110, 0.6502685548 },
{ 0.4925537111, 0.0252685547 },
{ 0.9925537112, 0.5252685548 },
{ 0.7425537111, 0.2752685548 },
{ 0.2425537110, 0.7752685549 },
{ 0.1800537110, 0.2127685547 },
{ 0.6800537111, 0.7127685549 },
{ 0.9300537112, 0.4627685548 },
{ 0.4300537110, 0.9627685549 },
{ 0.3050537110, 0.3377685548 },
{ 0.8050537111, 0.8377685549 },
{ 0.5550537111, 0.0877685547 },
{ 0.0550537110, 0.5877685548 },
{ 0.0394287109, 0.3533935548 },
{ 0.5394287111, 0.8533935549 },
{ 0.7894287111, 0.1033935547 },
{ 0.2894287110, 0.6033935548 }
};
// Spatial dimension: 7
// N: 100
// Vectors skipped: 4095
static const double niederreiter_base2_07_100[100][7] =
{
{ 0.0003662109, 0.4705810548, 0.6358642580, 0.9561767580, 0.6715087892, 0.9793701174, 0.6053466798 },
{ 0.5003662111, 0.9705810549, 0.3858642579, 0.0811767578, 0.2965087891, 0.0418701172, 0.4178466798 },
{ 0.7503662111, 0.2205810547, 0.9483642580, 0.8155517580, 0.5621337892, 0.9207763674, 0.5467529298 },
{ 0.2503662110, 0.7205810549, 0.1983642579, 0.1905517579, 0.4371337892, 0.1082763672, 0.4842529298 },
{ 0.3753662110, 0.0955810547, 0.2608642579, 0.7374267580, 0.7652587892, 0.8465576174, 0.6600341798 },
{ 0.8753662111, 0.5955810548, 0.5108642579, 0.3624267579, 0.1402587891, 0.1590576172, 0.3475341798 },
{ 0.6253662111, 0.3455810548, 0.0733642578, 0.5968017580, 0.9058837893, 0.7879638674, 0.7264404299 },
{ 0.1253662110, 0.8455810549, 0.8233642580, 0.4718017579, 0.0308837891, 0.2254638672, 0.2889404298 },
{ 0.1878662110, 0.1580810547, 0.1514892578, 0.2686767579, 0.3590087891, 0.7449951174, 0.9334716799 },
{ 0.6878662111, 0.6580810548, 0.9014892580, 0.6436767580, 0.7340087892, 0.3074951173, 0.1209716797 },
{ 0.9378662112, 0.4080810548, 0.4639892579, 0.3780517579, 0.4996337892, 0.6864013673, 0.9998779299 },
{ 0.4378662110, 0.9080810549, 0.7139892580, 0.5030517579, 0.6246337892, 0.3739013673, 0.0623779297 },
{ 0.3128662110, 0.2830810548, 0.7764892580, 0.0499267578, 0.2027587891, 0.6121826173, 0.8631591799 },
{ 0.8128662111, 0.7830810549, 0.0264892578, 0.9249267580, 0.8277587893, 0.4246826173, 0.1756591797 },
{ 0.5628662111, 0.0330810547, 0.5889892579, 0.1593017578, 0.0933837891, 0.5535888673, 0.8045654299 },
{ 0.0628662110, 0.5330810548, 0.3389892579, 0.7843017580, 0.9683837893, 0.4910888673, 0.2420654297 },
{ 0.0941162110, 0.0018310547, 0.9171142580, 0.5635986329, 0.4195556642, 0.3856201173, 0.3865966798 },
{ 0.5941162111, 0.5018310548, 0.1671142579, 0.4385986329, 0.5445556642, 0.5731201173, 0.5740966798 },
{ 0.8441162111, 0.2518310547, 0.7296142580, 0.7042236330, 0.3101806641, 0.4520263673, 0.4530029298 },
{ 0.3441162110, 0.7518310549, 0.4796142579, 0.3292236329, 0.6851806642, 0.5145263673, 0.5155029298 },
{ 0.4691162110, 0.3768310548, 0.0421142578, 0.8448486330, 0.0133056641, 0.2528076172, 0.3162841798 },
{ 0.9691162112, 0.8768310549, 0.7921142580, 0.2198486329, 0.8883056643, 0.6903076173, 0.6287841798 },
{ 0.7191162111, 0.1268310547, 0.3546142579, 0.9854736330, 0.1539306641, 0.3192138673, 0.2576904297 },
{ 0.2191162110, 0.6268310548, 0.6046142580, 0.1104736328, 0.7789306642, 0.6317138673, 0.6951904298 },
{ 0.1566162110, 0.3143310548, 0.4327392579, 0.1260986328, 0.6070556642, 0.1512451172, 0.0897216797 },
{ 0.6566162111, 0.8143310549, 0.6827392580, 0.7510986330, 0.4820556642, 0.8387451174, 0.9022216799 },
{ 0.9066162111, 0.0643310547, 0.2452392579, 0.0167236328, 0.7476806642, 0.2176513672, 0.0311279297 },
{ 0.4066162110, 0.5643310548, 0.9952392580, 0.8917236330, 0.3726806641, 0.7801513674, 0.9686279299 },
{ 0.2816162110, 0.1893310547, 0.5577392579, 0.4073486329, 0.9508056643, 0.0184326172, 0.1444091797 },
{ 0.7816162111, 0.6893310548, 0.3077392579, 0.5323486329, 0.0758056641, 0.9559326174, 0.8319091799 },
{ 0.5316162111, 0.4393310548, 0.8702392580, 0.2979736329, 0.8414306643, 0.0848388672, 0.2108154297 },
{ 0.0316162109, 0.9393310549, 0.1202392578, 0.6729736330, 0.2164306641, 0.8973388674, 0.7733154299 },
{ 0.0472412109, 0.2362060547, 0.4522705079, 0.1007080078, 0.0426025391, 0.7955322267, 0.4801025392 },
{ 0.5472412111, 0.7362060549, 0.7022705080, 0.9757080080, 0.9176025393, 0.2330322266, 0.5426025392 },
{ 0.7972412111, 0.4862060548, 0.1397705078, 0.2413330079, 0.1832275391, 0.8541259768, 0.4215087892 },
{ 0.2972412110, 0.9862060549, 0.8897705080, 0.8663330080, 0.8082275393, 0.1666259766, 0.6090087892 },
{ 0.4222412110, 0.3612060548, 0.5772705079, 0.3194580079, 0.3863525392, 0.9127197268, 0.2847900391 },
{ 0.9222412112, 0.8612060549, 0.3272705079, 0.6944580080, 0.5113525392, 0.1002197266, 0.7222900392 },
{ 0.6722412111, 0.1112060547, 0.7647705080, 0.4600830079, 0.2769775391, 0.9713134768, 0.3511962891 },
{ 0.1722412110, 0.6112060548, 0.0147705078, 0.5850830079, 0.6519775392, 0.0338134766, 0.6636962892 },
{ 0.2347412110, 0.4237060548, 0.9678955080, 0.6632080080, 0.9801025393, 0.5611572267, 0.0582275391 },
{ 0.7347412111, 0.9237060549, 0.2178955079, 0.2882080079, 0.1051025391, 0.4986572267, 0.9957275393 },
{ 0.9847412112, 0.1737060547, 0.6553955080, 0.5538330079, 0.8707275393, 0.6197509767, 0.1246337891 },
{ 0.4847412111, 0.6737060548, 0.4053955079, 0.4288330079, 0.2457275391, 0.4322509767, 0.9371337893 },
{ 0.3597412110, 0.0487060547, 0.0928955078, 0.8819580080, 0.5738525392, 0.6783447267, 0.2379150391 },
{ 0.8597412111, 0.5487060548, 0.8428955080, 0.0069580078, 0.4488525392, 0.3658447266, 0.8004150392 },
{ 0.6097412111, 0.2987060548, 0.2803955079, 0.7725830080, 0.7144775392, 0.7369384767, 0.1793212891 },
{ 0.1097412110, 0.7987060549, 0.5303955079, 0.1475830078, 0.3394775391, 0.2994384766, 0.8668212893 },
{ 0.0784912110, 0.2674560547, 0.2335205079, 0.4893798829, 0.7906494142, 0.3267822266, 0.5113525392 },
{ 0.5784912111, 0.7674560549, 0.9835205080, 0.6143798830, 0.1656494141, 0.6392822267, 0.4488525392 },
{ 0.8284912111, 0.0174560547, 0.4210205079, 0.3487548829, 0.9312744143, 0.2603759766, 0.5777587892 },
{ 0.3284912110, 0.5174560548, 0.6710205080, 0.7237548830, 0.0562744141, 0.6978759767, 0.3902587892 },
{ 0.4534912110, 0.1424560547, 0.8585205080, 0.2081298829, 0.6343994142, 0.4439697267, 0.6910400392 },
{ 0.9534912112, 0.6424560548, 0.1085205078, 0.8331298830, 0.2593994141, 0.5064697267, 0.2535400391 },
{ 0.7034912111, 0.3924560548, 0.5460205079, 0.0675048828, 0.5250244142, 0.3775634767, 0.6324462892 },
{ 0.2034912110, 0.8924560549, 0.2960205079, 0.9425048830, 0.4000244142, 0.5650634767, 0.3199462891 },
{ 0.1409912110, 0.0799560547, 0.7491455080, 0.8018798830, 0.2281494141, 0.0924072266, 0.9644775393 },
{ 0.6409912111, 0.5799560548, 0.4991455079, 0.1768798829, 0.8531494143, 0.9049072268, 0.0269775391 },
{ 0.8909912111, 0.3299560548, 0.9366455080, 0.9112548830, 0.1187744141, 0.0260009766, 0.9058837893 },
{ 0.3909912110, 0.8299560549, 0.1866455079, 0.0362548828, 0.9937744143, 0.9635009768, 0.0933837891 },
{ 0.2659912110, 0.4549560548, 0.3741455079, 0.5206298829, 0.3218994141, 0.2095947266, 0.7691650392 },
{ 0.7659912111, 0.9549560549, 0.6241455080, 0.3956298829, 0.6968994142, 0.7720947267, 0.2066650391 },
{ 0.5159912111, 0.2049560547, 0.0616455078, 0.6300048830, 0.4625244142, 0.1431884766, 0.8355712893 },
{ 0.0159912109, 0.7049560549, 0.8116455080, 0.2550048829, 0.5875244142, 0.8306884768, 0.1480712891 },
{ 0.0238037109, 0.1190185547, 0.0186767578, 0.1827392579, 0.9136962893, 0.5960693361, 0.2923583985 },
{ 0.5238037111, 0.6190185548, 0.7686767580, 0.8077392580, 0.0386962891, 0.4085693360, 0.7298583986 },
{ 0.7738037111, 0.3690185548, 0.3311767579, 0.0421142578, 0.8043212892, 0.5374755861, 0.3587646485 },
{ 0.2738037110, 0.8690185549, 0.5811767579, 0.9171142580, 0.1793212891, 0.4749755860, 0.6712646486 },
{ 0.3988037110, 0.4940185548, 0.8936767580, 0.4014892579, 0.5074462892, 0.7288818361, 0.4720458985 },
{ 0.8988037111, 0.9940185549, 0.1436767578, 0.5264892579, 0.3824462892, 0.2913818360, 0.5345458986 },
{ 0.6488037111, 0.2440185547, 0.7061767580, 0.2608642579, 0.6480712892, 0.6702880861, 0.4134521485 },
{ 0.1488037110, 0.7440185549, 0.4561767579, 0.6358642580, 0.2730712891, 0.3577880860, 0.6009521486 },
{ 0.2113037110, 0.3065185548, 0.5030517579, 0.6202392580, 0.1011962891, 0.8616943361, 0.2454833985 },
{ 0.7113037111, 0.8065185549, 0.2530517579, 0.4952392579, 0.9761962893, 0.1741943360, 0.8079833986 },
{ 0.9613037112, 0.0565185547, 0.8155517580, 0.7296142580, 0.2418212891, 0.8031005861, 0.1868896485 },
{ 0.4613037110, 0.5565185548, 0.0655517578, 0.3546142579, 0.8668212893, 0.2406005860, 0.8743896486 },
{ 0.3363037110, 0.1815185547, 0.3780517579, 0.8389892580, 0.4449462892, 0.9945068362, 0.0501708984 },
{ 0.8363037111, 0.6815185548, 0.6280517580, 0.2139892579, 0.5699462892, 0.0570068360, 0.9876708987 },
{ 0.5863037111, 0.4315185548, 0.1905517579, 0.9483642580, 0.3355712891, 0.9359130862, 0.1165771485 },
{ 0.0863037110, 0.9315185549, 0.9405517580, 0.0733642578, 0.7105712892, 0.1234130860, 0.9290771487 },
{ 0.1175537110, 0.4002685548, 0.2999267579, 0.2901611329, 0.1617431641, 0.0023193359, 0.6986083986 },
{ 0.6175537111, 0.9002685549, 0.5499267579, 0.6651611330, 0.7867431642, 0.9398193362, 0.2611083985 },
{ 0.8675537111, 0.1502685547, 0.1124267578, 0.4307861329, 0.0523681641, 0.0687255860, 0.6400146486 },
{ 0.3675537110, 0.6502685548, 0.8624267580, 0.5557861329, 0.9273681643, 0.8812255861, 0.3275146485 },
{ 0.4925537111, 0.0252685547, 0.6749267580, 0.0089111328, 0.2554931641, 0.1351318360, 0.5032958986 },
{ 0.9925537112, 0.5252685548, 0.4249267579, 0.8839111330, 0.6304931642, 0.8226318361, 0.4407958985 },
{ 0.7425537111, 0.2752685548, 0.9874267580, 0.1495361328, 0.3961181642, 0.2015380860, 0.5697021486 },
{ 0.2425537110, 0.7752685549, 0.2374267579, 0.7745361330, 0.5211181642, 0.7640380861, 0.3822021485 },
{ 0.1800537110, 0.2127685547, 0.7843017580, 0.9776611330, 0.8492431643, 0.2679443360, 0.7767333986 },
{ 0.6800537111, 0.7127685549, 0.0343017578, 0.1026611328, 0.2242431641, 0.7054443361, 0.2142333985 },
{ 0.9300537112, 0.4627685548, 0.5968017580, 0.8682861330, 0.9898681643, 0.3343505860, 0.8431396486 },
{ 0.4300537110, 0.9627685549, 0.3468017579, 0.2432861329, 0.1148681641, 0.6468505861, 0.1556396485 },
{ 0.3050537110, 0.3377685548, 0.1593017578, 0.6964111330, 0.6929931642, 0.4007568360, 0.9564208987 },
{ 0.8050537111, 0.8377685549, 0.9093017580, 0.3214111329, 0.3179931641, 0.5882568361, 0.0189208984 },
{ 0.5550537111, 0.0877685547, 0.4718017579, 0.5870361329, 0.5836181642, 0.4671630860, 0.8978271486 },
{ 0.0550537110, 0.5877685548, 0.7218017580, 0.4620361329, 0.4586181642, 0.5296630861, 0.0853271485 },
{ 0.0394287109, 0.3533935548, 0.8350830080, 0.7647705080, 0.2847900391, 0.6622314455, 0.6671142580 },
{ 0.5394287111, 0.8533935549, 0.0850830078, 0.1397705078, 0.6597900392, 0.3497314454, 0.3546142579 },
{ 0.7894287111, 0.1033935547, 0.5225830079, 0.9053955080, 0.4254150392, 0.7208251955, 0.7335205080 },
{ 0.2894287110, 0.6033935548, 0.2725830079, 0.0303955078, 0.5504150392, 0.2833251954, 0.2960205079 }
};
// Spatial dimension: 16
// N: 100
// Vectors skipped: 4095
static const double niederreiter_base2_16_100[100][16] =
{
{ 0.0003662109, 0.4705810548, 0.6358642580, 0.9561767580, 0.6715087892, 0.9793701174, 0.6053466798, 0.1983642579, 0.2217731476, 0.3769855500, 0.5390644075, 0.4707050325, 0.2744159699, 0.9942340853, 0.5396728517, 0.0626220703 },
{ 0.5003662111, 0.9705810549, 0.3858642579, 0.0811767578, 0.2965087891, 0.0418701172, 0.4178466798, 0.7608642580, 0.7530231478, 0.5957355501, 0.4453144075, 0.5019550325, 0.7431659700, 0.0254840851, 0.4615478517, 0.9219970705 },
{ 0.7503662111, 0.2205810547, 0.9483642580, 0.8155517580, 0.5621337892, 0.9207763674, 0.5467529298, 0.1397705078, 0.1895465851, 0.4092121125, 0.5087909700, 0.4404315950, 0.3046894074, 0.9639606478, 0.5555419923, 0.0784912110 },
{ 0.2503662110, 0.7205810549, 0.1983642579, 0.1905517579, 0.4371337892, 0.1082763672, 0.4842529298, 0.8272705080, 0.7832965853, 0.5654621126, 0.4775409700, 0.5341815950, 0.7109394075, 0.0577106476, 0.4461669923, 0.9066162111 },
{ 0.3753662110, 0.0955810547, 0.2608642579, 0.7374267580, 0.7652587892, 0.8465576174, 0.6600341798, 0.0030517578, 0.1573200226, 0.4375324250, 0.6035175325, 0.3750019074, 0.3701190949, 0.8985309603, 0.5079345704, 0.0943603516 },
{ 0.8753662111, 0.5955810548, 0.5108642579, 0.3624267579, 0.1402587891, 0.1590576172, 0.3475341798, 0.9405517580, 0.8135700228, 0.5312824251, 0.3847675324, 0.5937519075, 0.6513690950, 0.1172809601, 0.4923095704, 0.8912353518 },
{ 0.6253662111, 0.3455810548, 0.0733642578, 0.5968017580, 0.9058837893, 0.7879638674, 0.7264404299, 0.0694580078, 0.1250934601, 0.4697589875, 0.5732440950, 0.4072284699, 0.3378925324, 0.9307575228, 0.5238037111, 0.1102294922 },
{ 0.1253662110, 0.8455810549, 0.8233642580, 0.4718017579, 0.0308837891, 0.2254638672, 0.2889404298, 0.8819580080, 0.8438434603, 0.5010089875, 0.4169940949, 0.5634784700, 0.6816425325, 0.0870075226, 0.4769287110, 0.8758544924 },
{ 0.1878662110, 0.1580810547, 0.1514892578, 0.2686767579, 0.3590087891, 0.7449951174, 0.9334716799, 0.3389892579, 0.1006793976, 0.2871418000, 0.6367206575, 0.2558612824, 0.4658222200, 0.8106403353, 0.6031494142, 0.0010986328 },
{ 0.6878662111, 0.6580810548, 0.9014892580, 0.6436767580, 0.7340087892, 0.3074951173, 0.1209716797, 0.6514892580, 0.8819293978, 0.6933918001, 0.3554706574, 0.7246112825, 0.5595722200, 0.2168903351, 0.4000244142, 0.9854736330 },
{ 0.9378662112, 0.4080810548, 0.4639892579, 0.3780517579, 0.4996337892, 0.6864013673, 0.9998779299, 0.2803955079, 0.0684528351, 0.2568683625, 0.6689472200, 0.2880878449, 0.4960956575, 0.7803668978, 0.6190185548, 0.0169677734 },
{ 0.4378662110, 0.9080810549, 0.7139892580, 0.5030517579, 0.6246337892, 0.3739013673, 0.0623779297, 0.7178955080, 0.9122028353, 0.7256183626, 0.3251972199, 0.6943378450, 0.5273456575, 0.2491168976, 0.3846435548, 0.9700927737 },
{ 0.3128662110, 0.2830810548, 0.7764892580, 0.0499267578, 0.2027587891, 0.6121826173, 0.8631591799, 0.3936767579, 0.0362262726, 0.3476886750, 0.7011737825, 0.3476581574, 0.4365253450, 0.8399372103, 0.5714111329, 0.0328369141 },
{ 0.8128662111, 0.7830810549, 0.0264892578, 0.9249267580, 0.8277587893, 0.4246826173, 0.1756591797, 0.5811767579, 0.9424762728, 0.6289386751, 0.2949237824, 0.6289081575, 0.5927753450, 0.1836872101, 0.4307861329, 0.9547119143 },
{ 0.5628662111, 0.0330810547, 0.5889892579, 0.1593017578, 0.0933837891, 0.5535888673, 0.8045654299, 0.4600830079, 0.0039997101, 0.3174152375, 0.7334003450, 0.3173847199, 0.4042987824, 0.8721637728, 0.5872802736, 0.0487060547 },
{ 0.0628662110, 0.5330810548, 0.3389892579, 0.7843017580, 0.9683837893, 0.4910888673, 0.2420654297, 0.5225830079, 0.9727497103, 0.6611652376, 0.2646503449, 0.6611347200, 0.6230487825, 0.1534137726, 0.4154052735, 0.9393310549 },
{ 0.0941162110, 0.0018310547, 0.9171142580, 0.5635986329, 0.4195556642, 0.3856201173, 0.3865966798, 0.9796142580, 0.4483356477, 0.1972980500, 0.8125019075, 0.0410175324, 0.1728534699, 0.6114215852, 0.6666259767, 0.2052001954 },
{ 0.5941162111, 0.5018310548, 0.1671142579, 0.4385986329, 0.5445556642, 0.5731201173, 0.5740966798, 0.0421142578, 0.5420856477, 0.7910480501, 0.1562519074, 0.9472675326, 0.8291034700, 0.3926715852, 0.3385009766, 0.7833251955 },
{ 0.8441162111, 0.2518310547, 0.7296142580, 0.7042236330, 0.3101806641, 0.4520263673, 0.4530029298, 0.9210205080, 0.4786090852, 0.2295246125, 0.8447284700, 0.0107440949, 0.1406269074, 0.5811481477, 0.6824951173, 0.1898193360 },
{ 0.3441162110, 0.7518310549, 0.4796142579, 0.3292236329, 0.6851806642, 0.5145263673, 0.5155029298, 0.1085205078, 0.5098590852, 0.7607746126, 0.1259784699, 0.9794940951, 0.8593769075, 0.4248981477, 0.3231201173, 0.7991943361 },
{ 0.4691162110, 0.3768310548, 0.0421142578, 0.8448486330, 0.0133056641, 0.2528076172, 0.3162841798, 0.7843017580, 0.3838825227, 0.1328449250, 0.7519550325, 0.0703144074, 0.2060565949, 0.5157184602, 0.6348876955, 0.2369384766 },
{ 0.9691162112, 0.8768310549, 0.7921142580, 0.2198486329, 0.8883056643, 0.6903076173, 0.6287841798, 0.2218017579, 0.6026325227, 0.8515949251, 0.2207050324, 0.9140644076, 0.7998065950, 0.4844684602, 0.3692626954, 0.7525634767 },
{ 0.7191162111, 0.1268310547, 0.3546142579, 0.9854736330, 0.1539306641, 0.3192138673, 0.2576904297, 0.8507080080, 0.4141559602, 0.1650714875, 0.7841815950, 0.1025409699, 0.2363300324, 0.5479450227, 0.6507568361, 0.2215576172 },
{ 0.2191162110, 0.6268310548, 0.6046142580, 0.1104736328, 0.7789306642, 0.6317138673, 0.6951904298, 0.1632080079, 0.5704059602, 0.8213214876, 0.1904315949, 0.8837909701, 0.7675800325, 0.4541950227, 0.3538818360, 0.7684326174 },
{ 0.1566162110, 0.3143310548, 0.4327392579, 0.1260986328, 0.6070556642, 0.1512451172, 0.0897216797, 0.6202392580, 0.3272418977, 0.1074543000, 0.9726581576, 0.2011737824, 0.1142597199, 0.6778278352, 0.7301025392, 0.1436767578 },
{ 0.6566162111, 0.8143310549, 0.6827392580, 0.7510986330, 0.4820556642, 0.8387451174, 0.9022216799, 0.4327392579, 0.6709918977, 0.8887043001, 0.0039081573, 0.7949237825, 0.8955097201, 0.3340778352, 0.2769775391, 0.8468017580 },
{ 0.9066162111, 0.0643310547, 0.2452392579, 0.0167236328, 0.7476806642, 0.2176513672, 0.0311279297, 0.5616455079, 0.3575153352, 0.0771808624, 0.9423847201, 0.2334003449, 0.0820331574, 0.6475543977, 0.7459716799, 0.1282958985 },
{ 0.4066162110, 0.5643310548, 0.9952392580, 0.8917236330, 0.3726806641, 0.7801513674, 0.9686279299, 0.4991455079, 0.6387653352, 0.9209308626, 0.0361347199, 0.7646503450, 0.9257831576, 0.3663043977, 0.2615966797, 0.8626708986 },
{ 0.2816162110, 0.1893310547, 0.5577392579, 0.4073486329, 0.9508056643, 0.0184326172, 0.1444091797, 0.6749267580, 0.2627887726, 0.0430011749, 0.9121112826, 0.1679706574, 0.0224628449, 0.7071247102, 0.6983642580, 0.1754150391 },
{ 0.7816162111, 0.6893310548, 0.3077392579, 0.5323486329, 0.0758056641, 0.9559326174, 0.8319091799, 0.3624267579, 0.7315387728, 0.9492511751, 0.0683612824, 0.8242206575, 0.9912128451, 0.3008747102, 0.3077392579, 0.8160400393 },
{ 0.5316162111, 0.4393310548, 0.8702392580, 0.2979736329, 0.8414306643, 0.0848388672, 0.2108154297, 0.7413330080, 0.2930622102, 0.0127277374, 0.8818378451, 0.1376972199, 0.0527362824, 0.7393512728, 0.7142333986, 0.1600341797 },
{ 0.0316162109, 0.9393310549, 0.1202392578, 0.6729736330, 0.2164306641, 0.8973388674, 0.7733154299, 0.3038330079, 0.6993122102, 0.9814777377, 0.1005878449, 0.8564472200, 0.9589862826, 0.2706012726, 0.2923583985, 0.8319091799 },
{ 0.0472412109, 0.2362060547, 0.4522705079, 0.1007080078, 0.0426025391, 0.7955322267, 0.4801025392, 0.7025146486, 0.6748981477, 0.7988605501, 0.2421894074, 0.6113300325, 0.5712909700, 0.1973590851, 0.7935791017, 0.3477783204 },
{ 0.5472412111, 0.7362060549, 0.7022705080, 0.9757080080, 0.9176025393, 0.2330322266, 0.5426025392, 0.2650146485, 0.3311481477, 0.2051105500, 0.7734394075, 0.3925800324, 0.4150409699, 0.7911090853, 0.2154541016, 0.6446533205 },
{ 0.7972412111, 0.4862060548, 0.1397705078, 0.2413330079, 0.1832275391, 0.8541259768, 0.4215087892, 0.6361083986, 0.6426715852, 0.7685871126, 0.2119159699, 0.5810565950, 0.6015644075, 0.2295856476, 0.8094482424, 0.3636474610 },
{ 0.2972412110, 0.9862060549, 0.8897705080, 0.8663330080, 0.8082275393, 0.1666259766, 0.6090087892, 0.3236083985, 0.3614215852, 0.2373371125, 0.8056659700, 0.4248065949, 0.3828144074, 0.7608356478, 0.2000732422, 0.6292724611 },
{ 0.4222412110, 0.3612060548, 0.5772705079, 0.3194580079, 0.3863525392, 0.9127197268, 0.2847900391, 0.5072021486, 0.7354450228, 0.8594074251, 0.1816425324, 0.5156269075, 0.5419940950, 0.1641559601, 0.7618408205, 0.3170166016 },
{ 0.9222412112, 0.8612060549, 0.3272705079, 0.6944580080, 0.5113525392, 0.1002197266, 0.7222900392, 0.4447021485, 0.2666950226, 0.1406574250, 0.8378925325, 0.4843769075, 0.4482440950, 0.8204059603, 0.2462158204, 0.6763916017 },
{ 0.6722412111, 0.1112060547, 0.7647705080, 0.4600830079, 0.2769775391, 0.9713134768, 0.3511962891, 0.5657958986, 0.7032184602, 0.8291339876, 0.1513690949, 0.5478534700, 0.5097675325, 0.1338825226, 0.7777099611, 0.3328857423 },
{ 0.1722412110, 0.6112060548, 0.0147705078, 0.5850830079, 0.6519775392, 0.0338134766, 0.6636962892, 0.3782958985, 0.2969684602, 0.1728839875, 0.8701190951, 0.4541034700, 0.4785175325, 0.8526325228, 0.2308349610, 0.6610107423 },
{ 0.2347412110, 0.4237060548, 0.9678955080, 0.6632080080, 0.9801025393, 0.5611572267, 0.0582275391, 0.8431396486, 0.5538043977, 0.8965168001, 0.0898456574, 0.6464862825, 0.6376972200, 0.0137653351, 0.8570556643, 0.2862548829 },
{ 0.7347412111, 0.9237060549, 0.2178955079, 0.2882080079, 0.1051025391, 0.4986572267, 0.9957275393, 0.1556396485, 0.4600543977, 0.1152668000, 0.9335956576, 0.3652362824, 0.3564472199, 0.9825153353, 0.1539306641, 0.7081298830 },
{ 0.9847412112, 0.1737060547, 0.6553955080, 0.5538330079, 0.8707275393, 0.6197509767, 0.1246337891, 0.7767333986, 0.5215778352, 0.9287433626, 0.1220722199, 0.6787128450, 0.6679706575, 0.0459918976, 0.8729248049, 0.3021240235 },
{ 0.4847412111, 0.6737060548, 0.4053955079, 0.4288330079, 0.2457275391, 0.4322509767, 0.9371337893, 0.2142333985, 0.4903278352, 0.0849933624, 0.9033222201, 0.3349628449, 0.3242206574, 0.9522418978, 0.1385498047, 0.6927490236 },
{ 0.3597412110, 0.0487060547, 0.0928955078, 0.8819580080, 0.5738525392, 0.6783447267, 0.2379150391, 0.8978271486, 0.6143512727, 0.9570636751, 0.0292987824, 0.7382831575, 0.7334003450, 0.1055622101, 0.8253173830, 0.2554931641 },
{ 0.8597412111, 0.5487060548, 0.8428955080, 0.0069580078, 0.4488525392, 0.3658447266, 0.8004150392, 0.0853271485, 0.3956012727, 0.0508136749, 0.9980487826, 0.2695331574, 0.2646503449, 0.8868122103, 0.1846923829, 0.7398681642 },
{ 0.6097412111, 0.2987060548, 0.2803955079, 0.7725830080, 0.7144775392, 0.7369384767, 0.1793212891, 0.9564208987, 0.5821247102, 0.9892902377, 0.0615253449, 0.7080097200, 0.7011737825, 0.0752887726, 0.8411865236, 0.2713623048 },
{ 0.1097412110, 0.7987060549, 0.5303955079, 0.1475830078, 0.3394775391, 0.2994384766, 0.8668212893, 0.0189208984, 0.4258747102, 0.0205402374, 0.9677753451, 0.3017597199, 0.2949237824, 0.9190387728, 0.1693115235, 0.7244873049 },
{ 0.0784912110, 0.2674560547, 0.2335205079, 0.4893798829, 0.7906494142, 0.3267822266, 0.5113525392, 0.4837646486, 0.9014606478, 0.6191730501, 0.3906269074, 0.9316425326, 0.9697284701, 0.3145465852, 0.9205322268, 0.4903564454 },
{ 0.5784912111, 0.7674560549, 0.9835205080, 0.6143798830, 0.1656494141, 0.6392822267, 0.4488525392, 0.5462646486, 0.1202106476, 0.4004230500, 0.6093769075, 0.0878925324, 0.0009784698, 0.6582965852, 0.0924072266, 0.5059814454 },
{ 0.8284912111, 0.0174560547, 0.4210205079, 0.3487548829, 0.9312744143, 0.2603759766, 0.5777587892, 0.4173583985, 0.9317340853, 0.5888996126, 0.4228534699, 0.9013690951, 0.9375019076, 0.3467731477, 0.9364013674, 0.4749755860 },
{ 0.3284912110, 0.5174560548, 0.6710205080, 0.7237548830, 0.0562744141, 0.6978759767, 0.3902587892, 0.6048583986, 0.0879840851, 0.4326496125, 0.5791034700, 0.1201190949, 0.0312519074, 0.6280231477, 0.0770263672, 0.5218505861 },
{ 0.4534912110, 0.1424560547, 0.8585205080, 0.2081298829, 0.6343994142, 0.4439697267, 0.6910400392, 0.2884521485, 0.9620075228, 0.5547199251, 0.4550800325, 0.9609394076, 0.8779315951, 0.2813434601, 0.8887939455, 0.4595947267 },
{ 0.9534912112, 0.6424560548, 0.1085205078, 0.8331298830, 0.2593994141, 0.5064697267, 0.2535400391, 0.7259521486, 0.0557575226, 0.4609699250, 0.5488300325, 0.0546894074, 0.0966815949, 0.6875934602, 0.1231689453, 0.5377197267 },
{ 0.7034912111, 0.3924560548, 0.5460205079, 0.0675048828, 0.5250244142, 0.3775634767, 0.6324462892, 0.3470458985, 0.9922809603, 0.5244464875, 0.4873065950, 0.9931659701, 0.9082050326, 0.2510700226, 0.9046630861, 0.4442138673 },
{ 0.2034912110, 0.8924560549, 0.2960205079, 0.9425048830, 0.4000244142, 0.5650634767, 0.3199462891, 0.6595458986, 0.0235309601, 0.4931964875, 0.5185565950, 0.0244159699, 0.0644550324, 0.7198200228, 0.1077880860, 0.5535888673 },
{ 0.1409912110, 0.0799560547, 0.7491455080, 0.8018798830, 0.2281494141, 0.0924072266, 0.9644775393, 0.1243896485, 0.7803668978, 0.7168293001, 0.3007831574, 0.8417987825, 0.7861347200, 0.3809528352, 0.9840087893, 0.4288330079 },
{ 0.6409912111, 0.5799560548, 0.4991455079, 0.1768798829, 0.8531494143, 0.9049072268, 0.0269775391, 0.9368896487, 0.2491168976, 0.3105793000, 0.7070331575, 0.1855487824, 0.1923847199, 0.5997028352, 0.0308837891, 0.5694580079 },
{ 0.8909912111, 0.3299560548, 0.9366455080, 0.9112548830, 0.1187744141, 0.0260009766, 0.9058837893, 0.0579833985, 0.8106403353, 0.7490558626, 0.2705097199, 0.8740253451, 0.7539081575, 0.4131793977, 0.9998779299, 0.4134521485 },
{ 0.3909912110, 0.8299560549, 0.1866455079, 0.0362548828, 0.9937744143, 0.9635009768, 0.0933837891, 0.9954833987, 0.2168903351, 0.2803058625, 0.7392597200, 0.1552753449, 0.2226581574, 0.5694293977, 0.0155029297, 0.5853271486 },
{ 0.2659912110, 0.4549560548, 0.3741455079, 0.5206298829, 0.3218994141, 0.2095947266, 0.7691650392, 0.1790771485, 0.8409137728, 0.6523761751, 0.3652362824, 0.8085956575, 0.8193378450, 0.4727497102, 0.9522705080, 0.3980712892 },
{ 0.7659912111, 0.9549560549, 0.6241455080, 0.3956298829, 0.6968994142, 0.7720947267, 0.2066650391, 0.8665771486, 0.1846637726, 0.3711261750, 0.6464862825, 0.2148456574, 0.1630878449, 0.5039997102, 0.0616455078, 0.6011962892 },
{ 0.5159912111, 0.2049560547, 0.0616455078, 0.6300048830, 0.4625244142, 0.1431884766, 0.8355712893, 0.2376708985, 0.8711872103, 0.6846027376, 0.3349628449, 0.7783222200, 0.8496112825, 0.4424762727, 0.9681396487, 0.3826904298 },
{ 0.0159912109, 0.7049560549, 0.8116455080, 0.2550048829, 0.5875244142, 0.8306884768, 0.1480712891, 0.8001708986, 0.1524372101, 0.3408527375, 0.6787128450, 0.2470722199, 0.1308612824, 0.5362262727, 0.0462646484, 0.6170654298 },
{ 0.0238037109, 0.1190185547, 0.0186767578, 0.1827392579, 0.9136962893, 0.5960693361, 0.2923583985, 0.1285400391, 0.0645160675, 0.2207050324, 0.8828449251, 0.6894855501, 0.9297199251, 0.4326801301, 0.0474853516, 0.5079345704 },
{ 0.5238037111, 0.6190185548, 0.7686767580, 0.8077392580, 0.0386962891, 0.4085693360, 0.7298583986, 0.8160400393, 0.9082660677, 0.7519550325, 0.1015949250, 0.2832355500, 0.0859699249, 0.5889301301, 0.9381103518, 0.4923095704 },
{ 0.7738037111, 0.3690185548, 0.3311767579, 0.0421142578, 0.8043212892, 0.5374755861, 0.3587646485, 0.1949462891, 0.0967426300, 0.1904315949, 0.9150714876, 0.7217121126, 0.8994464876, 0.4004535676, 0.0321044922, 0.5238037111 },
{ 0.2738037110, 0.8690185549, 0.5811767579, 0.9171142580, 0.1793212891, 0.4749755860, 0.6712646486, 0.7574462892, 0.8779926302, 0.7841815950, 0.0713214874, 0.2529621125, 0.1181964875, 0.6192035676, 0.9539794924, 0.4769287110 },
{ 0.3988037110, 0.4940185548, 0.8936767580, 0.4014892579, 0.5074462892, 0.7288818361, 0.4720458985, 0.0738525391, 0.0000629425, 0.1562519074, 0.9472980501, 0.6562824251, 0.9629230502, 0.4619770051, 0.0157470703, 0.5396728517 },
{ 0.8988037111, 0.9940185549, 0.1436767578, 0.5264892579, 0.3824462892, 0.2913818360, 0.5345458986, 0.8863525393, 0.9688129427, 0.8125019075, 0.0410480499, 0.3125324250, 0.0566730499, 0.5557270051, 0.9688720705, 0.4615478517 },
{ 0.6488037111, 0.2440185547, 0.7061767580, 0.2608642579, 0.6480712892, 0.6702880861, 0.4134521485, 0.0152587891, 0.0322895050, 0.1259784699, 0.9795246127, 0.6260089876, 0.9951496127, 0.4922504426, 0.0003662109, 0.5555419923 },
{ 0.1488037110, 0.7440185549, 0.4561767579, 0.6358642580, 0.2730712891, 0.3577880860, 0.6009521486, 0.9527587893, 0.9385395052, 0.8447284700, 0.0107746124, 0.3447589875, 0.0263996124, 0.5235004426, 0.9847412112, 0.4461669923 },
{ 0.2113037110, 0.3065185548, 0.5030517579, 0.6202392580, 0.1011962891, 0.8616943361, 0.2454833985, 0.2691650391, 0.1934223175, 0.0683612824, 0.7930011751, 0.5371418001, 0.8711261751, 0.3740863801, 0.1109619141, 0.5714111329 },
{ 0.7113037111, 0.8065185549, 0.2530517579, 0.4952392579, 0.9761962893, 0.1741943360, 0.8079833986, 0.7066650392, 0.7871723177, 0.9121112826, 0.1992511750, 0.4433918000, 0.1523761750, 0.6553363802, 0.8765869143, 0.4307861329 },
{ 0.9613037112, 0.0565185547, 0.8155517580, 0.7296142580, 0.2418212891, 0.8031005861, 0.1868896485, 0.3355712891, 0.2256488801, 0.1005878449, 0.7627277376, 0.5068683625, 0.8408527376, 0.3418598176, 0.0955810547, 0.5872802736 },
{ 0.4613037110, 0.5565185548, 0.0655517578, 0.3546142579, 0.8668212893, 0.2406005860, 0.8743896486, 0.6480712892, 0.7568988802, 0.8818378451, 0.2314777375, 0.4756183625, 0.1846027375, 0.6856098177, 0.8924560549, 0.4154052735 },
{ 0.3363037110, 0.1815185547, 0.3780517579, 0.8389892580, 0.4449462892, 0.9945068362, 0.0501708984, 0.4644775392, 0.1289691925, 0.0039081573, 0.8574543001, 0.5664386751, 0.7793293001, 0.2783832551, 0.0792236328, 0.6031494142 },
{ 0.8363037111, 0.6815185548, 0.6280517580, 0.2139892579, 0.5699462892, 0.0570068360, 0.9876708987, 0.5269775392, 0.8477191927, 0.9726581576, 0.1387043000, 0.4101886750, 0.2480793000, 0.7471332552, 0.9073486330, 0.4000244142 },
{ 0.5863037111, 0.4315185548, 0.1905517579, 0.9483642580, 0.3355712891, 0.9359130862, 0.1165771485, 0.4058837892, 0.1611957550, 0.0361347199, 0.8271808626, 0.5986652376, 0.8115558626, 0.3086566926, 0.0638427735, 0.6190185548 },
{ 0.0863037110, 0.9315185549, 0.9405517580, 0.0733642578, 0.7105712892, 0.1234130860, 0.9290771487, 0.5933837892, 0.8174457552, 0.9423847201, 0.1709308625, 0.3799152375, 0.2178058625, 0.7149066927, 0.9232177737, 0.3846435548 },
{ 0.1175537110, 0.4002685548, 0.2999267579, 0.2901611329, 0.1617431641, 0.0023193359, 0.6986083986, 0.9097900393, 0.3535785676, 0.4160175324, 0.7187824251, 0.7597980501, 0.5156574250, 0.0498676300, 0.1744384766, 0.6505126955 },
{ 0.6175537111, 0.9002685549, 0.5499267579, 0.6651611330, 0.7867431642, 0.9398193362, 0.2611083985, 0.0972900391, 0.6348285677, 0.5722675325, 0.2500324250, 0.2285480500, 0.4844074250, 0.9561176302, 0.8150634768, 0.3536376954 },
{ 0.8675537111, 0.1502685547, 0.1124267578, 0.4307861329, 0.0523681641, 0.0687255860, 0.6400146486, 0.9761962893, 0.3233051301, 0.3857440949, 0.6885089876, 0.7920246126, 0.5478839876, 0.0176410675, 0.1590576172, 0.6351318361 },
{ 0.3675537110, 0.6502685548, 0.8624267580, 0.5557861329, 0.9273681643, 0.8812255861, 0.3275146485, 0.0386962891, 0.6670551302, 0.6044940950, 0.2822589875, 0.1982746125, 0.4541339875, 0.9863910677, 0.8309326174, 0.3695068360 },
{ 0.4925537111, 0.0252685547, 0.6749267580, 0.0089111328, 0.2554931641, 0.1351318360, 0.5032958986, 0.8551025393, 0.2891254426, 0.4765644075, 0.6582355501, 0.8515949251, 0.6113605501, 0.0791645050, 0.1427001953, 0.6822509767 },
{ 0.9925537112, 0.5252685548, 0.4249267579, 0.8839111330, 0.6304931642, 0.8226318361, 0.4407958985, 0.1676025391, 0.6953754427, 0.5078144075, 0.3144855500, 0.1328449250, 0.3926105500, 0.9229145052, 0.8458251955, 0.3228759766 },
{ 0.7425537111, 0.2752685548, 0.9874267580, 0.1495361328, 0.3961181642, 0.2015380860, 0.5697021486, 0.7965087892, 0.2588520051, 0.4462909700, 0.6279621126, 0.8213214876, 0.5810871126, 0.1094379425, 0.1273193360, 0.6668701173 },
{ 0.2425537110, 0.7752685549, 0.2374267579, 0.7745361330, 0.5211181642, 0.7640380861, 0.3822021485, 0.2340087891, 0.7276020052, 0.5400409700, 0.3467121125, 0.1650714875, 0.4248371125, 0.8906879427, 0.8616943361, 0.3387451173 },
{ 0.1800537110, 0.2127685547, 0.7843017580, 0.9776611330, 0.8492431643, 0.2679443360, 0.7767333986, 0.5504150392, 0.4824848176, 0.2636737824, 0.5664386751, 0.9824543002, 0.7070636751, 0.2412738801, 0.2379150391, 0.7139892580 },
{ 0.6800537111, 0.7127685549, 0.0343017578, 0.1026611328, 0.2242431641, 0.7054443361, 0.2142333985, 0.4879150392, 0.5137348176, 0.7324237825, 0.4101886750, 0.0137042999, 0.3008136750, 0.7725238802, 0.7535400392, 0.2921142579 },
{ 0.9300537112, 0.4627685548, 0.5968017580, 0.8682861330, 0.9898681643, 0.3343505860, 0.8431396486, 0.6168212892, 0.4522113801, 0.2959003449, 0.5986652376, 0.9521808626, 0.7392902376, 0.2090473176, 0.2225341797, 0.6986083986 },
{ 0.4300537110, 0.9627685549, 0.3468017579, 0.2432861329, 0.1148681641, 0.6468505861, 0.1556396485, 0.4293212892, 0.5459613801, 0.7021503450, 0.3799152375, 0.0459308624, 0.2705402375, 0.8027973177, 0.7694091799, 0.3079833985 },
{ 0.3050537110, 0.3377685548, 0.1593017578, 0.6964111330, 0.6929931642, 0.4007568360, 0.9564208987, 0.7457275392, 0.4180316926, 0.3242206574, 0.5058918000, 0.8867511751, 0.6777668001, 0.1455707550, 0.2061767579, 0.7457275392 },
{ 0.8050537111, 0.8377685549, 0.9093017580, 0.3214111329, 0.3179931641, 0.5882568361, 0.0189208984, 0.3082275391, 0.5742816926, 0.6679706575, 0.4746418000, 0.1055011750, 0.3340168000, 0.8643207552, 0.7843017580, 0.2613525391 },
{ 0.5550537111, 0.0877685547, 0.4718017579, 0.5870361329, 0.5836181642, 0.4671630860, 0.8978271486, 0.6871337892, 0.3877582551, 0.3564472199, 0.5381183626, 0.9189777376, 0.6474933626, 0.1758441925, 0.1907958985, 0.7303466799 },
{ 0.0550537110, 0.5877685548, 0.7218017580, 0.4620361329, 0.4586181642, 0.5296630861, 0.0853271485, 0.3746337891, 0.6065082551, 0.6376972200, 0.4443683625, 0.0752277374, 0.3662433625, 0.8320941927, 0.8001708986, 0.2772216798 },
{ 0.0394287109, 0.3533935548, 0.8350830080, 0.7647705080, 0.2847900391, 0.6622314455, 0.6671142580, 0.6326904298, 0.5176410676, 0.5800800325, 0.3359699250, 0.3301105500, 0.2265949250, 0.6358051302, 0.3013916016, 0.7930908205 },
{ 0.5394287111, 0.8533935549, 0.0850830078, 0.1397705078, 0.6597900392, 0.3497314454, 0.3546142579, 0.3201904298, 0.4863910676, 0.4238300324, 0.6797199251, 0.6738605501, 0.7578449251, 0.3545551301, 0.6920166017, 0.2149658204 },
{ 0.7894287111, 0.1033935547, 0.5225830079, 0.9053955080, 0.4254150392, 0.7208251955, 0.7335205080, 0.6912841798, 0.5498676301, 0.6123065950, 0.3681964875, 0.3623371125, 0.1963214875, 0.6660785677, 0.2860107423, 0.8089599611 },
{ 0.2894287110, 0.6033935548, 0.2725830079, 0.0303955078, 0.5504150392, 0.2833251954, 0.2960205079, 0.2537841797, 0.4561176301, 0.3935565949, 0.6494464876, 0.6435871126, 0.7900714876, 0.3223285676, 0.7078857424, 0.1995849610 }
};
QRNG_VALIDATION_TEST_FUNCTIONS(niederreiter_base2)
QRNG_VALIDATION_TEST_DISCARD(niederreiter_base2)
BOOST_AUTO_TEST_CASE( check_generator_limits )
{
test_niederreiter_base2_max_seed();
test_niederreiter_base2_max_discard();
test_niederreiter_base2_max_dimension(BOOST_RANDOM_NIEDERREITER_BASE2_MAX_DIMENSION);
}
BOOST_AUTO_TEST_CASE( validate_niederreiter_base2 )
{
test_niederreiter_base2_values(niederreiter_base2_02_100, 4095);
test_niederreiter_base2_values(niederreiter_base2_07_100, 4095);
test_niederreiter_base2_values(niederreiter_base2_16_100, 4095);
}
BOOST_AUTO_TEST_CASE( validate_niederreiter_base2_seed )
{
test_niederreiter_base2_seed(niederreiter_base2_02_100, 4095);
test_niederreiter_base2_seed(niederreiter_base2_07_100, 4095);
test_niederreiter_base2_seed(niederreiter_base2_16_100, 4095);
}
BOOST_AUTO_TEST_CASE( validate_niederreiter_base2_discard )
{
test_niederreiter_base2_discard(niederreiter_base2_02_100, 4095);
test_niederreiter_base2_discard(niederreiter_base2_07_100, 4095);
test_niederreiter_base2_discard(niederreiter_base2_16_100, 4095);
}

380
test/sobol_validate.cpp Normal file
View File

@@ -0,0 +1,380 @@
// Copyright Justinas Vygintas Daugmaudis, 2010-2018.
// Use, modification and distribution is subject to the
// Boost Software License, Version 1.0. (See accompanying
// file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
#include <boost/random/sobol.hpp>
#include <boost/utility.hpp>
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include "test_qrng_functions.hpp"
//
// DESCRIPTION:
// ~~~~~~~~~~~~
//
// This file tests the sobol quasi-random number generator.
// These tests compare our results with values produced by the
// original sobol.cc program http://web.maths.unsw.edu.au/~fkuo/sobol/,
// using the new-joe-kuo-6.21201 direction polynomials and direction vectors.
//
// Generally, the command line used to generate the datasets was
// sobol SKIP+N+1 DIMENSION new-joe-kuo-6.21201 | tail -n N
// Note that we asked to show +1 sample from sobol.cc program, because
// it outputs trivial zeros as the first sample.
// Spatial dimension: 2
// N: 99
// Vectors skipped: 0
static const double sobol_02_99[99][2] =
{
{ 0.5000000002, 0.5000000002 },
{ 0.7500000003, 0.2500000001 },
{ 0.2500000001, 0.7500000003 },
{ 0.3750000002, 0.3750000002 },
{ 0.8750000004, 0.8750000004 },
{ 0.6250000003, 0.1250000001 },
{ 0.1250000001, 0.6250000003 },
{ 0.1875000001, 0.3125000001 },
{ 0.6875000003, 0.8125000004 },
{ 0.9375000004, 0.0625000000 },
{ 0.4375000002, 0.5625000003 },
{ 0.3125000001, 0.1875000001 },
{ 0.8125000004, 0.6875000003 },
{ 0.5625000003, 0.4375000002 },
{ 0.0625000000, 0.9375000004 },
{ 0.0937500000, 0.4687500002 },
{ 0.5937500003, 0.9687500005 },
{ 0.8437500004, 0.2187500001 },
{ 0.3437500002, 0.7187500003 },
{ 0.4687500002, 0.0937500000 },
{ 0.9687500005, 0.5937500003 },
{ 0.7187500003, 0.3437500002 },
{ 0.2187500001, 0.8437500004 },
{ 0.1562500001, 0.1562500001 },
{ 0.6562500003, 0.6562500003 },
{ 0.9062500004, 0.4062500002 },
{ 0.4062500002, 0.9062500004 },
{ 0.2812500001, 0.2812500001 },
{ 0.7812500004, 0.7812500004 },
{ 0.5312500002, 0.0312500000 },
{ 0.0312500000, 0.5312500002 },
{ 0.0468750000, 0.2656250001 },
{ 0.5468750003, 0.7656250004 },
{ 0.7968750004, 0.0156250000 },
{ 0.2968750001, 0.5156250002 },
{ 0.4218750002, 0.1406250001 },
{ 0.9218750004, 0.6406250003 },
{ 0.6718750003, 0.3906250002 },
{ 0.1718750001, 0.8906250004 },
{ 0.2343750001, 0.0781250000 },
{ 0.7343750003, 0.5781250003 },
{ 0.9843750005, 0.3281250002 },
{ 0.4843750002, 0.8281250004 },
{ 0.3593750002, 0.4531250002 },
{ 0.8593750004, 0.9531250004 },
{ 0.6093750003, 0.2031250001 },
{ 0.1093750001, 0.7031250003 },
{ 0.0781250000, 0.2343750001 },
{ 0.5781250003, 0.7343750003 },
{ 0.8281250004, 0.4843750002 },
{ 0.3281250002, 0.9843750005 },
{ 0.4531250002, 0.3593750002 },
{ 0.9531250004, 0.8593750004 },
{ 0.7031250003, 0.1093750001 },
{ 0.2031250001, 0.6093750003 },
{ 0.1406250001, 0.4218750002 },
{ 0.6406250003, 0.9218750004 },
{ 0.8906250004, 0.1718750001 },
{ 0.3906250002, 0.6718750003 },
{ 0.2656250001, 0.0468750000 },
{ 0.7656250004, 0.5468750003 },
{ 0.5156250002, 0.2968750001 },
{ 0.0156250000, 0.7968750004 },
{ 0.0234375000, 0.3984375002 },
{ 0.5234375002, 0.8984375004 },
{ 0.7734375004, 0.1484375001 },
{ 0.2734375001, 0.6484375003 },
{ 0.3984375002, 0.0234375000 },
{ 0.8984375004, 0.5234375002 },
{ 0.6484375003, 0.2734375001 },
{ 0.1484375001, 0.7734375004 },
{ 0.2109375001, 0.2109375001 },
{ 0.7109375003, 0.7109375003 },
{ 0.9609375004, 0.4609375002 },
{ 0.4609375002, 0.9609375004 },
{ 0.3359375002, 0.3359375002 },
{ 0.8359375004, 0.8359375004 },
{ 0.5859375003, 0.0859375000 },
{ 0.0859375000, 0.5859375003 },
{ 0.1171875001, 0.1171875001 },
{ 0.6171875003, 0.6171875003 },
{ 0.8671875004, 0.3671875002 },
{ 0.3671875002, 0.8671875004 },
{ 0.4921875002, 0.4921875002 },
{ 0.9921875005, 0.9921875005 },
{ 0.7421875003, 0.2421875001 },
{ 0.2421875001, 0.7421875003 },
{ 0.1796875001, 0.3046875001 },
{ 0.6796875003, 0.8046875004 },
{ 0.9296875004, 0.0546875000 },
{ 0.4296875002, 0.5546875003 },
{ 0.3046875001, 0.1796875001 },
{ 0.8046875004, 0.6796875003 },
{ 0.5546875003, 0.4296875002 },
{ 0.0546875000, 0.9296875004 },
{ 0.0390625000, 0.1328125001 },
{ 0.5390625003, 0.6328125003 },
{ 0.7890625004, 0.3828125002 },
{ 0.2890625001, 0.8828125004 }
};
// Spatial dimension: 7
// N: 100
// Vectors skipped: 127
static const double sobol_07_100[100][7] =
{
{ 0.0117187500, 0.3320312500, 0.2929687500, 0.1914062500, 0.9023437500, 0.6757812500, 0.8632812500 },
{ 0.5117187500, 0.8320312500, 0.7929687500, 0.6914062500, 0.4023437500, 0.1757812500, 0.3632812500 },
{ 0.7617187500, 0.0820312500, 0.0429687500, 0.4414062500, 0.1523437500, 0.4257812500, 0.6132812500 },
{ 0.2617187500, 0.5820312500, 0.5429687500, 0.9414062500, 0.6523437500, 0.9257812500, 0.1132812500 },
{ 0.3867187500, 0.2070312500, 0.9179687500, 0.8164062500, 0.5273437500, 0.5507812500, 0.7382812500 },
{ 0.8867187500, 0.7070312500, 0.4179687500, 0.3164062500, 0.0273437500, 0.0507812500, 0.2382812500 },
{ 0.6367187500, 0.4570312500, 0.6679687500, 0.5664062500, 0.2773437500, 0.3007812500, 0.9882812500 },
{ 0.1367187500, 0.9570312500, 0.1679687500, 0.0664062500, 0.7773437500, 0.8007812500, 0.4882812500 },
{ 0.1992187500, 0.0195312500, 0.7304687500, 0.2539062500, 0.4648437500, 0.9882812500, 0.6757812500 },
{ 0.6992187500, 0.5195312500, 0.2304687500, 0.7539062500, 0.9648437500, 0.4882812500, 0.1757812500 },
{ 0.9492187500, 0.2695312500, 0.9804687500, 0.0039062500, 0.7148437500, 0.2382812500, 0.9257812500 },
{ 0.4492187500, 0.7695312500, 0.4804687500, 0.5039062500, 0.2148437500, 0.7382812500, 0.4257812500 },
{ 0.3242187500, 0.3945312500, 0.1054687500, 0.6289062500, 0.0898437500, 0.8632812500, 0.8007812500 },
{ 0.8242187500, 0.8945312500, 0.6054687500, 0.1289062500, 0.5898437500, 0.3632812500, 0.3007812500 },
{ 0.5742187500, 0.1445312500, 0.3554687500, 0.8789062500, 0.8398437500, 0.1132812500, 0.5507812500 },
{ 0.0742187500, 0.6445312500, 0.8554687500, 0.3789062500, 0.3398437500, 0.6132812500, 0.0507812500 },
{ 0.1054687500, 0.1757812500, 0.1992187500, 0.5976562500, 0.6835937500, 0.3320312500, 0.3320312500 },
{ 0.6054687500, 0.6757812500, 0.6992187500, 0.0976562500, 0.1835937500, 0.8320312500, 0.8320312500 },
{ 0.8554687500, 0.4257812500, 0.4492187500, 0.8476562500, 0.4335937500, 0.5820312500, 0.0820312500 },
{ 0.3554687500, 0.9257812500, 0.9492187500, 0.3476562500, 0.9335937500, 0.0820312500, 0.5820312500 },
{ 0.4804687500, 0.3007812500, 0.5742187500, 0.4726562500, 0.8085937500, 0.4570312500, 0.2070312500 },
{ 0.9804687500, 0.8007812500, 0.0742187500, 0.9726562500, 0.3085937500, 0.9570312500, 0.7070312500 },
{ 0.7304687500, 0.0507812500, 0.8242187500, 0.2226562500, 0.0585937500, 0.7070312500, 0.4570312500 },
{ 0.2304687500, 0.5507812500, 0.3242187500, 0.7226562500, 0.5585937500, 0.2070312500, 0.9570312500 },
{ 0.1679687500, 0.4882812500, 0.7617187500, 0.9101562500, 0.2460937500, 0.0195312500, 0.1445312500 },
{ 0.6679687500, 0.9882812500, 0.2617187500, 0.4101562500, 0.7460937500, 0.5195312500, 0.6445312500 },
{ 0.9179687500, 0.2382812500, 0.5117187500, 0.6601562500, 0.9960937500, 0.7695312500, 0.3945312500 },
{ 0.4179687500, 0.7382812500, 0.0117187500, 0.1601562500, 0.4960937500, 0.2695312500, 0.8945312500 },
{ 0.2929687500, 0.1132812500, 0.3867187500, 0.0351562500, 0.3710937500, 0.1445312500, 0.2695312500 },
{ 0.7929687500, 0.6132812500, 0.8867187500, 0.5351562500, 0.8710937500, 0.6445312500, 0.7695312500 },
{ 0.5429687500, 0.3632812500, 0.1367187500, 0.2851562500, 0.6210937500, 0.8945312500, 0.0195312500 },
{ 0.0429687500, 0.8632812500, 0.6367187500, 0.7851562500, 0.1210937500, 0.3945312500, 0.5195312500 },
{ 0.0585937500, 0.0664062500, 0.9960937500, 0.7382812500, 0.7617187500, 0.2539062500, 0.0664062500 },
{ 0.5585937500, 0.5664062500, 0.4960937500, 0.2382812500, 0.2617187500, 0.7539062500, 0.5664062500 },
{ 0.8085937500, 0.3164062500, 0.7460937500, 0.9882812500, 0.0117187500, 0.5039062500, 0.3164062500 },
{ 0.3085937500, 0.8164062500, 0.2460937500, 0.4882812500, 0.5117187500, 0.0039062500, 0.8164062500 },
{ 0.4335937500, 0.4414062500, 0.3710937500, 0.3632812500, 0.6367187500, 0.3789062500, 0.4414062500 },
{ 0.9335937500, 0.9414062500, 0.8710937500, 0.8632812500, 0.1367187500, 0.8789062500, 0.9414062500 },
{ 0.6835937500, 0.1914062500, 0.1210937500, 0.1132812500, 0.3867187500, 0.6289062500, 0.1914062500 },
{ 0.1835937500, 0.6914062500, 0.6210937500, 0.6132812500, 0.8867187500, 0.1289062500, 0.6914062500 },
{ 0.2460937500, 0.2539062500, 0.0585937500, 0.8007812500, 0.3242187500, 0.0664062500, 0.3789062500 },
{ 0.7460937500, 0.7539062500, 0.5585937500, 0.3007812500, 0.8242187500, 0.5664062500, 0.8789062500 },
{ 0.9960937500, 0.0039062500, 0.3085937500, 0.5507812500, 0.5742187500, 0.8164062500, 0.1289062500 },
{ 0.4960937500, 0.5039062500, 0.8085937500, 0.0507812500, 0.0742187500, 0.3164062500, 0.6289062500 },
{ 0.3710937500, 0.1289062500, 0.6835937500, 0.1757812500, 0.1992187500, 0.1914062500, 0.0039062500 },
{ 0.8710937500, 0.6289062500, 0.1835937500, 0.6757812500, 0.6992187500, 0.6914062500, 0.5039062500 },
{ 0.6210937500, 0.3789062500, 0.9335937500, 0.4257812500, 0.9492187500, 0.9414062500, 0.2539062500 },
{ 0.1210937500, 0.8789062500, 0.4335937500, 0.9257812500, 0.4492187500, 0.4414062500, 0.7539062500 },
{ 0.0898437500, 0.4101562500, 0.5273437500, 0.0820312500, 0.5429687500, 0.7226562500, 0.5976562500 },
{ 0.5898437500, 0.9101562500, 0.0273437500, 0.5820312500, 0.0429687500, 0.2226562500, 0.0976562500 },
{ 0.8398437500, 0.1601562500, 0.7773437500, 0.3320312500, 0.2929687500, 0.4726562500, 0.8476562500 },
{ 0.3398437500, 0.6601562500, 0.2773437500, 0.8320312500, 0.7929687500, 0.9726562500, 0.3476562500 },
{ 0.4648437500, 0.0351562500, 0.1523437500, 0.9570312500, 0.9179687500, 0.5976562500, 0.9726562500 },
{ 0.9648437500, 0.5351562500, 0.6523437500, 0.4570312500, 0.4179687500, 0.0976562500, 0.4726562500 },
{ 0.7148437500, 0.2851562500, 0.4023437500, 0.7070312500, 0.1679687500, 0.3476562500, 0.7226562500 },
{ 0.2148437500, 0.7851562500, 0.9023437500, 0.2070312500, 0.6679687500, 0.8476562500, 0.2226562500 },
{ 0.1523437500, 0.2226562500, 0.4648437500, 0.3945312500, 0.1054687500, 0.9101562500, 0.9101562500 },
{ 0.6523437500, 0.7226562500, 0.9648437500, 0.8945312500, 0.6054687500, 0.4101562500, 0.4101562500 },
{ 0.9023437500, 0.4726562500, 0.2148437500, 0.1445312500, 0.8554687500, 0.1601562500, 0.6601562500 },
{ 0.4023437500, 0.9726562500, 0.7148437500, 0.6445312500, 0.3554687500, 0.6601562500, 0.1601562500 },
{ 0.2773437500, 0.3476562500, 0.8398437500, 0.5195312500, 0.4804687500, 0.7851562500, 0.5351562500 },
{ 0.7773437500, 0.8476562500, 0.3398437500, 0.0195312500, 0.9804687500, 0.2851562500, 0.0351562500 },
{ 0.5273437500, 0.0976562500, 0.5898437500, 0.7695312500, 0.7304687500, 0.0351562500, 0.7851562500 },
{ 0.0273437500, 0.5976562500, 0.0898437500, 0.2695312500, 0.2304687500, 0.5351562500, 0.2851562500 },
{ 0.0195312500, 0.1992187500, 0.5976562500, 0.9023437500, 0.2539062500, 0.8710937500, 0.4648437500 },
{ 0.5195312500, 0.6992187500, 0.0976562500, 0.4023437500, 0.7539062500, 0.3710937500, 0.9648437500 },
{ 0.7695312500, 0.4492187500, 0.8476562500, 0.6523437500, 0.5039062500, 0.1210937500, 0.2148437500 },
{ 0.2695312500, 0.9492187500, 0.3476562500, 0.1523437500, 0.0039062500, 0.6210937500, 0.7148437500 },
{ 0.3945312500, 0.3242187500, 0.2226562500, 0.0273437500, 0.1289062500, 0.9960937500, 0.0898437500 },
{ 0.8945312500, 0.8242187500, 0.7226562500, 0.5273437500, 0.6289062500, 0.4960937500, 0.5898437500 },
{ 0.6445312500, 0.0742187500, 0.4726562500, 0.2773437500, 0.8789062500, 0.2460937500, 0.3398437500 },
{ 0.1445312500, 0.5742187500, 0.9726562500, 0.7773437500, 0.3789062500, 0.7460937500, 0.8398437500 },
{ 0.2070312500, 0.3867187500, 0.4101562500, 0.5898437500, 0.8164062500, 0.5585937500, 0.0273437500 },
{ 0.7070312500, 0.8867187500, 0.9101562500, 0.0898437500, 0.3164062500, 0.0585937500, 0.5273437500 },
{ 0.9570312500, 0.1367187500, 0.1601562500, 0.8398437500, 0.0664062500, 0.3085937500, 0.2773437500 },
{ 0.4570312500, 0.6367187500, 0.6601562500, 0.3398437500, 0.5664062500, 0.8085937500, 0.7773437500 },
{ 0.3320312500, 0.0117187500, 0.7851562500, 0.4648437500, 0.6914062500, 0.6835937500, 0.4023437500 },
{ 0.8320312500, 0.5117187500, 0.2851562500, 0.9648437500, 0.1914062500, 0.1835937500, 0.9023437500 },
{ 0.5820312500, 0.2617187500, 0.5351562500, 0.2148437500, 0.4414062500, 0.4335937500, 0.1523437500 },
{ 0.0820312500, 0.7617187500, 0.0351562500, 0.7148437500, 0.9414062500, 0.9335937500, 0.6523437500 },
{ 0.1132812500, 0.2929687500, 0.8789062500, 0.3085937500, 0.0351562500, 0.1523437500, 0.9960937500 },
{ 0.6132812500, 0.7929687500, 0.3789062500, 0.8085937500, 0.5351562500, 0.6523437500, 0.4960937500 },
{ 0.8632812500, 0.0429687500, 0.6289062500, 0.0585937500, 0.7851562500, 0.9023437500, 0.7460937500 },
{ 0.3632812500, 0.5429687500, 0.1289062500, 0.5585937500, 0.2851562500, 0.4023437500, 0.2460937500 },
{ 0.4882812500, 0.1679687500, 0.2539062500, 0.6835937500, 0.4101562500, 0.0273437500, 0.6210937500 },
{ 0.9882812500, 0.6679687500, 0.7539062500, 0.1835937500, 0.9101562500, 0.5273437500, 0.1210937500 },
{ 0.7382812500, 0.4179687500, 0.0039062500, 0.9335937500, 0.6601562500, 0.7773437500, 0.8710937500 },
{ 0.2382812500, 0.9179687500, 0.5039062500, 0.4335937500, 0.1601562500, 0.2773437500, 0.3710937500 },
{ 0.1757812500, 0.1054687500, 0.0664062500, 0.2460937500, 0.5976562500, 0.4648437500, 0.5585937500 },
{ 0.6757812500, 0.6054687500, 0.5664062500, 0.7460937500, 0.0976562500, 0.9648437500, 0.0585937500 },
{ 0.9257812500, 0.3554687500, 0.3164062500, 0.4960937500, 0.3476562500, 0.7148437500, 0.8085937500 },
{ 0.4257812500, 0.8554687500, 0.8164062500, 0.9960937500, 0.8476562500, 0.2148437500, 0.3085937500 },
{ 0.3007812500, 0.4804687500, 0.6914062500, 0.8710937500, 0.9726562500, 0.3398437500, 0.9335937500 },
{ 0.8007812500, 0.9804687500, 0.1914062500, 0.3710937500, 0.4726562500, 0.8398437500, 0.4335937500 },
{ 0.5507812500, 0.2304687500, 0.9414062500, 0.6210937500, 0.2226562500, 0.5898437500, 0.6835937500 },
{ 0.0507812500, 0.7304687500, 0.4414062500, 0.1210937500, 0.7226562500, 0.0898437500, 0.1835937500 },
{ 0.0351562500, 0.4648437500, 0.1757812500, 0.4179687500, 0.3945312500, 0.1992187500, 0.7304687500 },
{ 0.5351562500, 0.9648437500, 0.6757812500, 0.9179687500, 0.8945312500, 0.6992187500, 0.2304687500 },
{ 0.7851562500, 0.2148437500, 0.4257812500, 0.1679687500, 0.6445312500, 0.9492187500, 0.9804687500 },
{ 0.2851562500, 0.7148437500, 0.9257812500, 0.6679687500, 0.1445312500, 0.4492187500, 0.4804687500 }
};
// Spatial dimension: 16
// N: 100
// Vectors skipped: 127
static const double sobol_16_100[100][16] =
{
{ 0.0117187500, 0.3320312500, 0.2929687500, 0.1914062500, 0.9023437500, 0.6757812500, 0.8632812500, 0.2460937500, 0.1054687500, 0.8164062500, 0.7382812500, 0.7382812500, 0.8164062500, 0.8789062500, 0.0273437500, 0.7617187500 },
{ 0.5117187500, 0.8320312500, 0.7929687500, 0.6914062500, 0.4023437500, 0.1757812500, 0.3632812500, 0.7460937500, 0.6054687500, 0.3164062500, 0.2382812500, 0.2382812500, 0.3164062500, 0.3789062500, 0.5273437500, 0.2617187500 },
{ 0.7617187500, 0.0820312500, 0.0429687500, 0.4414062500, 0.1523437500, 0.4257812500, 0.6132812500, 0.9960937500, 0.8554687500, 0.0664062500, 0.4882812500, 0.4882812500, 0.5664062500, 0.6289062500, 0.7773437500, 0.5117187500 },
{ 0.2617187500, 0.5820312500, 0.5429687500, 0.9414062500, 0.6523437500, 0.9257812500, 0.1132812500, 0.4960937500, 0.3554687500, 0.5664062500, 0.9882812500, 0.9882812500, 0.0664062500, 0.1289062500, 0.2773437500, 0.0117187500 },
{ 0.3867187500, 0.2070312500, 0.9179687500, 0.8164062500, 0.5273437500, 0.5507812500, 0.7382812500, 0.8710937500, 0.9804687500, 0.4414062500, 0.3632812500, 0.8632812500, 0.6914062500, 0.2539062500, 0.4023437500, 0.1367187500 },
{ 0.8867187500, 0.7070312500, 0.4179687500, 0.3164062500, 0.0273437500, 0.0507812500, 0.2382812500, 0.3710937500, 0.4804687500, 0.9414062500, 0.8632812500, 0.3632812500, 0.1914062500, 0.7539062500, 0.9023437500, 0.6367187500 },
{ 0.6367187500, 0.4570312500, 0.6679687500, 0.5664062500, 0.2773437500, 0.3007812500, 0.9882812500, 0.1210937500, 0.2304687500, 0.6914062500, 0.6132812500, 0.1132812500, 0.9414062500, 0.0039062500, 0.6523437500, 0.3867187500 },
{ 0.1367187500, 0.9570312500, 0.1679687500, 0.0664062500, 0.7773437500, 0.8007812500, 0.4882812500, 0.6210937500, 0.7304687500, 0.1914062500, 0.1132812500, 0.6132812500, 0.4414062500, 0.5039062500, 0.1523437500, 0.8867187500 },
{ 0.1992187500, 0.0195312500, 0.7304687500, 0.2539062500, 0.4648437500, 0.9882812500, 0.6757812500, 0.8085937500, 0.9179687500, 0.5039062500, 0.0507812500, 0.6757812500, 0.1289062500, 0.0664062500, 0.8398437500, 0.1992187500 },
{ 0.6992187500, 0.5195312500, 0.2304687500, 0.7539062500, 0.9648437500, 0.4882812500, 0.1757812500, 0.3085937500, 0.4179687500, 0.0039062500, 0.5507812500, 0.1757812500, 0.6289062500, 0.5664062500, 0.3398437500, 0.6992187500 },
{ 0.9492187500, 0.2695312500, 0.9804687500, 0.0039062500, 0.7148437500, 0.2382812500, 0.9257812500, 0.0585937500, 0.1679687500, 0.2539062500, 0.8007812500, 0.4257812500, 0.3789062500, 0.3164062500, 0.0898437500, 0.4492187500 },
{ 0.4492187500, 0.7695312500, 0.4804687500, 0.5039062500, 0.2148437500, 0.7382812500, 0.4257812500, 0.5585937500, 0.6679687500, 0.7539062500, 0.3007812500, 0.9257812500, 0.8789062500, 0.8164062500, 0.5898437500, 0.9492187500 },
{ 0.3242187500, 0.3945312500, 0.1054687500, 0.6289062500, 0.0898437500, 0.8632812500, 0.8007812500, 0.1835937500, 0.0429687500, 0.1289062500, 0.9257812500, 0.8007812500, 0.2539062500, 0.6914062500, 0.7148437500, 0.8242187500 },
{ 0.8242187500, 0.8945312500, 0.6054687500, 0.1289062500, 0.5898437500, 0.3632812500, 0.3007812500, 0.6835937500, 0.5429687500, 0.6289062500, 0.4257812500, 0.3007812500, 0.7539062500, 0.1914062500, 0.2148437500, 0.3242187500 },
{ 0.5742187500, 0.1445312500, 0.3554687500, 0.8789062500, 0.8398437500, 0.1132812500, 0.5507812500, 0.9335937500, 0.7929687500, 0.8789062500, 0.1757812500, 0.0507812500, 0.0039062500, 0.9414062500, 0.4648437500, 0.5742187500 },
{ 0.0742187500, 0.6445312500, 0.8554687500, 0.3789062500, 0.3398437500, 0.6132812500, 0.0507812500, 0.4335937500, 0.2929687500, 0.3789062500, 0.6757812500, 0.5507812500, 0.5039062500, 0.4414062500, 0.9648437500, 0.0742187500 },
{ 0.1054687500, 0.1757812500, 0.1992187500, 0.5976562500, 0.6835937500, 0.3320312500, 0.3320312500, 0.9023437500, 0.3867187500, 0.9726562500, 0.6445312500, 0.8320312500, 0.4726562500, 0.2851562500, 0.3710937500, 0.7929687500 },
{ 0.6054687500, 0.6757812500, 0.6992187500, 0.0976562500, 0.1835937500, 0.8320312500, 0.8320312500, 0.4023437500, 0.8867187500, 0.4726562500, 0.1445312500, 0.3320312500, 0.9726562500, 0.7851562500, 0.8710937500, 0.2929687500 },
{ 0.8554687500, 0.4257812500, 0.4492187500, 0.8476562500, 0.4335937500, 0.5820312500, 0.0820312500, 0.1523437500, 0.6367187500, 0.2226562500, 0.3945312500, 0.0820312500, 0.2226562500, 0.0351562500, 0.6210937500, 0.5429687500 },
{ 0.3554687500, 0.9257812500, 0.9492187500, 0.3476562500, 0.9335937500, 0.0820312500, 0.5820312500, 0.6523437500, 0.1367187500, 0.7226562500, 0.8945312500, 0.5820312500, 0.7226562500, 0.5351562500, 0.1210937500, 0.0429687500 },
{ 0.4804687500, 0.3007812500, 0.5742187500, 0.4726562500, 0.8085937500, 0.4570312500, 0.2070312500, 0.0273437500, 0.5117187500, 0.3476562500, 0.2695312500, 0.7070312500, 0.0976562500, 0.9101562500, 0.2460937500, 0.1679687500 },
{ 0.9804687500, 0.8007812500, 0.0742187500, 0.9726562500, 0.3085937500, 0.9570312500, 0.7070312500, 0.5273437500, 0.0117187500, 0.8476562500, 0.7695312500, 0.2070312500, 0.5976562500, 0.4101562500, 0.7460937500, 0.6679687500 },
{ 0.7304687500, 0.0507812500, 0.8242187500, 0.2226562500, 0.0585937500, 0.7070312500, 0.4570312500, 0.7773437500, 0.2617187500, 0.5976562500, 0.5195312500, 0.4570312500, 0.3476562500, 0.6601562500, 0.9960937500, 0.4179687500 },
{ 0.2304687500, 0.5507812500, 0.3242187500, 0.7226562500, 0.5585937500, 0.2070312500, 0.9570312500, 0.2773437500, 0.7617187500, 0.0976562500, 0.0195312500, 0.9570312500, 0.8476562500, 0.1601562500, 0.4960937500, 0.9179687500 },
{ 0.1679687500, 0.4882812500, 0.7617187500, 0.9101562500, 0.2460937500, 0.0195312500, 0.1445312500, 0.0898437500, 0.5742187500, 0.6601562500, 0.0820312500, 0.7695312500, 0.5351562500, 0.7226562500, 0.5585937500, 0.2304687500 },
{ 0.6679687500, 0.9882812500, 0.2617187500, 0.4101562500, 0.7460937500, 0.5195312500, 0.6445312500, 0.5898437500, 0.0742187500, 0.1601562500, 0.5820312500, 0.2695312500, 0.0351562500, 0.2226562500, 0.0585937500, 0.7304687500 },
{ 0.9179687500, 0.2382812500, 0.5117187500, 0.6601562500, 0.9960937500, 0.7695312500, 0.3945312500, 0.8398437500, 0.3242187500, 0.4101562500, 0.8320312500, 0.0195312500, 0.7851562500, 0.9726562500, 0.3085937500, 0.4804687500 },
{ 0.4179687500, 0.7382812500, 0.0117187500, 0.1601562500, 0.4960937500, 0.2695312500, 0.8945312500, 0.3398437500, 0.8242187500, 0.9101562500, 0.3320312500, 0.5195312500, 0.2851562500, 0.4726562500, 0.8085937500, 0.9804687500 },
{ 0.2929687500, 0.1132812500, 0.3867187500, 0.0351562500, 0.3710937500, 0.1445312500, 0.2695312500, 0.9648437500, 0.4492187500, 0.0351562500, 0.9570312500, 0.6445312500, 0.9101562500, 0.0976562500, 0.9335937500, 0.8554687500 },
{ 0.7929687500, 0.6132812500, 0.8867187500, 0.5351562500, 0.8710937500, 0.6445312500, 0.7695312500, 0.4648437500, 0.9492187500, 0.5351562500, 0.4570312500, 0.1445312500, 0.4101562500, 0.5976562500, 0.4335937500, 0.3554687500 },
{ 0.5429687500, 0.3632812500, 0.1367187500, 0.2851562500, 0.6210937500, 0.8945312500, 0.0195312500, 0.2148437500, 0.6992187500, 0.7851562500, 0.2070312500, 0.3945312500, 0.6601562500, 0.3476562500, 0.1835937500, 0.6054687500 },
{ 0.0429687500, 0.8632812500, 0.6367187500, 0.7851562500, 0.1210937500, 0.3945312500, 0.5195312500, 0.7148437500, 0.1992187500, 0.2851562500, 0.7070312500, 0.8945312500, 0.1601562500, 0.8476562500, 0.6835937500, 0.1054687500 },
{ 0.0585937500, 0.0664062500, 0.9960937500, 0.7382812500, 0.7617187500, 0.2539062500, 0.0664062500, 0.5742187500, 0.9023437500, 0.8632812500, 0.8476562500, 0.2851562500, 0.6445312500, 0.1132812500, 0.9804687500, 0.8710937500 },
{ 0.5585937500, 0.5664062500, 0.4960937500, 0.2382812500, 0.2617187500, 0.7539062500, 0.5664062500, 0.0742187500, 0.4023437500, 0.3632812500, 0.3476562500, 0.7851562500, 0.1445312500, 0.6132812500, 0.4804687500, 0.3710937500 },
{ 0.8085937500, 0.3164062500, 0.7460937500, 0.9882812500, 0.0117187500, 0.5039062500, 0.3164062500, 0.3242187500, 0.1523437500, 0.1132812500, 0.0976562500, 0.5351562500, 0.8945312500, 0.3632812500, 0.2304687500, 0.6210937500 },
{ 0.3085937500, 0.8164062500, 0.2460937500, 0.4882812500, 0.5117187500, 0.0039062500, 0.8164062500, 0.8242187500, 0.6523437500, 0.6132812500, 0.5976562500, 0.0351562500, 0.3945312500, 0.8632812500, 0.7304687500, 0.1210937500 },
{ 0.4335937500, 0.4414062500, 0.3710937500, 0.3632812500, 0.6367187500, 0.3789062500, 0.4414062500, 0.4492187500, 0.0273437500, 0.4882812500, 0.2226562500, 0.1601562500, 0.7695312500, 0.7382812500, 0.6054687500, 0.2460937500 },
{ 0.9335937500, 0.9414062500, 0.8710937500, 0.8632812500, 0.1367187500, 0.8789062500, 0.9414062500, 0.9492187500, 0.5273437500, 0.9882812500, 0.7226562500, 0.6601562500, 0.2695312500, 0.2382812500, 0.1054687500, 0.7460937500 },
{ 0.6835937500, 0.1914062500, 0.1210937500, 0.1132812500, 0.3867187500, 0.6289062500, 0.1914062500, 0.6992187500, 0.7773437500, 0.7382812500, 0.9726562500, 0.9101562500, 0.5195312500, 0.9882812500, 0.3554687500, 0.4960937500 },
{ 0.1835937500, 0.6914062500, 0.6210937500, 0.6132812500, 0.8867187500, 0.1289062500, 0.6914062500, 0.1992187500, 0.2773437500, 0.2382812500, 0.4726562500, 0.4101562500, 0.0195312500, 0.4882812500, 0.8554687500, 0.9960937500 },
{ 0.2460937500, 0.2539062500, 0.0585937500, 0.8007812500, 0.3242187500, 0.0664062500, 0.3789062500, 0.3867187500, 0.0898437500, 0.5507812500, 0.4101562500, 0.3476562500, 0.3320312500, 0.9257812500, 0.1679687500, 0.1835937500 },
{ 0.7460937500, 0.7539062500, 0.5585937500, 0.3007812500, 0.8242187500, 0.5664062500, 0.8789062500, 0.8867187500, 0.5898437500, 0.0507812500, 0.9101562500, 0.8476562500, 0.8320312500, 0.4257812500, 0.6679687500, 0.6835937500 },
{ 0.9960937500, 0.0039062500, 0.3085937500, 0.5507812500, 0.5742187500, 0.8164062500, 0.1289062500, 0.6367187500, 0.8398437500, 0.3007812500, 0.6601562500, 0.5976562500, 0.0820312500, 0.6757812500, 0.9179687500, 0.4335937500 },
{ 0.4960937500, 0.5039062500, 0.8085937500, 0.0507812500, 0.0742187500, 0.3164062500, 0.6289062500, 0.1367187500, 0.3398437500, 0.8007812500, 0.1601562500, 0.0976562500, 0.5820312500, 0.1757812500, 0.4179687500, 0.9335937500 },
{ 0.3710937500, 0.1289062500, 0.6835937500, 0.1757812500, 0.1992187500, 0.1914062500, 0.0039062500, 0.5117187500, 0.9648437500, 0.1757812500, 0.5351562500, 0.2226562500, 0.2070312500, 0.3007812500, 0.2929687500, 0.8085937500 },
{ 0.8710937500, 0.6289062500, 0.1835937500, 0.6757812500, 0.6992187500, 0.6914062500, 0.5039062500, 0.0117187500, 0.4648437500, 0.6757812500, 0.0351562500, 0.7226562500, 0.7070312500, 0.8007812500, 0.7929687500, 0.3085937500 },
{ 0.6210937500, 0.3789062500, 0.9335937500, 0.4257812500, 0.9492187500, 0.9414062500, 0.2539062500, 0.2617187500, 0.2148437500, 0.9257812500, 0.2851562500, 0.9726562500, 0.4570312500, 0.0507812500, 0.5429687500, 0.5585937500 },
{ 0.1210937500, 0.8789062500, 0.4335937500, 0.9257812500, 0.4492187500, 0.4414062500, 0.7539062500, 0.7617187500, 0.7148437500, 0.4257812500, 0.7851562500, 0.4726562500, 0.9570312500, 0.5507812500, 0.0429687500, 0.0585937500 },
{ 0.0898437500, 0.4101562500, 0.5273437500, 0.0820312500, 0.5429687500, 0.7226562500, 0.5976562500, 0.2929687500, 0.6210937500, 0.9570312500, 0.7539062500, 0.1289062500, 0.0507812500, 0.7070312500, 0.6367187500, 0.8398437500 },
{ 0.5898437500, 0.9101562500, 0.0273437500, 0.5820312500, 0.0429687500, 0.2226562500, 0.0976562500, 0.7929687500, 0.1210937500, 0.4570312500, 0.2539062500, 0.6289062500, 0.5507812500, 0.2070312500, 0.1367187500, 0.3398437500 },
{ 0.8398437500, 0.1601562500, 0.7773437500, 0.3320312500, 0.2929687500, 0.4726562500, 0.8476562500, 0.5429687500, 0.3710937500, 0.2070312500, 0.0039062500, 0.8789062500, 0.3007812500, 0.9570312500, 0.3867187500, 0.5898437500 },
{ 0.3398437500, 0.6601562500, 0.2773437500, 0.8320312500, 0.7929687500, 0.9726562500, 0.3476562500, 0.0429687500, 0.8710937500, 0.7070312500, 0.5039062500, 0.3789062500, 0.8007812500, 0.4570312500, 0.8867187500, 0.0898437500 },
{ 0.4648437500, 0.0351562500, 0.1523437500, 0.9570312500, 0.9179687500, 0.5976562500, 0.9726562500, 0.6679687500, 0.4960937500, 0.3320312500, 0.1289062500, 0.2539062500, 0.4257812500, 0.0820312500, 0.7617187500, 0.2148437500 },
{ 0.9648437500, 0.5351562500, 0.6523437500, 0.4570312500, 0.4179687500, 0.0976562500, 0.4726562500, 0.1679687500, 0.9960937500, 0.8320312500, 0.6289062500, 0.7539062500, 0.9257812500, 0.5820312500, 0.2617187500, 0.7148437500 },
{ 0.7148437500, 0.2851562500, 0.4023437500, 0.7070312500, 0.1679687500, 0.3476562500, 0.7226562500, 0.4179687500, 0.7460937500, 0.5820312500, 0.8789062500, 0.5039062500, 0.1757812500, 0.3320312500, 0.0117187500, 0.4648437500 },
{ 0.2148437500, 0.7851562500, 0.9023437500, 0.2070312500, 0.6679687500, 0.8476562500, 0.2226562500, 0.9179687500, 0.2460937500, 0.0820312500, 0.3789062500, 0.0039062500, 0.6757812500, 0.8320312500, 0.5117187500, 0.9648437500 },
{ 0.1523437500, 0.2226562500, 0.4648437500, 0.3945312500, 0.1054687500, 0.9101562500, 0.9101562500, 0.7304687500, 0.4335937500, 0.6445312500, 0.4414062500, 0.1914062500, 0.9882812500, 0.2695312500, 0.4492187500, 0.1523437500 },
{ 0.6523437500, 0.7226562500, 0.9648437500, 0.8945312500, 0.6054687500, 0.4101562500, 0.4101562500, 0.2304687500, 0.9335937500, 0.1445312500, 0.9414062500, 0.6914062500, 0.4882812500, 0.7695312500, 0.9492187500, 0.6523437500 },
{ 0.9023437500, 0.4726562500, 0.2148437500, 0.1445312500, 0.8554687500, 0.1601562500, 0.6601562500, 0.4804687500, 0.6835937500, 0.3945312500, 0.6914062500, 0.9414062500, 0.7382812500, 0.0195312500, 0.6992187500, 0.4023437500 },
{ 0.4023437500, 0.9726562500, 0.7148437500, 0.6445312500, 0.3554687500, 0.6601562500, 0.1601562500, 0.9804687500, 0.1835937500, 0.8945312500, 0.1914062500, 0.4414062500, 0.2382812500, 0.5195312500, 0.1992187500, 0.9023437500 },
{ 0.2773437500, 0.3476562500, 0.8398437500, 0.5195312500, 0.4804687500, 0.7851562500, 0.5351562500, 0.3554687500, 0.5585937500, 0.0195312500, 0.5664062500, 0.3164062500, 0.6132812500, 0.8945312500, 0.0742187500, 0.7773437500 },
{ 0.7773437500, 0.8476562500, 0.3398437500, 0.0195312500, 0.9804687500, 0.2851562500, 0.0351562500, 0.8554687500, 0.0585937500, 0.5195312500, 0.0664062500, 0.8164062500, 0.1132812500, 0.3945312500, 0.5742187500, 0.2773437500 },
{ 0.5273437500, 0.0976562500, 0.5898437500, 0.7695312500, 0.7304687500, 0.0351562500, 0.7851562500, 0.6054687500, 0.3085937500, 0.7695312500, 0.3164062500, 0.5664062500, 0.8632812500, 0.6445312500, 0.8242187500, 0.5273437500 },
{ 0.0273437500, 0.5976562500, 0.0898437500, 0.2695312500, 0.2304687500, 0.5351562500, 0.2851562500, 0.1054687500, 0.8085937500, 0.2695312500, 0.8164062500, 0.0664062500, 0.3632812500, 0.1445312500, 0.3242187500, 0.0273437500 },
{ 0.0195312500, 0.1992187500, 0.5976562500, 0.9023437500, 0.2539062500, 0.8710937500, 0.4648437500, 0.0351562500, 0.6445312500, 0.8085937500, 0.3085937500, 0.5273437500, 0.7460937500, 0.4023437500, 0.7851562500, 0.2539062500 },
{ 0.5195312500, 0.6992187500, 0.0976562500, 0.4023437500, 0.7539062500, 0.3710937500, 0.9648437500, 0.5351562500, 0.1445312500, 0.3085937500, 0.8085937500, 0.0273437500, 0.2460937500, 0.9023437500, 0.2851562500, 0.7539062500 },
{ 0.7695312500, 0.4492187500, 0.8476562500, 0.6523437500, 0.5039062500, 0.1210937500, 0.2148437500, 0.7851562500, 0.3945312500, 0.0585937500, 0.5585937500, 0.2773437500, 0.9960937500, 0.1523437500, 0.0351562500, 0.0039062500 },
{ 0.2695312500, 0.9492187500, 0.3476562500, 0.1523437500, 0.0039062500, 0.6210937500, 0.7148437500, 0.2851562500, 0.8945312500, 0.5585937500, 0.0585937500, 0.7773437500, 0.4960937500, 0.6523437500, 0.5351562500, 0.5039062500 },
{ 0.3945312500, 0.3242187500, 0.2226562500, 0.0273437500, 0.1289062500, 0.9960937500, 0.0898437500, 0.9101562500, 0.2695312500, 0.4335937500, 0.6835937500, 0.9023437500, 0.8710937500, 0.7773437500, 0.6601562500, 0.6289062500 },
{ 0.8945312500, 0.8242187500, 0.7226562500, 0.5273437500, 0.6289062500, 0.4960937500, 0.5898437500, 0.4101562500, 0.7695312500, 0.9335937500, 0.1835937500, 0.4023437500, 0.3710937500, 0.2773437500, 0.1601562500, 0.1289062500 },
{ 0.6445312500, 0.0742187500, 0.4726562500, 0.2773437500, 0.8789062500, 0.2460937500, 0.3398437500, 0.1601562500, 0.5195312500, 0.6835937500, 0.4335937500, 0.1523437500, 0.6210937500, 0.5273437500, 0.4101562500, 0.8789062500 },
{ 0.1445312500, 0.5742187500, 0.9726562500, 0.7773437500, 0.3789062500, 0.7460937500, 0.8398437500, 0.6601562500, 0.0195312500, 0.1835937500, 0.9335937500, 0.6523437500, 0.1210937500, 0.0273437500, 0.9101562500, 0.3789062500 },
{ 0.2070312500, 0.3867187500, 0.4101562500, 0.5898437500, 0.8164062500, 0.5585937500, 0.0273437500, 0.9726562500, 0.3320312500, 0.6210937500, 0.9960937500, 0.5898437500, 0.3085937500, 0.5898437500, 0.0976562500, 0.6914062500 },
{ 0.7070312500, 0.8867187500, 0.9101562500, 0.0898437500, 0.3164062500, 0.0585937500, 0.5273437500, 0.4726562500, 0.8320312500, 0.1210937500, 0.4960937500, 0.0898437500, 0.8085937500, 0.0898437500, 0.5976562500, 0.1914062500 },
{ 0.9570312500, 0.1367187500, 0.1601562500, 0.8398437500, 0.0664062500, 0.3085937500, 0.2773437500, 0.2226562500, 0.5820312500, 0.3710937500, 0.2460937500, 0.3398437500, 0.0585937500, 0.8398437500, 0.8476562500, 0.9414062500 },
{ 0.4570312500, 0.6367187500, 0.6601562500, 0.3398437500, 0.5664062500, 0.8085937500, 0.7773437500, 0.7226562500, 0.0820312500, 0.8710937500, 0.7460937500, 0.8398437500, 0.5585937500, 0.3398437500, 0.3476562500, 0.4414062500 },
{ 0.3320312500, 0.0117187500, 0.7851562500, 0.4648437500, 0.6914062500, 0.6835937500, 0.4023437500, 0.0976562500, 0.7070312500, 0.2460937500, 0.1210937500, 0.9648437500, 0.1835937500, 0.2148437500, 0.4726562500, 0.3164062500 },
{ 0.8320312500, 0.5117187500, 0.2851562500, 0.9648437500, 0.1914062500, 0.1835937500, 0.9023437500, 0.5976562500, 0.2070312500, 0.7460937500, 0.6210937500, 0.4648437500, 0.6835937500, 0.7148437500, 0.9726562500, 0.8164062500 },
{ 0.5820312500, 0.2617187500, 0.5351562500, 0.2148437500, 0.4414062500, 0.4335937500, 0.1523437500, 0.8476562500, 0.4570312500, 0.9960937500, 0.8710937500, 0.2148437500, 0.4335937500, 0.4648437500, 0.7226562500, 0.0664062500 },
{ 0.0820312500, 0.7617187500, 0.0351562500, 0.7148437500, 0.9414062500, 0.9335937500, 0.6523437500, 0.3476562500, 0.9570312500, 0.4960937500, 0.3710937500, 0.7148437500, 0.9335937500, 0.9648437500, 0.2226562500, 0.5664062500 },
{ 0.1132812500, 0.2929687500, 0.8789062500, 0.3085937500, 0.0351562500, 0.1523437500, 0.9960937500, 0.8164062500, 0.8632812500, 0.9023437500, 0.3398437500, 0.9335937500, 0.0898437500, 0.8085937500, 0.5664062500, 0.2851562500 },
{ 0.6132812500, 0.7929687500, 0.3789062500, 0.8085937500, 0.5351562500, 0.6523437500, 0.4960937500, 0.3164062500, 0.3632812500, 0.4023437500, 0.8398437500, 0.4335937500, 0.5898437500, 0.3085937500, 0.0664062500, 0.7851562500 },
{ 0.8632812500, 0.0429687500, 0.6289062500, 0.0585937500, 0.7851562500, 0.9023437500, 0.7460937500, 0.0664062500, 0.1132812500, 0.1523437500, 0.5898437500, 0.1835937500, 0.3398437500, 0.5585937500, 0.3164062500, 0.0351562500 },
{ 0.3632812500, 0.5429687500, 0.1289062500, 0.5585937500, 0.2851562500, 0.4023437500, 0.2460937500, 0.5664062500, 0.6132812500, 0.6523437500, 0.0898437500, 0.6835937500, 0.8398437500, 0.0585937500, 0.8164062500, 0.5351562500 },
{ 0.4882812500, 0.1679687500, 0.2539062500, 0.6835937500, 0.4101562500, 0.0273437500, 0.6210937500, 0.1914062500, 0.2382812500, 0.2773437500, 0.7148437500, 0.5585937500, 0.4648437500, 0.4335937500, 0.9414062500, 0.6601562500 },
{ 0.9882812500, 0.6679687500, 0.7539062500, 0.1835937500, 0.9101562500, 0.5273437500, 0.1210937500, 0.6914062500, 0.7382812500, 0.7773437500, 0.2148437500, 0.0585937500, 0.9648437500, 0.9335937500, 0.4414062500, 0.1601562500 },
{ 0.7382812500, 0.4179687500, 0.0039062500, 0.9335937500, 0.6601562500, 0.7773437500, 0.8710937500, 0.9414062500, 0.9882812500, 0.5273437500, 0.4648437500, 0.3085937500, 0.2148437500, 0.1835937500, 0.1914062500, 0.9101562500 },
{ 0.2382812500, 0.9179687500, 0.5039062500, 0.4335937500, 0.1601562500, 0.2773437500, 0.3710937500, 0.4414062500, 0.4882812500, 0.0273437500, 0.9648437500, 0.8085937500, 0.7148437500, 0.6835937500, 0.6914062500, 0.4101562500 },
{ 0.1757812500, 0.1054687500, 0.0664062500, 0.2460937500, 0.5976562500, 0.4648437500, 0.5585937500, 0.1289062500, 0.1757812500, 0.7148437500, 0.9023437500, 0.9960937500, 0.9023437500, 0.2460937500, 0.2539062500, 0.7226562500 },
{ 0.6757812500, 0.6054687500, 0.5664062500, 0.7460937500, 0.0976562500, 0.9648437500, 0.0585937500, 0.6289062500, 0.6757812500, 0.2148437500, 0.4023437500, 0.4960937500, 0.4023437500, 0.7460937500, 0.7539062500, 0.2226562500 },
{ 0.9257812500, 0.3554687500, 0.3164062500, 0.4960937500, 0.3476562500, 0.7148437500, 0.8085937500, 0.8789062500, 0.9257812500, 0.4648437500, 0.1523437500, 0.2460937500, 0.6523437500, 0.4960937500, 0.5039062500, 0.9726562500 },
{ 0.4257812500, 0.8554687500, 0.8164062500, 0.9960937500, 0.8476562500, 0.2148437500, 0.3085937500, 0.3789062500, 0.4257812500, 0.9648437500, 0.6523437500, 0.7460937500, 0.1523437500, 0.9960937500, 0.0039062500, 0.4726562500 },
{ 0.3007812500, 0.4804687500, 0.6914062500, 0.8710937500, 0.9726562500, 0.3398437500, 0.9335937500, 0.7539062500, 0.8007812500, 0.0898437500, 0.0273437500, 0.6210937500, 0.5273437500, 0.6210937500, 0.1289062500, 0.3476562500 },
{ 0.8007812500, 0.9804687500, 0.1914062500, 0.3710937500, 0.4726562500, 0.8398437500, 0.4335937500, 0.2539062500, 0.3007812500, 0.5898437500, 0.5273437500, 0.1210937500, 0.0273437500, 0.1210937500, 0.6289062500, 0.8476562500 },
{ 0.5507812500, 0.2304687500, 0.9414062500, 0.6210937500, 0.2226562500, 0.5898437500, 0.6835937500, 0.0039062500, 0.0507812500, 0.8398437500, 0.7773437500, 0.3710937500, 0.7773437500, 0.8710937500, 0.8789062500, 0.0976562500 },
{ 0.0507812500, 0.7304687500, 0.4414062500, 0.1210937500, 0.7226562500, 0.0898437500, 0.1835937500, 0.5039062500, 0.5507812500, 0.3398437500, 0.2773437500, 0.8710937500, 0.2773437500, 0.3710937500, 0.3789062500, 0.5976562500 },
{ 0.0351562500, 0.4648437500, 0.1757812500, 0.4179687500, 0.3945312500, 0.1992187500, 0.7304687500, 0.6445312500, 0.3476562500, 0.7617187500, 0.1679687500, 0.4492187500, 0.7929687500, 0.6054687500, 0.2070312500, 0.3632812500 },
{ 0.5351562500, 0.9648437500, 0.6757812500, 0.9179687500, 0.8945312500, 0.6992187500, 0.2304687500, 0.1445312500, 0.8476562500, 0.2617187500, 0.6679687500, 0.9492187500, 0.2929687500, 0.1054687500, 0.7070312500, 0.8632812500 },
{ 0.7851562500, 0.2148437500, 0.4257812500, 0.1679687500, 0.6445312500, 0.9492187500, 0.9804687500, 0.3945312500, 0.5976562500, 0.0117187500, 0.9179687500, 0.6992187500, 0.5429687500, 0.8554687500, 0.9570312500, 0.1132812500 },
{ 0.2851562500, 0.7148437500, 0.9257812500, 0.6679687500, 0.1445312500, 0.4492187500, 0.4804687500, 0.8945312500, 0.0976562500, 0.5117187500, 0.4179687500, 0.1992187500, 0.0429687500, 0.3554687500, 0.4570312500, 0.6132812500 }
};
QRNG_VALIDATION_TEST_FUNCTIONS(sobol)
QRNG_VALIDATION_TEST_DISCARD(sobol)
BOOST_AUTO_TEST_CASE( check_generator_limits )
{
test_sobol_max_seed();
test_sobol_max_discard();
test_sobol_max_dimension(BOOST_RANDOM_SOBOL_MAX_DIMENSION);
}
BOOST_AUTO_TEST_CASE( validate_sobol )
{
test_sobol_values(sobol_02_99, 0);
test_sobol_values(sobol_07_100, 127);
test_sobol_values(sobol_16_100, 127);
}
BOOST_AUTO_TEST_CASE( validate_sobol_seed )
{
test_sobol_seed(sobol_02_99, 0);
test_sobol_seed(sobol_07_100, 127);
test_sobol_seed(sobol_16_100, 127);
}
BOOST_AUTO_TEST_CASE( validate_sobol_discard )
{
test_sobol_discard(sobol_02_99, 0);
test_sobol_discard(sobol_07_100, 127);
test_sobol_discard(sobol_16_100, 127);
}

View File

@@ -0,0 +1,278 @@
// Copyright Justinas Vygintas Daugmaudis, 2010-2018.
// Use, modification and distribution is subject to the
// Boost Software License, Version 1.0. (See accompanying
// file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
#ifndef TEST_QRNG_FUNCTIONS_HPP_INCLUDED
#define TEST_QRNG_FUNCTIONS_HPP_INCLUDED
#include <boost/random/uniform_real.hpp>
#include <boost/test/floating_point_comparison.hpp>
#include <sstream>
namespace test {
// Invokes operator() precisely n times. This is to check that
// Engine::discard(n) actually has the same effect.
template<typename Engine>
inline void trivial_discard(Engine& eng, boost::uintmax_t n)
{
for( ; n != 0; --n ) eng();
}
template<typename Engine, typename T, std::size_t Dimension>
inline void match_vector(Engine& eng, T (&pt)[Dimension])
{
BOOST_REQUIRE_EQUAL( eng.dimension(), Dimension ); // paranoid check
boost::uniform_real<T> dist;
for( std::size_t i = 0; i != eng.dimension(); ++i )
{
T val = dist(eng);
// We want to check that quasi-random number generator values differ no
// more than 0.0006% of their value.
BOOST_CHECK_CLOSE(pt[i], val, 0.0006);
}
}
template<typename Engine, typename T, std::size_t Dimension, std::size_t N>
inline void expected_values(T (&pt)[N][Dimension], std::size_t skip)
{
Engine eng(Dimension);
eng.seed(skip);
for( std::size_t i = 0; i != N; ++i )
match_vector(eng, pt[i]);
}
template<typename Engine, typename T>
inline void test_zero_seed(std::size_t dimension)
{
Engine eng(dimension);
Engine other(dimension);
other.seed(0);
// Check that states are equal after zero seed.
boost::uniform_real<T> dist;
BOOST_CHECK( eng == other );
for( std:: size_t i = 0; i != dimension; ++i )
{
T q_val = dist(eng);
T t_val = dist(other);
BOOST_CHECK_CLOSE(q_val, t_val, 0.0001);
}
}
template<typename Engine, typename T, std::size_t Dimension, std::size_t N>
inline void seed_function(T (&pt)[N][Dimension], std::size_t skip)
{
// Test zero seed before doing other tests.
test_zero_seed<Engine, T>(Dimension);
Engine eng(Dimension);
for( std::size_t i = 0; i != N; ++i )
{
// For all N seeds an engine
// and checks if the expected values match.
eng.seed(skip + i);
match_vector(eng, pt[i]);
}
}
template<typename Engine, typename T, std::size_t Dimension, std::size_t N>
inline void discard_function(T (&pt)[N][Dimension], std::size_t skip)
{
Engine eng(Dimension), trivial(Dimension), streamed(Dimension), initial_state(Dimension);
boost::uniform_real<T> dist;
const std::size_t element_count = N * Dimension;
const T* pt_array = reinterpret_cast<T *>(boost::addressof(pt));
std::stringstream ss;
initial_state.seed(skip);
for (std::size_t step = 0; step != element_count; ++step)
{
// Init to the same state
eng = initial_state;
trivial = initial_state;
// Discards have to have the same effect
eng.discard(step);
trivial_discard(trivial, step);
// test serialization to stream
ss.str(std::string()); // clear stream
ss << eng;
ss >> streamed;
// Therefore, states are equal
BOOST_CHECK( eng == trivial );
BOOST_CHECK( eng == streamed );
// Now, let's check whether they really produce the same sequence
T q_val = dist(eng);
T t_val = dist(trivial);
T s_val = dist(streamed);
BOOST_CHECK_CLOSE(q_val, t_val, 0.0001);
BOOST_CHECK_CLOSE(q_val, s_val, 0.0001);
// ~ BOOST_CHECK(q_val == t_val), but those are floating point values,
// so strict equality check may fail unnecessarily
// States remain equal!
BOOST_CHECK( eng == trivial );
BOOST_CHECK( eng == streamed );
// We want to check that quasi-random number generator values differ no
// more than 0.0006% of their value.
BOOST_CHECK_CLOSE(pt_array[step], q_val, 0.0006);
}
}
inline bool accept_all_exceptions(const std::exception& e)
{
BOOST_TEST_MESSAGE( e.what() );
return true;
}
template<typename Engine>
void test_max_seed(std::size_t dim)
{
typedef typename Engine::size_type size_type;
static const size_type maxseed = Engine::max();
Engine eng(dim);
eng.seed(maxseed-1); // must succeed
eng(); // skip one element
BOOST_REQUIRE_EXCEPTION( eng.seed(maxseed), std::range_error, accept_all_exceptions );
Engine other(dim);
other.seed(maxseed-1); // must succeed
other(); // skip one element, too
// States remain the same even after unsuccessful seeding for eng.
BOOST_CHECK( eng == other );
BOOST_CHECK( eng() == other() );
}
template<typename Generator>
void test_max_discard(std::size_t dim)
{
typedef typename Generator::type engine_type;
static const boost::uintmax_t maxdiscard = dim * engine_type::max();
// Max discard limit
{
engine_type eng(dim);
eng.discard(maxdiscard-1); // must succeed
eng(); // the very last element
BOOST_REQUIRE_EXCEPTION( eng(), std::range_error, accept_all_exceptions );
engine_type other(dim);
BOOST_CHECK( eng != other ); // test that comparison does not overflow
other(); // the very first element
other.discard(maxdiscard-1); // must succeed
BOOST_CHECK( eng == other );
BOOST_REQUIRE_EXCEPTION( other(), std::range_error, accept_all_exceptions );
}
// Overdiscarding
{
engine_type eng(dim);
eng.discard(maxdiscard); // must succeed, since it's maxdiscard operator() invocations
// must fail because after discarding the whole sequence
// we can't put the eng to any valid sequence producing state
BOOST_REQUIRE_EXCEPTION( eng(), std::range_error, accept_all_exceptions );
// Plain overdiscarding by 1
engine_type other(dim);
BOOST_REQUIRE_EXCEPTION( other.discard(maxdiscard+1), std::range_error, accept_all_exceptions );
}
// Test wraparound
{
engine_type eng(dim);
// must fail either because seq_count overflow check is triggered,
// or because this discard violates seeding bitcount constraint
BOOST_REQUIRE_EXCEPTION( eng.discard(maxdiscard*2), std::range_error, accept_all_exceptions );
}
}
} // namespace test
#define QRNG_VALIDATION_TEST_FUNCTIONS(QRNG) \
\
typedef boost::random::QRNG engine_t; \
\
template<typename T, std::size_t Dimension, std::size_t N> \
inline void test_##QRNG##_values(T (&pt)[N][Dimension], std::size_t skip) \
{ \
test::expected_values<engine_t>(pt, skip); \
} \
\
template<typename T, std::size_t Dimension, std::size_t N> \
inline void test_##QRNG##_seed(T (&pt)[N][Dimension], std::size_t skip) \
{ \
test::seed_function<engine_t>(pt, skip); \
} \
\
template<typename T, std::size_t Dimension, std::size_t N> \
inline void test_##QRNG##_discard(T (&pt)[N][Dimension], std::size_t skip) \
{ \
test::discard_function<engine_t>(pt, skip); \
} \
inline void test_##QRNG##_max_seed() \
{ \
test::test_max_seed<engine_t>(2); \
} \
inline void test_##QRNG##_max_dimension(std::size_t dim) \
{ \
engine_t eng(dim); /*must succeed*/ \
BOOST_REQUIRE_EXCEPTION( engine_t(dim+1), std::invalid_argument, test::accept_all_exceptions ); \
} \
\
BOOST_AUTO_TEST_CASE( test_##QRNG##_zero_dimension_fails ) \
{ \
BOOST_REQUIRE_EXCEPTION( engine_t(0), std::invalid_argument, test::accept_all_exceptions ); \
} \
/**/
#define QRNG_VALIDATION_TEST_DISCARD(QRNG) \
\
template <typename IntType, unsigned w> \
struct gen_engine \
{ \
typedef boost::random::QRNG##_engine<IntType, w> type; \
}; \
\
inline void test_##QRNG##_max_discard() \
{ \
static const std::size_t dim = 2;\
\
/* test full 8 bits */ \
test::test_max_discard<gen_engine<boost::uint8_t, 8u> >(dim); \
\
/* test 7 bits */ \
test::test_max_discard<gen_engine<boost::uint8_t, 7u> >(dim); \
\
/* test 6 bits for a good measure */ \
test::test_max_discard<gen_engine<boost::uint8_t, 6u> >(dim); \
} \
/**/
#endif // TEST_QRNG_FUNCTIONS_HPP_INCLUDED