/// <summary> /// Computes the change-of-basis matrix for basis conversion according to 1363. /// The result is stored in the lists fields and matrices. /// </summary> /// /// <param name="B1">The GF2nField to convert to</param> public override void ComputeCOBMatrix(GF2nField B1) { // we are in B0 here! if (DegreeN != B1.Degree) { throw new ArgumentException("GF2nField.computeCOBMatrix: B1 has a different degree and thus cannot be coverted to!"); } int i, j; GF2nElement[] gamma; GF2nElement u; GF2Polynomial[] COBMatrix = new GF2Polynomial[DegreeN]; for (i = 0; i < DegreeN; i++) { COBMatrix[i] = new GF2Polynomial(DegreeN); } // find Random Root do { // u is in representation according to B1 u = B1.RandomRoot(FieldPoly); }while (u.IsZero()); gamma = new GF2nPolynomialElement[DegreeN]; // build gamma matrix by squaring gamma[0] = (GF2nElement)u.Clone(); for (i = 1; i < DegreeN; i++) { gamma[i] = gamma[i - 1].Square(); } // convert horizontal gamma matrix by vertical Bitstrings for (i = 0; i < DegreeN; i++) { for (j = 0; j < DegreeN; j++) { if (gamma[i].TestBit(j)) { COBMatrix[DegreeN - j - 1].SetBit(DegreeN - i - 1); } } } Fields.Add(B1); Matrices.Add(COBMatrix); B1.Fields.Add(this); B1.Matrices.Add(InvertMatrix(COBMatrix)); }
/// <summary> /// Computes the change-of-basis matrix for basis conversion according to 1363. /// The result is stored in the lists fields and matrices. /// </summary> /// /// <param name="B1">The GF2nField to convert to</param> public override void ComputeCOBMatrix(GF2nField B1) { // we are in B0 here! if (DegreeN != B1.Degree) { throw new ArgumentException("GF2nPolynomialField.computeCOBMatrix: B1 has a different degree and thus cannot be coverted to!"); } if (B1 is GF2nONBField) { // speedup (calculation is done in PolynomialElements instead of ONB) B1.ComputeCOBMatrix(this); return; } int i, j; GF2nElement[] gamma; GF2nElement u; GF2Polynomial[] COBMatrix = new GF2Polynomial[DegreeN]; for (i = 0; i < DegreeN; i++) { COBMatrix[i] = new GF2Polynomial(DegreeN); } // find Random Root do { // u is in representation according to B1 u = B1.RandomRoot(FieldPoly); }while (u.IsZero()); // build gamma matrix by multiplying by u if (u is GF2nONBElement) { gamma = new GF2nONBElement[DegreeN]; gamma[DegreeN - 1] = GF2nONBElement.One((GF2nONBField)B1); } else { gamma = new GF2nPolynomialElement[DegreeN]; gamma[DegreeN - 1] = GF2nPolynomialElement.One((GF2nPolynomialField)B1); } gamma[DegreeN - 2] = u; for (i = DegreeN - 3; i >= 0; i--) { gamma[i] = (GF2nElement)gamma[i + 1].Multiply(u); } if (B1 is GF2nONBField) { // convert horizontal gamma matrix by vertical Bitstrings for (i = 0; i < DegreeN; i++) { for (j = 0; j < DegreeN; j++) { // TODO remember: ONB treats its Bits in reverse order !!! if (gamma[i].TestBit(DegreeN - j - 1)) { COBMatrix[DegreeN - j - 1].SetBit(DegreeN - i - 1); } } } } else { // convert horizontal gamma matrix by vertical Bitstrings for (i = 0; i < DegreeN; i++) { for (j = 0; j < DegreeN; j++) { if (gamma[i].TestBit(j)) { COBMatrix[DegreeN - j - 1].SetBit(DegreeN - i - 1); } } } } // store field and matrix for further use Fields.Add(B1); Matrices.Add(COBMatrix); // store field and inverse matrix for further use in B1 B1.Fields.Add(this); B1.Matrices.Add(InvertMatrix(COBMatrix)); }
/// <summary> /// Computes the change-of-basis matrix for basis conversion according to 1363. /// The result is stored in the lists fields and matrices. /// </summary> /// /// <param name="B1">The GF2nField to convert to</param> public override void ComputeCOBMatrix(GF2nField B1) { // we are in B0 here! if (DegreeN != B1.Degree) throw new ArgumentException("GF2nPolynomialField.computeCOBMatrix: B1 has a different degree and thus cannot be coverted to!"); if (B1 is GF2nONBField) { // speedup (calculation is done in PolynomialElements instead of ONB) B1.ComputeCOBMatrix(this); return; } int i, j; GF2nElement[] gamma; GF2nElement u; GF2Polynomial[] COBMatrix = new GF2Polynomial[DegreeN]; for (i = 0; i < DegreeN; i++) COBMatrix[i] = new GF2Polynomial(DegreeN); // find Random Root do { // u is in representation according to B1 u = B1.RandomRoot(FieldPoly); } while (u.IsZero()); // build gamma matrix by multiplying by u if (u is GF2nONBElement) { gamma = new GF2nONBElement[DegreeN]; gamma[DegreeN - 1] = GF2nONBElement.One((GF2nONBField)B1); } else { gamma = new GF2nPolynomialElement[DegreeN]; gamma[DegreeN - 1] = GF2nPolynomialElement.One((GF2nPolynomialField)B1); } gamma[DegreeN - 2] = u; for (i = DegreeN - 3; i >= 0; i--) gamma[i] = (GF2nElement)gamma[i + 1].Multiply(u); if (B1 is GF2nONBField) { // convert horizontal gamma matrix by vertical Bitstrings for (i = 0; i < DegreeN; i++) { for (j = 0; j < DegreeN; j++) { // TODO remember: ONB treats its Bits in reverse order !!! if (gamma[i].TestBit(DegreeN - j - 1)) COBMatrix[DegreeN - j - 1].SetBit(DegreeN - i - 1); } } } else { // convert horizontal gamma matrix by vertical Bitstrings for (i = 0; i < DegreeN; i++) { for (j = 0; j < DegreeN; j++) { if (gamma[i].TestBit(j)) COBMatrix[DegreeN - j - 1].SetBit(DegreeN - i - 1); } } } // store field and matrix for further use Fields.Add(B1); Matrices.Add(COBMatrix); // store field and inverse matrix for further use in B1 B1.Fields.Add(this); B1.Matrices.Add(InvertMatrix(COBMatrix)); }
/// <summary> /// Computes the change-of-basis matrix for basis conversion according to 1363. /// The result is stored in the lists fields and matrices. /// </summary> /// /// <param name="B1">The GF2nField to convert to</param> public override void ComputeCOBMatrix(GF2nField B1) { // we are in B0 here! if (DegreeN != B1.Degree) throw new ArgumentException("GF2nField.computeCOBMatrix: B1 has a different degree and thus cannot be coverted to!"); int i, j; GF2nElement[] gamma; GF2nElement u; GF2Polynomial[] COBMatrix = new GF2Polynomial[DegreeN]; for (i = 0; i < DegreeN; i++) COBMatrix[i] = new GF2Polynomial(DegreeN); // find Random Root do { // u is in representation according to B1 u = B1.RandomRoot(FieldPoly); } while (u.IsZero()); gamma = new GF2nPolynomialElement[DegreeN]; // build gamma matrix by squaring gamma[0] = (GF2nElement)u.Clone(); for (i = 1; i < DegreeN; i++) gamma[i] = gamma[i - 1].Square(); // convert horizontal gamma matrix by vertical Bitstrings for (i = 0; i < DegreeN; i++) { for (j = 0; j < DegreeN; j++) { if (gamma[i].TestBit(j)) COBMatrix[DegreeN - j - 1].SetBit(DegreeN - i - 1); } } Fields.Add(B1); Matrices.Add(COBMatrix); B1.Fields.Add(this); B1.Matrices.Add(InvertMatrix(COBMatrix)); }