public void initByArray(int... key) {
		@SuppressWarnings("unused")
		int lag = N32 >= 623 ? 11 : (N32 >= 68 ? 7 : (N32 >= 39 ? 5 : 3)) ;
		int mid = (N32 - lag) / 2;
		
		for (int i = sfmt.length - 1; i >= 0; i--)
			sfmt[i] = 0x8b8b8b8b;
		
		int count = key.length >= N32 ? key.length : N32 - 1, r = func1(0x8b8b8b8b);
		sfmt[mid] += r;
		r += key.length;
		sfmt[mid + lag] += r;
		sfmt[0] = r;
		int i = 1, j = 0;
		for (; j < count && j < key.length; j++) {
			r = func1(sfmt[i] ^ sfmt[(i + mid) % N32]
					^ sfmt[(i + N32 - 1) % N32]);
			sfmt[(i + mid) % N32] += r;
			r += key[j] + i;
			sfmt[(i + mid + lag) % N32] += r;
			sfmt[i] = r;
			i = (i + 1) % N32;
		}
		for (; j < count; j++) {
			r = func1(sfmt[i] ^ sfmt[(i + mid) % N32]
					^ sfmt[(i + N32 - 1) % N32]);
			sfmt[(i + mid) % N32] += r;
			r += i;
			sfmt[(i + mid + lag) % N32] += r;
			sfmt[i] = r;
			i = (i + 1) % N32;
		}
		for (j = 0; j < N32; j++) {
			r = func2(sfmt[i] + sfmt[(i + mid) % N32]
					+ sfmt[(i + N32 - 1) % N32]);
			sfmt[(i + mid) % N32] ^= r;
			r -= i;
			sfmt[(i + mid + lag) % N32] ^= r;
			sfmt[i] = r;
			i = (i + 1) % N32;
		}
		periodCertification();
		idx = N32;
	}