54#if (__cplusplus >= 201703L && __cpp_aligned_new >= 201606L)
60 static const int N = 17;
76 if (counter >= N) iterate();
77 return INV_M61*
static_cast<double>(V[counter++]);
86 inline void setSeed(
long longSeed,
int = 0 )
88 seed_spbox(theSeed = longSeed);
92 void setSeeds(
const long * seeds,
int seedNum=0);
98 void saveStatus(
const char filename[] =
"MixMaxRngState.conf" )
const;
108 inline operator double() {
return flat(); }
111 inline operator float() {
return float( flat() ); }
114 inline operator unsigned int() {
return static_cast<unsigned int>(get_next()); }
118 virtual std::ostream &
put (std::ostream & os)
const;
119 virtual std::istream &
get (std::istream & is);
121 virtual std::istream &
getState ( std::istream & is );
123 std::string
name()
const {
return "MixMaxRng"; }
126 std::vector<unsigned long>
put ()
const;
127 bool get (
const std::vector<unsigned long> & vec);
128 bool getState (
const std::vector<unsigned long> & vec);
132 static constexpr long long int SPECIAL = 0;
133 static constexpr long long int SPECIALMUL= 36;
134 static constexpr int BITS=61;
135 static constexpr myuint_t M61=2305843009213693951ULL;
136 static constexpr double INV_M61=0.43368086899420177360298E-18;
137 static constexpr unsigned int VECTOR_STATE_SIZE = 2*N+4;
141 return ((((k)) & M61) + (((k)) >> BITS) );
144 static constexpr int rng_get_N();
147 void print_state()
const;
152 void BranchInplace(
int id);
155 inline void seed64(
myuint_t seedval)
157 seed_uniquestream( 0, 0, (
myID_t)(seedval>>32), (
myID_t)seedval );
160 inline void iterate()
163 V[0] = ( tempV = sumtot );
164 myuint_t insumtot = V[0], ovflow = 0;
167 tempPO = MULWU(tempP); tempP = modadd(tempP, V[1] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[1] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
168 tempPO = MULWU(tempP); tempP = modadd(tempP, V[2] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[2] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
169 tempPO = MULWU(tempP); tempP = modadd(tempP, V[3] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[3] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
170 tempPO = MULWU(tempP); tempP = modadd(tempP, V[4] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[4] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
171 tempPO = MULWU(tempP); tempP = modadd(tempP, V[5] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[5] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
172 tempPO = MULWU(tempP); tempP = modadd(tempP, V[6] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[6] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
173 tempPO = MULWU(tempP); tempP = modadd(tempP, V[7] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[7] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
174 tempPO = MULWU(tempP); tempP = modadd(tempP, V[8] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[8] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
175 tempPO = MULWU(tempP); tempP = modadd(tempP, V[9] ); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[9] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
176 tempPO = MULWU(tempP); tempP = modadd(tempP, V[10]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[10] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
177 tempPO = MULWU(tempP); tempP = modadd(tempP, V[11]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[11] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
178 tempPO = MULWU(tempP); tempP = modadd(tempP, V[12]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[12] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
179 tempPO = MULWU(tempP); tempP = modadd(tempP, V[13]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[13] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
180 tempPO = MULWU(tempP); tempP = modadd(tempP, V[14]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[14] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
181 tempPO = MULWU(tempP); tempP = modadd(tempP, V[15]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[15] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
182 tempPO = MULWU(tempP); tempP = modadd(tempP, V[16]); tempV = MIXMAX_MOD_MERSENNE(tempV+tempP+tempPO); V[16] = tempV; insumtot += tempV;
if (insumtot < tempV) {++ovflow;}
183 sumtot = MIXMAX_MOD_MERSENNE(MIXMAX_MOD_MERSENNE(insumtot) + (ovflow <<3 ));
191 return (( (k)<<(SPECIALMUL) & M61) ^ ( (k) >> (BITS-SPECIALMUL)) );
197 return MIXMAX_MOD_MERSENNE(xfoo+xbar);
200#if defined(__x86_64__)