A Discrete-Event Network Simulator Home Tutorials  ▼ Docs    ▼ Develop ▼ API
MRG32k3a Namespace Reference

Namespace for MRG32k3a implementation details. More...

## Classes

struct  Precalculated
The transition matrices of the two MRG components (in matrix form), raised to all powers of 2 from 1 to 191. More...

## Typedefs

typedef double Matrix[3][3]
Type for 3x3 matrix of doubles. More...

## Functions

void MatMatModM (const Matrix A, const Matrix B, Matrix C, double m)
Compute the matrix C = A*B MOD m. More...

void MatPowModM (const double A[3][3], double B[3][3], double m, int32_t n)
Compute the matrix B = (A^n Mod m); works even if A = B. More...

void MatTwoPowModM (const Matrix src, Matrix dst, double m, int32_t e)
Compute the matrix B = (A^(2^e) Mod m); works also if A = B. More...

void MatVecModM (const Matrix A, const double s[3], double v[3], double m)
Compute the vector v = A*s MOD m. More...

double MultModM (double a, double s, double c, double m)
Return (a*s + c) MOD m; a, s, c and m must be < 2^35. More...

struct Precalculated PowerOfTwoConstants (void)
Compute the transition matrices of the two MRG components raised to all powers of 2 from 1 to 191. More...

void PowerOfTwoMatrix (int n, Matrix a1p, Matrix a2p)
Get the transition matrices raised to a power of 2. More...

## Variables

const double a12 = 1403580.0
First component multiplier of n - 2 value. More...

const double a13n = 810728.0
First component multiplier of n - 3 value. More...

const Matrix A1p0
First component transition matrix. More...

const double a21 = 527612.0
Second component multiplier of n - 1 value. More...

const double a23n = 1370589.0
Second component multiplier of n - 3 value. More...

const Matrix A2p0
Second component transition matrix. More...

const double m1 = 4294967087.0
First component modulus, 232 - 209. More...

const double m2 = 4294944443.0
Second component modulus, 232 - 22853. More...

const double norm = 1.0 / (m1 + 1.0)
Normalization to obtain randoms on [0,1). More...

const double two17 = 131072.0
Decomposition factor for computing a*s in less than 53 bits, 217 More...

const double two53 = 9007199254740992.0
IEEE-754 floating point precision, 253 More...

## Detailed Description

Namespace for MRG32k3a implementation details.

## Typedef Documentation

 typedef double MRG32k3a::Matrix[3][3]

Type for 3x3 matrix of doubles.

Definition at line 54 of file rng-stream.cc.

## Function Documentation

 void MRG32k3a::MatMatModM ( const Matrix A, const Matrix B, Matrix C, double m )

Compute the matrix C = A*B MOD m.

Assume that -m < s[i] < m. Note: works also if A = C or B = C or A = B = C.

Parameters
 [in] A First matrix argument. [in] B Second matrix argument. [out] C Result matrix. [in] m Modulus.

Definition at line 180 of file rng-stream.cc.

References MatVecModM().

Referenced by MatPowModM(), and MatTwoPowModM().

Here is the call graph for this function:

Here is the caller graph for this function:

 void MRG32k3a::MatPowModM ( const double A[3][3], double B[3][3], double m, int32_t n )

Compute the matrix B = (A^n Mod m); works even if A = B.

Parameters
 [in] A Matrix input argument. [out] B Matrix output. [in] m Modulus. [in] n Exponent.

Definition at line 247 of file rng-stream.cc.

References MatMatModM().

Here is the call graph for this function:

 void MRG32k3a::MatTwoPowModM ( const Matrix src, Matrix dst, double m, int32_t e )

Compute the matrix B = (A^(2^e) Mod m); works also if A = B.

Parameters
 [in] src Matrix input argument `A`. [out] dst Matrix output `B`. [in] m Modulus. [in] e The exponent.

Definition at line 218 of file rng-stream.cc.

