29 #ifndef ROOT_MIXMAX_H_
30 #define ROOT_MIXMAX_H_ 1
55 typedef unsigned long long int myuint;
112 myuint
apply_bigskip(myuint* Vout, myuint* Vin, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID );
121 #define M61 2305843009213693951ULL
127 #define MERSBASE M61 //xSUFF(M61)
128 #define MOD_PAYNE(k) ((((k)) & MERSBASE) + (((k)) >> BITS) ) // slightly faster than my old way, ok for addition
129 #define MOD_REM(k) ((k) % MERSBASE ) // latest Intel CPU is supposed to do this in one CPU cycle, but on my machines it seems to be 20% slower than the best tricks
130 #define MOD_MERSENNE(k) MOD_PAYNE(k)
132 #define INV_MERSBASE (0x1p-61)
139 #define SPECIAL 487013230256099064ULL // s=487013230256099064, m=1 -- good old MIXMAX
140 #define MOD_MULSPEC(k) fmodmulM61( 0, SPECIAL , (k) );
143 #define SPECIALMUL 36 // m=2^37+1
146 #define SPECIALMUL 53 // m=2^53+1
149 #define SPECIALMUL 42 // m=2^42+1
152 #define SPECIALMUL 55 // m=2^55+1
155 #define SPECIALMUL 55 // m=2^55 (!!!) and m=2^37+2
158 #define SPECIALMUL 51 // m=2^51+1 and a SPECIAL=+1 (!!!)
160 #define MOD_MULSPEC(k) (k);
163 #warning Not a verified N, you are on your own!
164 #define SPECIALMUL 58
166 #endif // list of interesting N for modulus M61 ends here
169 #ifndef __MIXMAX_C // c++ can put code into header files, why cant we? (with the inline declaration, should be safe from duplicate-symbol error)
171 #define get_next(X) GET_BY_MACRO(X)
187 #define get_next_float(X) get_next_float_BY_MACRO(X)
192 #if defined(__SSE__) && defined(USE_INLINE_ASM)
195 __asm__ (
"pxor %0, %0;"
210 #define ARRAY_INDEX_OUT_OF_BOUNDS 0xFF01
211 #define SEED_WAS_ZERO 0xFF02
212 #define ERROR_READING_STATE_FILE 0xFF03
213 #define ERROR_READING_STATE_COUNTER 0xFF04
214 #define ERROR_READING_STATE_CHECKSUM 0xFF05
222 #ifdef HOOKUP_GSL // if you need to use mixmax through GSL, pass -DHOOKUP_GSL=1 to the compiler
224 #include <gsl/gsl_rng.h>
225 unsigned long gsl_get_next(
void *vstate);
226 double gsl_get_next_float(
void *vstate);
227 void seed_for_gsl(
void *vstate,
unsigned long seed);
229 static const gsl_rng_type mixmax_type =
239 unsigned long gsl_get_next(
void *vstate) {
244 double gsl_get_next_float(
void *vstate) {
249 void seed_for_gsl(
void *vstate,
unsigned long seed){
254 const gsl_rng_type *gsl_rng_ran3 = &mixmax_type;
260 #endif // closing ROOT_MIXMAX_H_
int rng_free(rng_state_t *X)
myuint apply_bigskip(myuint *Vout, myuint *Vin, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID)
int iterate(rng_state_t *X)
myuint modmulM61(myuint s, myuint a)
myuint precalc(rng_state_t *X)
static const char * filename()
void fill_array(rng_state_t *X, unsigned int n, double *array)
void iterate_and_fill_array(rng_state_t *X, double *array)
myuint iterate_raw_vec(myuint *Y, myuint sumtotOld)
void seed_uniquestream(rng_state_t *X, myID_t clusterID, myID_t machineID, myID_t runID, myID_t streamID)
rng_state_t * rng_alloc()
#define get_next_float(X)
myuint fmodmulM61(myuint cum, myuint s, myuint a)
void seed_vielbein(rng_state_t *X, unsigned int i)
void read_state(rng_state_t *X, const char filename[])
myuint modadd(myuint foo, myuint bar)
void seed_spbox(rng_state_t *X, myuint seed)
myuint GET_BY_MACRO(rng_state_t *X)
void print_state(rng_state_t *X)
struct rng_state_st rng_state_t
rng_state_t * rng_copy(myuint *Y)
void branch_inplace(rng_state_t *Xin, myID_t *ID)
std::complex< float_v > Z
double get_next_float_BY_MACRO(rng_state_t *X)