what-the-bank/sources/org/bouncycastle/pqc/math/linearalgebra/GF2Matrix.java

807 lines
29 KiB
Java

package org.bouncycastle.pqc.math.linearalgebra;
import com.google.common.primitives.UnsignedBytes;
import java.lang.reflect.Array;
import java.security.SecureRandom;
/* loaded from: classes6.dex */
public class GF2Matrix extends Matrix {
private int length;
private int[][] matrix;
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public String toString() {
int i = this.numColumns & 31;
int i2 = this.length;
if (i != 0) {
i2--;
}
StringBuffer stringBuffer = new StringBuffer();
for (int i3 = 0; i3 < this.numRows; i3++) {
StringBuilder sb = new StringBuilder();
sb.append(i3);
sb.append(": ");
stringBuffer.append(sb.toString());
for (int i4 = 0; i4 < i2; i4++) {
int i5 = this.matrix[i3][i4];
for (int i6 = 0; i6 < 32; i6++) {
if (((i5 >>> i6) & 1) == 0) {
stringBuffer.append('0');
} else {
stringBuffer.append('1');
}
}
stringBuffer.append(' ');
}
int i7 = this.matrix[i3][this.length - 1];
for (int i8 = 0; i8 < i; i8++) {
if (((i7 >>> i8) & 1) == 0) {
stringBuffer.append('0');
} else {
stringBuffer.append('1');
}
}
stringBuffer.append('\n');
}
return stringBuffer.toString();
}
public Vector rightMultiplyRightCompactForm(Vector vector) {
int i;
if (!(vector instanceof GF2Vector)) {
throw new ArithmeticException("vector is not defined over GF(2)");
}
if (vector.length != this.numColumns + this.numRows) {
throw new ArithmeticException("length mismatch");
}
int[] vecArray = ((GF2Vector) vector).getVecArray();
int[] iArr = new int[(this.numRows + 31) >>> 5];
int i2 = this.numRows;
int i3 = this.numRows & 31;
for (int i4 = 0; i4 < this.numRows; i4++) {
int i5 = i4 >> 5;
int i6 = i4 & 31;
int i7 = (vecArray[i5] >>> i6) & 1;
int i8 = i2 >> 5;
int i9 = 0;
if (i3 != 0) {
while (true) {
i = this.length - 1;
if (i9 >= i) {
break;
}
int i10 = i8 + 1;
i7 ^= ((vecArray[i8] >>> i3) | (vecArray[i10] << (32 - i3))) & this.matrix[i4][i9];
i9++;
i8 = i10;
}
int i11 = i8 + 1;
int i12 = vecArray[i8] >>> i3;
if (i11 < vecArray.length) {
i12 |= vecArray[i11] << (32 - i3);
}
i7 ^= i12 & this.matrix[i4][i];
} else {
while (i9 < this.length) {
i7 ^= this.matrix[i4][i9] & vecArray[i8];
i9++;
i8++;
}
}
int i13 = 0;
for (int i14 = 0; i14 < 32; i14++) {
i13 ^= i7 & 1;
i7 >>>= 1;
}
if (i13 == 1) {
iArr[i5] = iArr[i5] | (1 << i6);
}
}
return new GF2Vector(iArr, this.numRows);
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public Vector rightMultiply(Vector vector) {
if (!(vector instanceof GF2Vector)) {
throw new ArithmeticException("vector is not defined over GF(2)");
}
if (vector.length != this.numColumns) {
throw new ArithmeticException("length mismatch");
}
int[] vecArray = ((GF2Vector) vector).getVecArray();
int[] iArr = new int[(this.numRows + 31) >>> 5];
for (int i = 0; i < this.numRows; i++) {
int i2 = 0;
for (int i3 = 0; i3 < this.length; i3++) {
i2 ^= this.matrix[i][i3] & vecArray[i3];
}
int i4 = 0;
for (int i5 = 0; i5 < 32; i5++) {
i4 ^= (i2 >>> i5) & 1;
}
if (i4 == 1) {
int i6 = i >>> 5;
iArr[i6] = iArr[i6] | (1 << (i & 31));
}
}
return new GF2Vector(iArr, this.numRows);
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public Matrix rightMultiply(Permutation permutation) {
int[] vector = permutation.getVector();
if (vector.length != this.numColumns) {
throw new ArithmeticException("length mismatch");
}
GF2Matrix gF2Matrix = new GF2Matrix(this.numRows, this.numColumns);
for (int i = this.numColumns - 1; i >= 0; i--) {
int i2 = i >>> 5;
int i3 = vector[i];
for (int i4 = this.numRows - 1; i4 >= 0; i4--) {
int[] iArr = gF2Matrix.matrix[i4];
iArr[i2] = iArr[i2] | (((this.matrix[i4][i3 >>> 5] >>> (i3 & 31)) & 1) << (i & 31));
}
}
return gF2Matrix;
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public Matrix rightMultiply(Matrix matrix) {
if (!(matrix instanceof GF2Matrix)) {
throw new ArithmeticException("matrix is not defined over GF(2)");
}
if (matrix.numRows != this.numColumns) {
throw new ArithmeticException("length mismatch");
}
GF2Matrix gF2Matrix = (GF2Matrix) matrix;
GF2Matrix gF2Matrix2 = new GF2Matrix(this.numRows, matrix.numColumns);
int i = this.numColumns & 31;
int i2 = this.length;
if (i != 0) {
i2--;
}
for (int i3 = 0; i3 < this.numRows; i3++) {
int i4 = 0;
for (int i5 = 0; i5 < i2; i5++) {
int i6 = this.matrix[i3][i5];
for (int i7 = 0; i7 < 32; i7++) {
if (((1 << i7) & i6) != 0) {
for (int i8 = 0; i8 < gF2Matrix.length; i8++) {
int[] iArr = gF2Matrix2.matrix[i3];
iArr[i8] = iArr[i8] ^ gF2Matrix.matrix[i4][i8];
}
}
i4++;
}
}
int i9 = this.matrix[i3][this.length - 1];
for (int i10 = 0; i10 < i; i10++) {
if (((1 << i10) & i9) != 0) {
for (int i11 = 0; i11 < gF2Matrix.length; i11++) {
int[] iArr2 = gF2Matrix2.matrix[i3];
iArr2[i11] = iArr2[i11] ^ gF2Matrix.matrix[i4][i11];
}
}
i4++;
}
}
return gF2Matrix2;
}
public Vector leftMultiplyLeftCompactForm(Vector vector) {
if (!(vector instanceof GF2Vector)) {
throw new ArithmeticException("vector is not defined over GF(2)");
}
if (vector.length != this.numRows) {
throw new ArithmeticException("length mismatch");
}
int[] vecArray = ((GF2Vector) vector).getVecArray();
int[] iArr = new int[((this.numRows + this.numColumns) + 31) >>> 5];
int i = this.numRows >>> 5;
int i2 = 0;
for (int i3 = 0; i3 < i; i3++) {
int i4 = 1;
do {
if ((vecArray[i3] & i4) != 0) {
for (int i5 = 0; i5 < this.length; i5++) {
iArr[i5] = iArr[i5] ^ this.matrix[i2][i5];
}
int i6 = (this.numColumns + i2) >>> 5;
iArr[i6] = (1 << ((this.numColumns + i2) & 31)) | iArr[i6];
}
i2++;
i4 <<= 1;
} while (i4 != 0);
}
int i7 = this.numRows;
for (int i8 = 1; i8 != (1 << (i7 & 31)); i8 <<= 1) {
if ((vecArray[i] & i8) != 0) {
for (int i9 = 0; i9 < this.length; i9++) {
iArr[i9] = iArr[i9] ^ this.matrix[i2][i9];
}
int i10 = (this.numColumns + i2) >>> 5;
iArr[i10] = (1 << ((this.numColumns + i2) & 31)) | iArr[i10];
}
i2++;
}
return new GF2Vector(iArr, this.numRows + this.numColumns);
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public Vector leftMultiply(Vector vector) {
if (!(vector instanceof GF2Vector)) {
throw new ArithmeticException("vector is not defined over GF(2)");
}
if (vector.length != this.numRows) {
throw new ArithmeticException("length mismatch");
}
int[] vecArray = ((GF2Vector) vector).getVecArray();
int[] iArr = new int[this.length];
int i = this.numRows >> 5;
int i2 = this.numRows;
int i3 = 0;
int i4 = 0;
while (true) {
int i5 = 1;
if (i4 >= i) {
break;
}
do {
if ((vecArray[i4] & i5) != 0) {
for (int i6 = 0; i6 < this.length; i6++) {
iArr[i6] = iArr[i6] ^ this.matrix[i3][i6];
}
}
i3++;
i5 <<= 1;
} while (i5 != 0);
i4++;
}
for (int i7 = 1; i7 != (1 << (i2 & 31)); i7 <<= 1) {
if ((vecArray[i] & i7) != 0) {
for (int i8 = 0; i8 < this.length; i8++) {
iArr[i8] = iArr[i8] ^ this.matrix[i3][i8];
}
}
i3++;
}
return new GF2Vector(iArr, this.numColumns);
}
public Matrix leftMultiply(Permutation permutation) {
int[] vector = permutation.getVector();
if (vector.length != this.numRows) {
throw new ArithmeticException("length mismatch");
}
int[][] iArr = new int[this.numRows];
for (int i = this.numRows - 1; i >= 0; i--) {
iArr[i] = IntUtils.clone(this.matrix[vector[i]]);
}
return new GF2Matrix(this.numRows, iArr);
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public boolean isZero() {
for (int i = 0; i < this.numRows; i++) {
for (int i2 = 0; i2 < this.length; i2++) {
if (this.matrix[i][i2] != 0) {
return false;
}
}
}
return true;
}
public int hashCode() {
int i = (((this.numRows * 31) + this.numColumns) * 31) + this.length;
for (int i2 = 0; i2 < this.numRows; i2++) {
i = (i * 31) + this.matrix[i2].hashCode();
}
return i;
}
public int[] getRow(int i) {
return this.matrix[i];
}
public GF2Matrix getRightSubMatrix() {
int i;
if (this.numColumns <= this.numRows) {
throw new ArithmeticException("empty submatrix");
}
int i2 = this.numRows >> 5;
int i3 = this.numRows & 31;
GF2Matrix gF2Matrix = new GF2Matrix(this.numRows, this.numColumns - this.numRows);
for (int i4 = this.numRows - 1; i4 >= 0; i4--) {
int i5 = 0;
if (i3 != 0) {
int i6 = i2;
while (true) {
i = gF2Matrix.length - 1;
if (i5 >= i) {
break;
}
int[] iArr = gF2Matrix.matrix[i4];
int[] iArr2 = this.matrix[i4];
int i7 = i6 + 1;
iArr[i5] = (iArr2[i6] >>> i3) | (iArr2[i7] << (32 - i3));
i5++;
i6 = i7;
}
int[] iArr3 = gF2Matrix.matrix[i4];
int[] iArr4 = this.matrix[i4];
int i8 = i6 + 1;
int i9 = iArr4[i6] >>> i3;
iArr3[i] = i9;
if (i8 < this.length) {
iArr3[i] = i9 | (iArr4[i8] << (32 - i3));
}
} else {
System.arraycopy(this.matrix[i4], i2, gF2Matrix.matrix[i4], 0, gF2Matrix.length);
}
}
return gF2Matrix;
}
public int getLength() {
return this.length;
}
public GF2Matrix getLeftSubMatrix() {
if (this.numColumns <= this.numRows) {
throw new ArithmeticException("empty submatrix");
}
int i = (this.numRows + 31) >> 5;
int[][] iArr = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, i);
int i2 = (1 << (this.numRows & 31)) - 1;
if (i2 == 0) {
i2 = -1;
}
for (int i3 = this.numRows - 1; i3 >= 0; i3--) {
System.arraycopy(this.matrix[i3], 0, iArr[i3], 0, i);
int[] iArr2 = iArr[i3];
int i4 = i - 1;
iArr2[i4] = iArr2[i4] & i2;
}
return new GF2Matrix(this.numRows, iArr);
}
public int[][] getIntArray() {
return this.matrix;
}
public double getHammingWeight() {
int i = this.numColumns & 31;
int i2 = this.length;
if (i != 0) {
i2--;
}
double d = 0.0d;
double d2 = 0.0d;
for (int i3 = 0; i3 < this.numRows; i3++) {
for (int i4 = 0; i4 < i2; i4++) {
int i5 = this.matrix[i3][i4];
for (int i6 = 0; i6 < 32; i6++) {
d += (i5 >>> i6) & 1;
d2 += 1.0d;
}
}
int i7 = this.matrix[i3][this.length - 1];
for (int i8 = 0; i8 < i; i8++) {
d += (i7 >>> i8) & 1;
d2 += 1.0d;
}
}
return d / d2;
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public byte[] getEncoded() {
int i = 8;
byte[] bArr = new byte[(((this.numColumns + 7) >>> 3) * this.numRows) + 8];
LittleEndianConversions.I2OSP(this.numRows, bArr, 0);
LittleEndianConversions.I2OSP(this.numColumns, bArr, 4);
int i2 = this.numColumns >>> 5;
int i3 = this.numColumns;
for (int i4 = 0; i4 < this.numRows; i4++) {
int i5 = 0;
while (i5 < i2) {
LittleEndianConversions.I2OSP(this.matrix[i4][i5], bArr, i);
i5++;
i += 4;
}
int i6 = 0;
while (i6 < (i3 & 31)) {
bArr[i] = (byte) (this.matrix[i4][i2] >>> i6);
i6 += 8;
i++;
}
}
return bArr;
}
public GF2Matrix extendRightCompactForm() {
int i;
GF2Matrix gF2Matrix = new GF2Matrix(this.numRows, this.numRows + this.numColumns);
int i2 = this.numRows >> 5;
int i3 = this.numRows & 31;
for (int i4 = this.numRows - 1; i4 >= 0; i4--) {
int[] iArr = gF2Matrix.matrix[i4];
int i5 = i4 >> 5;
iArr[i5] = iArr[i5] | (1 << (i4 & 31));
int i6 = 0;
if (i3 != 0) {
int i7 = i2;
while (true) {
i = this.length - 1;
if (i6 >= i) {
break;
}
int i8 = this.matrix[i4][i6];
int[] iArr2 = gF2Matrix.matrix[i4];
int i9 = i7 + 1;
iArr2[i7] = iArr2[i7] | (i8 << i3);
iArr2[i9] = iArr2[i9] | (i8 >>> (32 - i3));
i6++;
i7 = i9;
}
int i10 = this.matrix[i4][i];
int[] iArr3 = gF2Matrix.matrix[i4];
int i11 = i7 + 1;
iArr3[i7] = iArr3[i7] | (i10 << i3);
if (i11 < gF2Matrix.length) {
iArr3[i11] = iArr3[i11] | (i10 >>> (32 - i3));
}
} else {
System.arraycopy(this.matrix[i4], 0, iArr, i2, this.length);
}
}
return gF2Matrix;
}
public GF2Matrix extendLeftCompactForm() {
GF2Matrix gF2Matrix = new GF2Matrix(this.numRows, this.numColumns + this.numRows);
int i = (this.numRows - 1) + this.numColumns;
int i2 = this.numRows - 1;
while (i2 >= 0) {
System.arraycopy(this.matrix[i2], 0, gF2Matrix.matrix[i2], 0, this.length);
int[] iArr = gF2Matrix.matrix[i2];
int i3 = i >> 5;
iArr[i3] = iArr[i3] | (1 << (i & 31));
i2--;
i--;
}
return gF2Matrix;
}
public boolean equals(Object obj) {
if (!(obj instanceof GF2Matrix)) {
return false;
}
GF2Matrix gF2Matrix = (GF2Matrix) obj;
if (this.numRows != gF2Matrix.numRows || this.numColumns != gF2Matrix.numColumns || this.length != gF2Matrix.length) {
return false;
}
for (int i = 0; i < this.numRows; i++) {
if (!IntUtils.equals(this.matrix[i], gF2Matrix.matrix[i])) {
return false;
}
}
return true;
}
public Matrix computeTranspose() {
int[][] iArr = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numColumns, (this.numRows + 31) >>> 5);
for (int i = 0; i < this.numRows; i++) {
for (int i2 = 0; i2 < this.numColumns; i2++) {
int i3 = i >>> 5;
if (((this.matrix[i][i2 >>> 5] >>> (i2 & 31)) & 1) == 1) {
int[] iArr2 = iArr[i2];
iArr2[i3] = (1 << (i & 31)) | iArr2[i3];
}
}
}
return new GF2Matrix(this.numRows, iArr);
}
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
public Matrix computeInverse() {
if (this.numRows != this.numColumns) {
throw new ArithmeticException("Matrix is not invertible.");
}
int[][] iArr = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
for (int i = this.numRows - 1; i >= 0; i--) {
iArr[i] = IntUtils.clone(this.matrix[i]);
}
int[][] iArr2 = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
for (int i2 = this.numRows - 1; i2 >= 0; i2--) {
iArr2[i2][i2 >> 5] = 1 << (i2 & 31);
}
for (int i3 = 0; i3 < this.numRows; i3++) {
int i4 = i3 >> 5;
int i5 = 1 << (i3 & 31);
if ((iArr[i3][i4] & i5) == 0) {
int i6 = i3 + 1;
boolean z = false;
while (i6 < this.numRows) {
if ((iArr[i6][i4] & i5) != 0) {
swapRows(iArr, i3, i6);
swapRows(iArr2, i3, i6);
i6 = this.numRows;
z = true;
}
i6++;
}
if (!z) {
throw new ArithmeticException("Matrix is not invertible.");
}
}
for (int i7 = this.numRows - 1; i7 >= 0; i7--) {
if (i7 != i3) {
int[] iArr3 = iArr[i7];
if ((iArr3[i4] & i5) != 0) {
addToRow(iArr[i3], iArr3, i4);
addToRow(iArr2[i3], iArr2[i7], 0);
}
}
}
}
return new GF2Matrix(this.numColumns, iArr2);
}
private static void swapRows(int[][] iArr, int i, int i2) {
int[] iArr2 = iArr[i];
iArr[i] = iArr[i2];
iArr[i2] = iArr2;
}
public static GF2Matrix[] createRandomRegularMatrixAndItsInverse(int i, SecureRandom secureRandom) {
int i2 = i;
GF2Matrix[] gF2MatrixArr = new GF2Matrix[2];
int i3 = (i2 + 31) >> 5;
GF2Matrix gF2Matrix = new GF2Matrix(i2, Matrix.MATRIX_TYPE_RANDOM_LT, secureRandom);
GF2Matrix gF2Matrix2 = new GF2Matrix(i2, Matrix.MATRIX_TYPE_RANDOM_UT, secureRandom);
GF2Matrix gF2Matrix3 = (GF2Matrix) gF2Matrix.rightMultiply(gF2Matrix2);
Permutation permutation = new Permutation(i2, secureRandom);
int[] vector = permutation.getVector();
int[][] iArr = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, i2, i3);
for (int i4 = 0; i4 < i2; i4++) {
System.arraycopy(gF2Matrix3.matrix[vector[i4]], 0, iArr[i4], 0, i3);
}
gF2MatrixArr[0] = new GF2Matrix(i2, iArr);
GF2Matrix gF2Matrix4 = new GF2Matrix(i2, 'I');
int i5 = 0;
while (i5 < i2) {
int i6 = i5 >>> 5;
int i7 = i5 + 1;
for (int i8 = i7; i8 < i2; i8++) {
if ((gF2Matrix.matrix[i8][i6] & (1 << (i5 & 31))) != 0) {
for (int i9 = 0; i9 <= i6; i9++) {
int[][] iArr2 = gF2Matrix4.matrix;
int[] iArr3 = iArr2[i8];
iArr3[i9] = iArr3[i9] ^ iArr2[i5][i9];
}
}
}
i5 = i7;
}
GF2Matrix gF2Matrix5 = new GF2Matrix(i2, 'I');
while (true) {
i2--;
if (i2 < 0) {
gF2MatrixArr[1] = (GF2Matrix) gF2Matrix5.rightMultiply(gF2Matrix4.rightMultiply(permutation));
return gF2MatrixArr;
}
int i10 = i2 >>> 5;
for (int i11 = i2 - 1; i11 >= 0; i11--) {
if ((gF2Matrix2.matrix[i11][i10] & (1 << (i2 & 31))) != 0) {
for (int i12 = i10; i12 < i3; i12++) {
int[][] iArr4 = gF2Matrix5.matrix;
int[] iArr5 = iArr4[i11];
iArr5[i12] = iArr4[i2][i12] ^ iArr5[i12];
}
}
}
}
}
private void assignZeroMatrix(int i, int i2) {
this.numRows = i;
this.numColumns = i2;
this.length = (i2 + 31) >>> 5;
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
for (int i3 = 0; i3 < this.numRows; i3++) {
for (int i4 = 0; i4 < this.length; i4++) {
this.matrix[i3][i4] = 0;
}
}
}
private void assignUnitMatrix(int i) {
this.numRows = i;
this.numColumns = i;
this.length = (i + 31) >>> 5;
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
for (int i2 = 0; i2 < this.numRows; i2++) {
for (int i3 = 0; i3 < this.length; i3++) {
this.matrix[i2][i3] = 0;
}
}
for (int i4 = 0; i4 < this.numRows; i4++) {
this.matrix[i4][i4 >>> 5] = 1 << (i4 & 31);
}
}
private void assignRandomUpperTriangularMatrix(int i, SecureRandom secureRandom) {
int i2;
this.numRows = i;
this.numColumns = i;
this.length = (i + 31) >>> 5;
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
int i3 = i & 31;
int i4 = i3 == 0 ? -1 : (1 << i3) - 1;
for (int i5 = 0; i5 < this.numRows; i5++) {
int i6 = i5 >>> 5;
int i7 = i5 & 31;
for (int i8 = 0; i8 < i6; i8++) {
this.matrix[i5][i8] = 0;
}
this.matrix[i5][i6] = (1 << i7) | (secureRandom.nextInt() << i7);
while (true) {
i6++;
i2 = this.length;
if (i6 < i2) {
this.matrix[i5][i6] = secureRandom.nextInt();
}
}
int[] iArr = this.matrix[i5];
int i9 = i2 - 1;
iArr[i9] = iArr[i9] & i4;
}
}
private void assignRandomRegularMatrix(int i, SecureRandom secureRandom) {
this.numRows = i;
this.numColumns = i;
this.length = (i + 31) >>> 5;
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
GF2Matrix gF2Matrix = (GF2Matrix) new GF2Matrix(i, Matrix.MATRIX_TYPE_RANDOM_LT, secureRandom).rightMultiply(new GF2Matrix(i, Matrix.MATRIX_TYPE_RANDOM_UT, secureRandom));
int[] vector = new Permutation(i, secureRandom).getVector();
for (int i2 = 0; i2 < i; i2++) {
System.arraycopy(gF2Matrix.matrix[i2], 0, this.matrix[vector[i2]], 0, this.length);
}
}
private void assignRandomLowerTriangularMatrix(int i, SecureRandom secureRandom) {
this.numRows = i;
this.numColumns = i;
this.length = (i + 31) >>> 5;
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
for (int i2 = 0; i2 < this.numRows; i2++) {
int i3 = i2 >>> 5;
int i4 = i2 & 31;
for (int i5 = 0; i5 < i3; i5++) {
this.matrix[i2][i5] = secureRandom.nextInt();
}
this.matrix[i2][i3] = (secureRandom.nextInt() >>> (31 - i4)) | (1 << i4);
while (true) {
i3++;
if (i3 < this.length) {
this.matrix[i2][i3] = 0;
}
}
}
}
private static void addToRow(int[] iArr, int[] iArr2, int i) {
for (int length = iArr2.length - 1; length >= i; length--) {
iArr2[length] = iArr[length] ^ iArr2[length];
}
}
public GF2Matrix(byte[] bArr) {
if (bArr.length < 9) {
throw new ArithmeticException("given array is not an encoded matrix over GF(2)");
}
this.numRows = LittleEndianConversions.OS2IP(bArr, 0);
this.numColumns = LittleEndianConversions.OS2IP(bArr, 4);
int i = this.numColumns;
int i2 = this.numRows;
if (this.numRows > 0) {
int i3 = ((i + 7) >>> 3) * i2;
int i4 = 8;
if (i3 == bArr.length - 8) {
this.length = (this.numColumns + 31) >>> 5;
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.length);
int i5 = this.numColumns >> 5;
int i6 = this.numColumns;
for (int i7 = 0; i7 < this.numRows; i7++) {
int i8 = 0;
while (i8 < i5) {
this.matrix[i7][i8] = LittleEndianConversions.OS2IP(bArr, i4);
i8++;
i4 += 4;
}
int i9 = 0;
while (i9 < (i6 & 31)) {
int[] iArr = this.matrix[i7];
iArr[i5] = iArr[i5] ^ ((bArr[i4] & UnsignedBytes.MAX_VALUE) << i9);
i9 += 8;
i4++;
}
}
return;
}
}
throw new ArithmeticException("given array is not an encoded matrix over GF(2)");
}
public GF2Matrix(GF2Matrix gF2Matrix) {
this.numColumns = gF2Matrix.getNumColumns();
this.numRows = gF2Matrix.getNumRows();
this.length = gF2Matrix.length;
this.matrix = new int[gF2Matrix.matrix.length];
int i = 0;
while (true) {
int[][] iArr = this.matrix;
if (i >= iArr.length) {
return;
}
iArr[i] = IntUtils.clone(gF2Matrix.matrix[i]);
i++;
}
}
public GF2Matrix(int i, int[][] iArr) {
if (iArr[0].length != ((i + 31) >> 5)) {
throw new ArithmeticException("Int array does not match given number of columns.");
}
this.numColumns = i;
this.numRows = iArr.length;
this.length = iArr[0].length;
int i2 = i & 31;
int i3 = i2 == 0 ? -1 : (1 << i2) - 1;
for (int i4 = 0; i4 < this.numRows; i4++) {
int[] iArr2 = iArr[i4];
int i5 = this.length - 1;
iArr2[i5] = iArr2[i5] & i3;
}
this.matrix = iArr;
}
private GF2Matrix(int i, int i2) {
if (i2 <= 0 || i <= 0) {
throw new ArithmeticException("size of matrix is non-positive");
}
assignZeroMatrix(i, i2);
}
public GF2Matrix(int i, char c, SecureRandom secureRandom) {
if (i <= 0) {
throw new ArithmeticException("Size of matrix is non-positive.");
}
if (c == 'I') {
assignUnitMatrix(i);
return;
}
if (c == 'L') {
assignRandomLowerTriangularMatrix(i, secureRandom);
return;
}
if (c == 'R') {
assignRandomRegularMatrix(i, secureRandom);
} else if (c == 'U') {
assignRandomUpperTriangularMatrix(i, secureRandom);
} else {
if (c != 'Z') {
throw new ArithmeticException("Unknown matrix type.");
}
assignZeroMatrix(i, i);
}
}
public GF2Matrix(int i, char c) {
this(i, c, new SecureRandom());
}
}