static unif01_Gen *CreateDenga (unsigned long m, unsigned long b, int k, unsigned long S[], int id) { unif01_Gen *gen; DX02_state *state; DX02_param *param; size_t leng; char name[LEN + 1]; int j; gen = util_Malloc (sizeof (unif01_Gen)); state = util_Malloc (sizeof (DX02_state)); param = util_Malloc (sizeof (DX02_param)); if (0 == id) { util_Assert (k < 129, "udeng_CreateDL00a: k > 128"); } else { util_Assert (k < 129, "udeng_CreateDX02a: k > 128"); } state->X = util_Calloc (MASK1 + 1, sizeof (double)); for (j = 0; j < k; j++) state->X[k - j - 1] = S[j] % m; state->s = k - 1; state->K = k; param->b = b; param->m = m; if (0 == id) strcpy (name, "udeng_CreateDL00a:"); else #ifdef LAC strcpy (name, "udeng_CreateDX02a, Lac = {0, 101, 102}:"); #else strcpy (name, "udeng_CreateDX02a:"); #endif addstr_Ulong (name, " m = ", m); addstr_Ulong (name, ", b = ", b); addstr_Uint (name, ", k = ", (unsigned) k); addstr_ArrayUlong (name, ", S = ", k, S); leng = strlen (name); gen->name = util_Calloc (leng + 1, sizeof (char)); strncpy (gen->name, name, leng); gen->param = param; gen->state = state; if (0 == id) { gen->GetBits = &DL00a_Bits; gen->GetU01 = &DL00a_U01; } else { gen->GetBits = &DX02a_Bits; gen->GetU01 = &DX02a_U01; } gen->Write = &WrDX02a; return gen; }
void addstr_ArrayUlong (char *to, const char *add, int high, unsigned long val[]) { int j; strcat (to, add); addstr_Ulong (to, "(", val[0]); for (j = 1; (j < high) && (j < 5); j++) addstr_Ulong (to, ", ", val[j]); if (high > 5) strcat (to, ", ... )"); else strcat (to, ")"); }
unif01_Gen * uautomata_CreateCA1 (int N, int S[ ], int r, int F[ ], int k, int ts, int cs, int rot) { unif01_Gen *gen; CA1_param *param; CA1_state *state; size_t leng; char name[LEN + 1]; long i; unsigned long Z = 0; long L; /* Dimension of the rule F */ i = 4*sizeof(long) - 1; util_Assert ((long) r < i, "uautomata_CreateCA1: r too large"); util_Assert (ts >= 0, "uautomata_CreateCA1: ts < 0"); util_Assert (cs >= 0, "uautomata_CreateCA1: cs < 0"); util_Assert (k > 0, "uautomata_CreateCA1: k < 1"); gen = util_Malloc (sizeof (unif01_Gen)); param = util_Malloc (sizeof (CA1_param)); state = util_Malloc (sizeof (CA1_state)); strncpy (name, "uautomata_CreateCA1:", (size_t) LEN); addstr_Long (name, " N = ", (long) N); addstr_Long (name, ", r = ", (long) r); L = num_TwoExp[2*r + 1]; addstr_ArrayInt (name, ", F = ", (int) L, F); for (i = L-1; i >= 0; i--) { Z <<= 1; Z += F[i]; } addstr_Ulong(name, " = Rule ", Z); addstr_Long (name, ", k = ", (long) k); addstr_Long (name, ", ts = ", (long) ts); addstr_Long (name, ", cs = ", (long) cs); addstr_Long (name, ", rot = ", (long) rot); addstr_ArrayInt (name, ", S = ", N, S); leng = strlen (name); gen->name = util_Calloc (leng + 1, sizeof (char)); strncpy (gen->name, name, (size_t) leng); param->r = r; param->tstep = ts + 1; param->cstep = cs + 1; param->rot = rot; param->k = k; param->F = F; param->L = L; state->Cell = util_Calloc ((size_t) N, sizeof (int)); state->OldCell = util_Calloc ((size_t) N, sizeof (int)); state->Rand = util_Calloc ((size_t) k, sizeof (unsigned long)); state->N = N; state->nk = 0; param->imin = N/2 - k/2 * param->cstep; param->imax = N/2 + (k - 1)/2 * param->cstep; util_Assert (param->imin >= 0, "uautomata_CreateCA1: k*cs too large"); util_Assert (param->imax < N, "uautomata_CreateCA1: k*cs too large"); for (i = 0; i < N; i++) { /* util_Assert (S[i] == 0 || S[i] == 1, "uautomata_CreateCA1: all S[i] must be in { 0, 1 }."); */ state->Cell[i] = S[i] & 1; } gen->GetBits = &CA1_Bits; gen->GetU01 = &CA1_U01; gen->Write = &WrCA1; gen->param = param; gen->state = state; return gen; }