void genRandArray(int[] array, int size) {
		if (size > array.length)
			throw new IllegalArgumentException("Given size " + size
					+ " exceeds array length " + array.length);
		if (size < N32)
			throw new IllegalArgumentException("Size must be at least " + N32
					+ ", but is " + size);
		if (size % 4 != 0)
			throw new IllegalArgumentException("Size must be a multiple of 4: "
					+ size);
		int i = 0, j = 0, r1I = 4 * (N - 2), r2I = 4 * (N - 1);
		int[] r1 = sfmt, r2 = sfmt;
		for (; i < 4 * (N - POS1); i += 4) {
			doRecursion(array, i, sfmt, i, sfmt, i + 4 * POS1, r1, r1I, r2, r2I);
			r1 = r2;
			r1I = r2I;
			r2 = array;
			r2I = i;
		}
		for (; i < 4 * N; i += 4) {
			doRecursion(array, i, sfmt, i, array, i + 4 * (POS1 - N), r1, r1I,
					r2, r2I);
			assert r1 == r2;
			r1I = r2I;
			assert r2 == array;
			r2I = i;
		}
		for (; i < size - 4 * N; i += 4) {
			doRecursion(array, i, array, i - 4 * N, array, i + 4 * (POS1 - N),
					r1, r1I, r2, r2I);
			assert r1 == r2;
			r1I = r2I;
			assert r2 == array;
			r2I = i;
		}
		for (; j < 4 * 2 * N - size; j++)
			sfmt[j] = array[j + size - 4 * N];
		for (; i < size; i += 4, j += 4) {
			doRecursion(array, i, array, i - 4 * N, array, i + 4 * (POS1 - N),
					r1, r1I, r2, r2I);
			assert r1 == r2;
			r1I = r2I;
			assert r2 == array;
			r2I = i;
			sfmt[j] = array[i];
			sfmt[j + 1] = array[i + 1];
			sfmt[j + 2] = array[i + 2];
			sfmt[j + 3] = array[i + 3];
		}
	}