47 private static final long serialVersionUID = 120307L;
50 private static final double NORM = (1.0 / 0x100000001L);
52 private static final int W = 32;
53 private static final int R = 16;
54 private static final int P = 0;
55 private static final int M1 = 13;
56 private static final int M2 = 9;
57 private static final int M3 = 5;
58 private static final int MASK = 0xF;
66 private int[] substream;
67 private static int[] curr_stream =
new int[] { 0xA341BF9A, 0xAFE4901B, 0x6B10DE18, 0x05FE1420, 0xE48B1A9C,
68 0x590AE15E, 0xC5EB82A7, 0x37EAB2F9, 0x90E1C6EA, 0x3AE63902, 0x735DC91C, 0x902E3A8C, 0x6CB28A5D, 0x8474E7D1,
69 0x843E01A3, 0x5A7370EF };
79 private static final int[] pw =
new int[] { 0x280009a9, 0x31e221d0, 0xa00c0296, 0x763d492b, 0x63875b75, 0xef2acc3a,
80 0x1400839f, 0x5e0c8526, 0x514e11b, 0x56b398e4, 0x9436c8b9, 0xa6d8130b, 0xc0a48a78, 0x26ad57d0, 0xa3a0c62a,
86 private static final int[] pz =
new int[] { 0xcd68f2fe, 0x183e969a, 0x760449ae, 0xaa0ce54e, 0xfb5363af, 0x79deea9b,
87 0xef66c516, 0x103543cb, 0x244d1a97, 0x7570bc91, 0x31203fc7, 0x455ea2ca, 0xd77d327d, 0xd8c6a83c, 0xc51b05e7,
90 private void advanceSeed(
int[] seed,
int[] p) {
94 for (
int i = 0; i < R; i++) {
99 for (
int j = 0; j < R; ++j) {
101 for (
int k = 0; k < W; ++k) {
103 for (
int i = 0; i < R; i++) {
104 x[i] ^= state[(state_i + i) & MASK];
113 for (
int i = 0; i < R; i++) {
118 private static void verifySeed(
int[] seed) {
120 throw new IllegalArgumentException(
"Seed must contain " + R +
"values");
121 for (
int i = 0; i < R; i++)
124 throw new IllegalArgumentException(
"At least one of the element of the seed must not be 0.");
130 for (
int j = 0; j < R; j++)
132 state[i / W] = 1 << (i % W);
142 substream =
new int[R];
144 for (
int i = 0; i < R; i++)
145 stream[i] = curr_stream[i];
147 advanceSeed(curr_stream, pz);
171 for (
int i = 0; i < R; i++)
172 curr_stream[i] = seed[i];
189 for (
int i = 0; i < R; i++)
201 int[] result =
new int[R];
202 for (
int i = 0; i < R; i++)
203 result[i] = state[(state_i + i) & MASK];
213 WELL512 retour =
null;
215 retour = (WELL512) super.
clone();
216 retour.state =
new int[R];
217 retour.substream =
new int[R];
218 retour.stream =
new int[R];
220 for (
int i = 0; i < R; i++) {
221 retour.state[i] = state[i];
222 retour.substream[i] = substream[i];
223 retour.stream[i] = stream[i];
229 for (
int i = 0; i < R; i++)
230 substream[i] = stream[i];
236 for (
int i = 0; i < R; i++)
237 state[i] = substream[i];
241 advanceSeed(substream, pw);
246 StringBuffer sb =
new StringBuffer();
249 sb.append(
"The state of this WELL512 is : {");
251 sb.append(
"The state of " + name +
" is : {");
252 for (
int i = 0; i < R - 1; i++)
253 sb.append(state[(state_i + i) & MASK] +
", ");
254 sb.append(state[(state_i + R - 1) & MASK] +
"}");
256 return sb.toString();
261 z0 = state[(state_i + 15) & MASK];
262 z1 = (state[state_i] ^ (state[state_i] << 16))
263 ^ (state[(state_i + M1) & MASK] ^ (state[(state_i + M1) & MASK] << 15));
264 z2 = (state[(state_i + M2) & MASK] ^ (state[(state_i + M2) & MASK] >>> 11));
265 state[state_i] = z1 ^ z2;
266 state[(state_i + 15) & MASK] = (z0 ^ (z0 << 2)) ^ (z1 ^ (z1 << 18)) ^ (z2 << 28)
267 ^ (state[state_i] ^ ((state[state_i] << 5) & 0xDA442D24));
268 state_i = (state_i + 15) & MASK;
270 long result = state[state_i];
272 return (
double) (result > 0 ? result : (result + 0x100000000L)) * NORM;