57 0xed7faa90747aaad9, 0x4cec2c78af55c101, 0xe64dcb31c48228ec,
58 0x6d8a15a13bee7cb0, 0x20b2ca60cb78c509, 0x256c3d3c662ea36c,
59 0xff74e54107684ed2, 0x492edfcc0cc8e753, 0xb48c187cf5b22097,
97 int numBits = 64 - offset;
99 uint64_t bits =
fState[idx] >> offset;
100 if (numBits <
kBits) {
101 bits |=
fState[idx + 1] << numBits;
103 bits &= ((uint64_t(1) <<
kBits) - 1);
117 }
while (random == 0);
119 static constexpr double div = 1.0 / (uint64_t(1) <<
kBits);
124 for (
int i = 0; i < size; i++) {
134 for (
int i = 1; i < 9; i++) {
141 powermod(a_seed, a_seed, uint64_t(1) << 48);
157 assert(left >= 0 &&
"position was out of range!");
158 if (
n < (uint64_t)left) {
167 int skip = (
n / nPerState);
178 int remaining =
n -
skip * nPerState;
179 assert(remaining >= 0 &&
"should not end up at a negative position!");
185 std::ofstream os(filename);
191 std::ifstream is(filename);
198 <<
"--------------------- RanluxppEngine status --------------------"
200 std::cout <<
" fState[] = {";
201 std::cout << std::hex << std::setfill(
'0');
202 for (
int i = 0; i < 9; i++) {
204 std::cout << std::endl <<
" ";
208 std::cout <<
"0x" << std::setw(16) <<
fState[i] <<
",";
210 std::cout << std::endl <<
" }" << std::endl;
211 std::cout << std::dec;
215 <<
"----------------------------------------------------------------"
227 const std::vector<unsigned long> state =
put();
228 for (
unsigned long v : state) {
238 is.clear(std::ios::badbit | is.rdstate());
239 std::cerr <<
"No RanluxppEngine found at current position\n";
246 std::vector<unsigned long> state;
259 std::vector<unsigned long> v;
261 v.push_back(engineIDulong<RanluxppEngine>());
265 for (
int i = 0; i < 9; i++) {
266 unsigned long lower =
static_cast<uint32_t
>(
fState[i]);
268 unsigned long upper =
static_cast<uint32_t
>(
fState[i] >> 32);
278 if (v[0] != engineIDulong<RanluxppEngine>()) {
279 std::cerr <<
"RanluxppEngine::get(): "
280 <<
"vector has wrong ID word - state unchanged" << std::endl;
288 std::cerr <<
"RanluxppEngine::getState(): "
289 <<
"vector has wrong length - state unchanged" << std::endl;
294 for (
int i = 0; i < 9; i++) {
295 uint64_t lower = v[2 * i + 1];
296 uint64_t upper = v[2 * i + 2];
297 fState[i] = (upper << 32) + lower;
#define CLHEP_ATOMIC_INT_TYPE
void showStatus() const override
unsigned fCarry
Carry bit of the RANLUX state.
virtual ~RanluxppEngine()
void saveStatus(const char filename[]="Ranluxpp.conf") const override
std::string name() const override
uint64_t fState[9]
RANLUX state of the generator.
int fPosition
Current position in bits.
uint64_t nextRandomBits()
std::istream & get(std::istream &is) override
static std::string engineName()
std::vector< unsigned long > put() const override
void setSeeds(const long *seeds, int dummy=0) override
void restoreStatus(const char filename[]="Ranluxpp.conf") override
static const unsigned int VECTOR_STATE_SIZE
void flatArray(const int size, double *vect) override
void setSeed(long seed, int dummy=0) override
std::istream & getState(std::istream &is) override
static std::string beginTag()
static void mulmod(const uint64_t *in1, uint64_t *inout)
static void powermod(const uint64_t *base, uint64_t *res, uint64_t n)
CLHEP_ATOMIC_INT_TYPE numberOfEngines(0)
static constexpr int kMaxPos
static constexpr int kBits
static void to_lcg(const uint64_t *ranlux, unsigned c, uint64_t *lcg)
static void to_ranlux(const uint64_t *lcg, uint64_t *ranlux, unsigned &c_out)