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:
@@ -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\" \\
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]]
|
||||
|
||||
@@ -26,3 +26,10 @@
|
||||
[password]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Generating quasi-random line-sphere intersections]
|
||||
|
||||
[import ../example/intersections.cpp]
|
||||
[intersections]
|
||||
|
||||
[endsect]
|
||||
|
||||
@@ -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
78
example/intersections.cpp
Normal 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;
|
||||
}
|
||||
|
||||
//]
|
||||
166
include/boost/random/detail/gray_coded_qrng.hpp
Normal file
166
include/boost/random/detail/gray_coded_qrng.hpp
Normal 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
|
||||
513
include/boost/random/detail/niederreiter_base2_table.hpp
Normal file
513
include/boost/random/detail/niederreiter_base2_table.hpp
Normal 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
|
||||
291
include/boost/random/detail/qrng_base.hpp
Normal file
291
include/boost/random/detail/qrng_base.hpp
Normal 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
|
||||
4106
include/boost/random/detail/sobol_table.hpp
Normal file
4106
include/boost/random/detail/sobol_table.hpp
Normal file
File diff suppressed because it is too large
Load Diff
367
include/boost/random/faure.hpp
Normal file
367
include/boost/random/faure.hpp
Normal 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
|
||||
360
include/boost/random/niederreiter_base2.hpp
Normal file
360
include/boost/random/niederreiter_base2.hpp
Normal 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
|
||||
237
include/boost/random/sobol.hpp
Normal file
237
include/boost/random/sobol.hpp
Normal 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
|
||||
@@ -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
375
test/faure_validate.cpp
Normal 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);
|
||||
}
|
||||
379
test/niederreiter_base2_validate.cpp
Normal file
379
test/niederreiter_base2_validate.cpp
Normal 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
380
test/sobol_validate.cpp
Normal 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);
|
||||
}
|
||||
278
test/test_qrng_functions.hpp
Normal file
278
test/test_qrng_functions.hpp
Normal 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
|
||||
Reference in New Issue
Block a user