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

333 lines
12 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.pqc.math.linearalgebra;
/* loaded from: classes6.dex */
public class GF2nPolynomial {
private GF2nElement[] coeff;
private int size;
public final int size() {
return this.size;
}
public final void shrink() {
int i = this.size;
do {
i--;
if (!this.coeff[i].isZero()) {
break;
}
} while (i > 0);
int i2 = i + 1;
if (i2 < this.size) {
GF2nElement[] gF2nElementArr = new GF2nElement[i2];
System.arraycopy(this.coeff, 0, gF2nElementArr, 0, i2);
this.coeff = gF2nElementArr;
this.size = i2;
}
}
public final void shiftThisLeft(int i) {
if (i <= 0) {
return;
}
int i2 = this.size;
GF2nField field = this.coeff[0].getField();
enlarge(this.size + i);
while (true) {
i2--;
if (i2 < 0) {
break;
}
GF2nElement[] gF2nElementArr = this.coeff;
gF2nElementArr[i2 + i] = gF2nElementArr[i2];
}
GF2nElement gF2nElement = this.coeff[0];
if (gF2nElement instanceof GF2nPolynomialElement) {
while (true) {
i--;
if (i < 0) {
return;
} else {
this.coeff[i] = GF2nPolynomialElement.ZERO((GF2nPolynomialField) field);
}
}
} else {
if (!(gF2nElement instanceof GF2nONBElement)) {
return;
}
while (true) {
i--;
if (i < 0) {
return;
} else {
this.coeff[i] = GF2nONBElement.ZERO((GF2nONBField) field);
}
}
}
}
public final GF2nPolynomial shiftLeft(int i) {
if (i <= 0) {
return new GF2nPolynomial(this);
}
GF2nPolynomial gF2nPolynomial = new GF2nPolynomial(this.size + i, this.coeff[0]);
gF2nPolynomial.assignZeroToElements();
for (int i2 = 0; i2 < this.size; i2++) {
gF2nPolynomial.coeff[i2 + i] = this.coeff[i2];
}
return gF2nPolynomial;
}
public final void set(int i, GF2nElement gF2nElement) {
if (!(gF2nElement instanceof GF2nPolynomialElement) && !(gF2nElement instanceof GF2nONBElement)) {
throw new IllegalArgumentException("PolynomialGF2n.set f must be an instance of either GF2nPolynomialElement or GF2nONBElement!");
}
this.coeff[i] = (GF2nElement) gF2nElement.clone();
}
public final GF2nPolynomial scalarMultiply(GF2nElement gF2nElement) throws RuntimeException {
GF2nPolynomial gF2nPolynomial = new GF2nPolynomial(size());
for (int i = 0; i < size(); i++) {
gF2nPolynomial.coeff[i] = (GF2nElement) this.coeff[i].multiply(gF2nElement);
}
return gF2nPolynomial;
}
public final GF2nPolynomial remainder(GF2nPolynomial gF2nPolynomial) throws RuntimeException, ArithmeticException {
return divide(gF2nPolynomial)[1];
}
public final GF2nPolynomial reduce(GF2nPolynomial gF2nPolynomial) throws RuntimeException, ArithmeticException {
return remainder(gF2nPolynomial);
}
public final GF2nPolynomial quotient(GF2nPolynomial gF2nPolynomial) throws RuntimeException, ArithmeticException {
return divide(gF2nPolynomial)[0];
}
public final GF2nPolynomial multiplyAndReduce(GF2nPolynomial gF2nPolynomial, GF2nPolynomial gF2nPolynomial2) throws RuntimeException, ArithmeticException {
return multiply(gF2nPolynomial).reduce(gF2nPolynomial2);
}
public final GF2nPolynomial multiply(GF2nPolynomial gF2nPolynomial) throws RuntimeException {
if (size() != gF2nPolynomial.size()) {
throw new IllegalArgumentException("PolynomialGF2n.multiply: this and b must have the same size!");
}
GF2nPolynomial gF2nPolynomial2 = new GF2nPolynomial((r0 << 1) - 1);
for (int i = 0; i < size(); i++) {
for (int i2 = 0; i2 < gF2nPolynomial.size(); i2++) {
GF2nElement[] gF2nElementArr = gF2nPolynomial2.coeff;
int i3 = i + i2;
GF2nElement gF2nElement = gF2nElementArr[i3];
if (gF2nElement == null) {
gF2nElementArr[i3] = (GF2nElement) this.coeff[i].multiply(gF2nPolynomial.coeff[i2]);
} else {
gF2nElementArr[i3] = (GF2nElement) gF2nElement.add(this.coeff[i].multiply(gF2nPolynomial.coeff[i2]));
}
}
}
return gF2nPolynomial2;
}
public final boolean isZero() {
for (int i = 0; i < this.size; i++) {
GF2nElement gF2nElement = this.coeff[i];
if (gF2nElement != null && !gF2nElement.isZero()) {
return false;
}
}
return true;
}
public int hashCode() {
return getDegree() + this.coeff.hashCode();
}
public final int getDegree() {
for (int i = this.size - 1; i >= 0; i--) {
if (!this.coeff[i].isZero()) {
return i;
}
}
return -1;
}
public final GF2nPolynomial gcd(GF2nPolynomial gF2nPolynomial) throws RuntimeException, ArithmeticException {
GF2nPolynomial gF2nPolynomial2 = new GF2nPolynomial(this);
GF2nPolynomial gF2nPolynomial3 = new GF2nPolynomial(gF2nPolynomial);
gF2nPolynomial2.shrink();
gF2nPolynomial3.shrink();
GF2nPolynomial gF2nPolynomial4 = gF2nPolynomial2;
GF2nPolynomial gF2nPolynomial5 = gF2nPolynomial3;
while (!gF2nPolynomial5.isZero()) {
GF2nPolynomial gF2nPolynomial6 = gF2nPolynomial5;
gF2nPolynomial5 = gF2nPolynomial4.remainder(gF2nPolynomial5);
gF2nPolynomial4 = gF2nPolynomial6;
}
return gF2nPolynomial4.scalarMultiply((GF2nElement) gF2nPolynomial4.coeff[gF2nPolynomial4.getDegree()].invert());
}
public final boolean equals(Object obj) {
if (obj == null || !(obj instanceof GF2nPolynomial)) {
return false;
}
GF2nPolynomial gF2nPolynomial = (GF2nPolynomial) obj;
if (getDegree() != gF2nPolynomial.getDegree()) {
return false;
}
for (int i = 0; i < this.size; i++) {
if (!this.coeff[i].equals(gF2nPolynomial.coeff[i])) {
return false;
}
}
return true;
}
public final void enlarge(int i) {
int i2 = this.size;
if (i <= i2) {
return;
}
GF2nElement[] gF2nElementArr = new GF2nElement[i];
System.arraycopy(this.coeff, 0, gF2nElementArr, 0, i2);
GF2nField field = this.coeff[0].getField();
GF2nElement gF2nElement = this.coeff[0];
if (gF2nElement instanceof GF2nPolynomialElement) {
for (int i3 = this.size; i3 < i; i3++) {
gF2nElementArr[i3] = GF2nPolynomialElement.ZERO((GF2nPolynomialField) field);
}
} else if (gF2nElement instanceof GF2nONBElement) {
for (int i4 = this.size; i4 < i; i4++) {
gF2nElementArr[i4] = GF2nONBElement.ZERO((GF2nONBField) field);
}
}
this.size = i;
this.coeff = gF2nElementArr;
}
public final GF2nPolynomial[] divide(GF2nPolynomial gF2nPolynomial) throws RuntimeException, ArithmeticException {
GF2nPolynomial gF2nPolynomial2;
GF2nPolynomial[] gF2nPolynomialArr = new GF2nPolynomial[2];
GF2nPolynomial gF2nPolynomial3 = new GF2nPolynomial(this);
gF2nPolynomial3.shrink();
int degree = gF2nPolynomial.getDegree();
GF2nElement gF2nElement = (GF2nElement) gF2nPolynomial.coeff[degree].invert();
if (gF2nPolynomial3.getDegree() < degree) {
GF2nPolynomial gF2nPolynomial4 = new GF2nPolynomial(this);
gF2nPolynomialArr[0] = gF2nPolynomial4;
gF2nPolynomial4.assignZeroToElements();
gF2nPolynomialArr[0].shrink();
gF2nPolynomial2 = new GF2nPolynomial(this);
gF2nPolynomialArr[1] = gF2nPolynomial2;
} else {
GF2nPolynomial gF2nPolynomial5 = new GF2nPolynomial(this);
gF2nPolynomialArr[0] = gF2nPolynomial5;
gF2nPolynomial5.assignZeroToElements();
while (true) {
int degree2 = gF2nPolynomial3.getDegree() - degree;
if (degree2 < 0) {
break;
}
GF2nElement gF2nElement2 = (GF2nElement) gF2nPolynomial3.coeff[gF2nPolynomial3.getDegree()].multiply(gF2nElement);
GF2nPolynomial scalarMultiply = gF2nPolynomial.scalarMultiply(gF2nElement2);
scalarMultiply.shiftThisLeft(degree2);
gF2nPolynomial3 = gF2nPolynomial3.add(scalarMultiply);
gF2nPolynomial3.shrink();
gF2nPolynomialArr[0].coeff[degree2] = (GF2nElement) gF2nElement2.clone();
}
gF2nPolynomialArr[1] = gF2nPolynomial3;
gF2nPolynomial2 = gF2nPolynomialArr[0];
}
gF2nPolynomial2.shrink();
return gF2nPolynomialArr;
}
public final GF2nElement at(int i) {
return this.coeff[i];
}
public final void assignZeroToElements() {
for (int i = 0; i < this.size; i++) {
this.coeff[i].assignZero();
}
}
public final GF2nPolynomial add(GF2nPolynomial gF2nPolynomial) throws RuntimeException {
GF2nPolynomial gF2nPolynomial2;
int i = 0;
if (size() >= gF2nPolynomial.size()) {
gF2nPolynomial2 = new GF2nPolynomial(size());
while (i < gF2nPolynomial.size()) {
gF2nPolynomial2.coeff[i] = (GF2nElement) this.coeff[i].add(gF2nPolynomial.coeff[i]);
i++;
}
while (i < size()) {
gF2nPolynomial2.coeff[i] = this.coeff[i];
i++;
}
} else {
gF2nPolynomial2 = new GF2nPolynomial(gF2nPolynomial.size());
while (i < size()) {
gF2nPolynomial2.coeff[i] = (GF2nElement) this.coeff[i].add(gF2nPolynomial.coeff[i]);
i++;
}
while (i < gF2nPolynomial.size()) {
gF2nPolynomial2.coeff[i] = gF2nPolynomial.coeff[i];
i++;
}
}
return gF2nPolynomial2;
}
public GF2nPolynomial(GF2nPolynomial gF2nPolynomial) {
int i = gF2nPolynomial.size;
this.coeff = new GF2nElement[i];
this.size = i;
for (int i2 = 0; i2 < this.size; i2++) {
this.coeff[i2] = (GF2nElement) gF2nPolynomial.coeff[i2].clone();
}
}
public GF2nPolynomial(GF2Polynomial gF2Polynomial, GF2nField gF2nField) {
int degree = gF2nField.getDegree() + 1;
this.size = degree;
this.coeff = new GF2nElement[degree];
int i = 0;
if (gF2nField instanceof GF2nONBField) {
while (i < this.size) {
if (gF2Polynomial.testBit(i)) {
this.coeff[i] = GF2nONBElement.ONE((GF2nONBField) gF2nField);
} else {
this.coeff[i] = GF2nONBElement.ZERO((GF2nONBField) gF2nField);
}
i++;
}
return;
}
if (!(gF2nField instanceof GF2nPolynomialField)) {
throw new IllegalArgumentException("PolynomialGF2n(Bitstring, GF2nField): B1 must be an instance of GF2nONBField or GF2nPolynomialField!");
}
while (i < this.size) {
if (gF2Polynomial.testBit(i)) {
this.coeff[i] = GF2nPolynomialElement.ONE((GF2nPolynomialField) gF2nField);
} else {
this.coeff[i] = GF2nPolynomialElement.ZERO((GF2nPolynomialField) gF2nField);
}
i++;
}
}
public GF2nPolynomial(int i, GF2nElement gF2nElement) {
this.size = i;
this.coeff = new GF2nElement[i];
for (int i2 = 0; i2 < this.size; i2++) {
this.coeff[i2] = (GF2nElement) gF2nElement.clone();
}
}
private GF2nPolynomial(int i) {
this.size = i;
this.coeff = new GF2nElement[i];
}
}