ars5

The ars5 counter-based pseudorandom number generator.

Description

The ars5 engine is a keyed family of counter-based BRNG. The state consists of a 128-bit integer counter \(c\) and a 128-bit key \(k\). The BRNG is based on the AES encryption algorithm [FIPS-197].

Generation algorithm

The generator has a 32-bit integer output obtained in the following way [Salmon11]:

  1. The i-th number is defined by the following formula \(r_i=(f(i/ 4) >> ((i \ mod \ 4) * 32)) \ mod \ 2 ^ {32}\)

  2. Function \(f(c)\) takes a 128-bit argument and returns a 128-bit number. The returned number is obtained as follows:

    2.1. \(c_0 = c \oplus k\) and \(k_0 = k\).

    2.2. The following recurrence is calculated N = 5 times:

    \(c_{i+1} = SubBytes(c)\)

    \(c_{i+1} = ShiftRows(c_{i+1})\)

    \(c_{i+1} = MixColumns(c_{i+1})\), this step is omitted if \(i+1 = N\)

    \(c_{i+1} = AddRoundKey(c_{i+1}, k_j)\)

    \(Lo(k_{i+1}) = Lo(k) + 0x9E3779B97F4A7C15\)

    \(Hi(k_{i+1}) = Hi(k) + 0xBB67AE8584CAA73B\)

    Specification for \(SubBytes, ShiftRows, MixColumns, AddRoundKey\) functions can be found in [FIPS-197].

    2.3. Put \(f(c) = c_N\), where \(N = 10\)

  3. Real output: \(u_n=(int)r_n / 2^{32} + 1/2\)

class ars5

Syntax

namespace oneapi::mkl::rng {
class ars5 {
public:
        static constexpr std::uint64_t default_seed = 0;

        ars5(sycl::queue queue, std::uint64_t seed = default_seed);

        ars5(sycl::queue queue, std::initializer_list<std::uint64_t> seed);

        ars5(const ars5& other);

        ars5(ars5&& other);

        ars5& operator=(const ars5& other);

        ars5& operator=(ars5&& other);

        ~ars5();
};
}

Class Members

Routine

Description

ars5(sycl::queue queue, std::uint64_t seed)

Constructor for common seed initialization of the engine

ars5(sycl::queue queue, std::initializer_list<std::uint64_t> seed)

Constructor for extended seed initialization of the engine

ars5(const ars5& other)

Copy constructor

ars5(ars5&& other)

Move constructor

ars5& operator=(const ars5& other)

Copy assignment operator

ars5& operator=(ars5&& other)

Move assignment operator

Constructors

ars5::ars5(sycl::queue queue, std::uint64_t seed)

Input Parameters

queue

Valid sycl::queue object, calls of the oneapi::mkl::rng::generate() routine submits kernels in this queue to obtain random numbers from a given engine.

seed

The initial conditions of the generator state, assume \(k = seed, c = 0\), where \(k\) is 128-bit key, \(c\) is 128-bit counter.

ars5::ars5(sycl::queue queue, std::initializer_list<std::uint64_t> seed)

Input Parameters

queue

Valid sycl::queue object, calls of the oneapi::mkl::rng::generate() routine submits kernels in this queue to obtain random numbers from a given engine.

seed

The initial conditions of the generator state, assume if \(n = 0: k = 0, c = 0\)

if \(n = 1: k = seed[0], c = 0\)

if \(n = 2: k = seed[0] + seed[1] \cdot 2^{64}, c = 0\)

if \(n = 3: k = seed[0] + seed[1] \cdot 2^{64}, c = seed[2]\)

if \(n = 4: k = seed[0] + seed[1] \cdot 2^{64}, c = seed[2] + seed[3] \cdot 2^{64}\)

for \(n > 4\) following arguments are ignored

ars5::ars5(const ars5& other)

Input Parameters

other

Valid ars5 object. The queue and state of the other engine is copied and applied to the current engine.

ars5::ars5(ars5&& other)

Input Parameters

other

Valid ars5 r-value object. The queue and state of the other engine is moved to the current engine.

ars5::ars5& operator=(const ars5& other)

Input Parameters

other

Valid ars5 object. The queue and state of the other engine is copied and applied to the current engine.

ars5::ars5& operator=(ars5&& other)

Input Parameters

other

Valid ars5 r-value object. The queue and state of the other engine is moved to the current engine.

Parent topic: Engines (Basic Random Number Generators)