20#include "arcane/std/PDESRandomNumberGeneratorService.h"
35 m_seed =
options()->getInitialSeed();
69 return m_size_of_seed;
78 _ran4(&m_seed, leap - 1);
90 if(parent_seed.
size() != m_size_of_seed) {
97 _ran4(i_seed, leap - 1);
108 return _ran4(&m_seed, leap);
115 if(seed.
size() != m_size_of_seed) {
134_breakupUInt64(uint64_t uint64_in, uint32_t* front_bits, uint32_t* back_bits)
136 *front_bits =
static_cast<uint32_t
>(uint64_in >> 32);
137 *back_bits =
static_cast<uint32_t
>(uint64_in & 0xffffffff);
150 uint64_t reconstructed, temp;
151 reconstructed =
static_cast<uint64_t
>(front_bits);
152 temp =
static_cast<uint64_t
>(back_bits);
155 reconstructed = reconstructed << 32;
159 reconstructed |= (temp & 0x00000000ffffffff);
161 return reconstructed;
176_psdes(uint32_t* lword, uint32_t* irword)
179 const uint32_t c1[] = { 0xbaa96887L, 0x1e17d32cL, 0x03bcdc3cL, 0x0f33d1b2L };
180 const uint32_t c2[] = { 0x4b0f3b58L, 0xe874f0c3L, 0x6955c5a6L, 0x55a7ca46L };
182 for (
Integer i = 0; i < NITER; i++) {
183 uint32_t iswap = (*irword);
184 uint32_t ia = iswap ^ c1[i];
185 uint32_t itmpl = ia & 0xffff;
186 uint32_t itmph = ia >> 16;
187 uint32_t ib = itmpl * itmpl + ~(itmph * itmph);
189 *irword = (*lword) ^ (((ia = (ib >> 16) | ((ib & 0xffff) << 16)) ^ c2[i]) + itmpl * itmph);
204 uint32_t front_bits, back_bits;
207 _psdes(&front_bits, &back_bits);
230 uint32_t front_bits, back_bits, irword, lword;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
CaseOptionsPDESRandomNumberGenerator * options() const
Options du jeu de données du service.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
ByteConstArrayView viewSeed() override
Méthode permettant de récupérer une vue constante sur la graine actuelle.
ByteUniqueArray generateRandomSeed(Integer leap=0) override
Méthode permettant de générer une graine "enfant" à partir d'une graine "parent".
uint64_t _hashState(uint64_t initial_number)
Méthode permettant de générer une nouvelle graine avec l'algorithme pseudo-DES.
Real generateRandomNumber(Integer leap) override
Méthode permettant de générer un nombre aléatoire avec la graine en mémoire.
Integer neededSizeOfSeed() override
Méthode permettant de connaitre la taille de seed nécessaire pour l'implémentation.
bool initSeed() override
Méthode permettant d'initialiser le service.
void _psdes(uint32_t *lword, uint32_t *irword)
Algorithme Pseudo-DES du livre : Numerical Recipes in C The Art of Scientific Computing Second Editio...
uint64_t _reconstructUInt64(uint32_t front_bits, uint32_t back_bits)
Méthode permettant de regrouper deux uint32 en un uint64.
ByteUniqueArray emptySeed() override
Méthode permettant de récupérer une graine vide de bonne taille.
void _breakupUInt64(uint64_t uint64_in, uint32_t *front_bits, uint32_t *back_bits)
Méthode permettant de découper un uint64 en deux uint32.
Real _ran4(Int64 *seed, Integer leap)
Méthode permettant de générer des nombres pseudo-aléatoire à partir d'une graine.
Classe permettant de manipuler facilement une graine.
bool value(T &value_out, bool without_size_check=true) const
Méthode permettant de récupérer la valeur de la graine.
Integer sizeOfSeed() const
Méthode permettant de récupérer la taille de la graine.
ByteConstArrayView constView() const
Méthode permettant de récupérer une vue constante.
ByteUniqueArray copy()
Méthode permettant de récupérer une copie du tableau de Byte.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
double Real
Type représentant un réel.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.