References MatMatModM().

Referenced by PowerOfTwoConstants().

Here is the call graph for this function:

Here is the caller graph for this function:

 void MRG32k3a::MatVecModM ( const Matrix A, const double s[3], double v[3], double m )

Compute the vector v = A*s MOD m.

Assume that -m < s[i] < m. Works also when v = s.

Parameters
 [in] A Matrix argument, 3x3. [in] s Three component input vector. [out] v Three component output vector. [in] m Modulus.

Definition at line 151 of file rng-stream.cc.

References MultModM(), and sample-rng-plot::x.

Here is the call graph for this function:

Here is the caller graph for this function:

 double MRG32k3a::MultModM ( double a, double s, double c, double m )

Return (a*s + c) MOD m; a, s, c and m must be < 2^35.

This computes the result exactly, without exceeding the 53 bit precision of doubles.

Parameters
 [in] a First multiplicative argument. [in] s Second multiplicative argument. [in] c Additive argument. [in] m Modulus.
Returns
`(a*s +c) MOD m`

Definition at line 111 of file rng-stream.cc.

References two17.

Referenced by MatVecModM().

Here is the caller graph for this function:

 struct Precalculated MRG32k3a::PowerOfTwoConstants ( void )

Compute the transition matrices of the two MRG components raised to all powers of 2 from 1 to 191.

Returns
The precalculated powers of the transition matrices.

Definition at line 294 of file rng-stream.cc.

Referenced by PowerOfTwoMatrix().

Here is the call graph for this function:

Here is the caller graph for this function:

 void MRG32k3a::PowerOfTwoMatrix ( int n, Matrix a1p, Matrix a2p )

Get the transition matrices raised to a power of 2.

Parameters
 [in] n The power of 2. [out] a1p The first transition matrix power. [out] a2p The second transition matrix power.

Definition at line 312 of file rng-stream.cc.

Here is the call graph for this function:

Here is the caller graph for this function:

## Variable Documentation

 const double MRG32k3a::a12 = 1403580.0

First component multiplier of n - 2 value.

Definition at line 66 of file rng-stream.cc.

Referenced by ns3::RngStream::RandU01().

 const double MRG32k3a::a13n = 810728.0

First component multiplier of n - 3 value.

Definition at line 69 of file rng-stream.cc.

Referenced by ns3::RngStream::RandU01().

 const Matrix MRG32k3a::A1p0
Initial value:
= {
{ 0.0, 1.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{ -810728.0, 1403580.0, 0.0 }
}

First component transition matrix.

Definition at line 84 of file rng-stream.cc.

 const double MRG32k3a::a21 = 527612.0

Second component multiplier of n - 1 value.

Definition at line 72 of file rng-stream.cc.

Referenced by ns3::RngStream::RandU01().

 const double MRG32k3a::a23n = 1370589.0

Second component multiplier of n - 3 value.

Definition at line 75 of file rng-stream.cc.

Referenced by ns3::RngStream::RandU01().

 const Matrix MRG32k3a::A2p0
Initial value:
= {
{ 0.0, 1.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{ -1370589.0, 0.0, 527612.0 }
}

Second component transition matrix.

Definition at line 91 of file rng-stream.cc.

 const double MRG32k3a::m1 = 4294967087.0
 const double MRG32k3a::m2 = 4294944443.0
 const double MRG32k3a::norm = 1.0 / (m1 + 1.0)

Normalization to obtain randoms on [0,1).

Definition at line 63 of file rng-stream.cc.

Referenced by ns3::RngStream::RandU01().

 const double MRG32k3a::two17 = 131072.0

Decomposition factor for computing a*s in less than 53 bits, 217

Definition at line 78 of file rng-stream.cc.

Referenced by MultModM().

 const double MRG32k3a::two53 = 9007199254740992.0

IEEE-754 floating point precision, 253

Definition at line 81 of file rng-stream.cc.