public ExtensionLFSR(ExtensionPolynomial feedbackPolynomial, ExtensionFieldElement[] initialState) { if (feedbackPolynomial.Field.Characteristic != initialState[0].Field.Characteristic) throw new Exception("Both values should be defined in the same field."); if ((initialState.Length - 1) < feedbackPolynomial.Degree) throw new ArgumentOutOfRangeException("Initial state size must be greater then feedback polynomial degree."); this.currentState = initialState; this._feedbackPolynomial = feedbackPolynomial; }
public void Clock() { ExtensionFieldElement r = ExtensionFieldElement.Zero(_feedbackPolynomial.Field); // Evaluate the current state on feedback polynomial for (int i = 0; i < currentState.Length; i++) r += _feedbackPolynomial.Coefficients[i] * currentState[i]; // Shift the currentState right. _streamOutput = currentState[0]; Array.Copy(currentState, 1, currentState, 0, currentState.Length - 1); currentState[currentState.Length - 1] = r; }
public void Clock() { ExtensionFieldElement r = ExtensionFieldElement.Zero(_feedbackPolynomial.Field); // Evaluate the current state on feedback polynomial for (int i = 0; i < currentState.Length; i++) { r += _feedbackPolynomial.Coefficients[i] * currentState[i]; } // Shift the currentState right. _streamOutput = currentState[0]; Array.Copy(currentState, 1, currentState, 0, currentState.Length - 1); currentState[currentState.Length - 1] = r; }
public static ExtensionFieldElement operator *(ExtensionFieldElement element1, ExtensionFieldElement element2) { if (element1.Field != element2.Field) { throw new Exception("Both elements should be in the same field."); } ExtensionFieldElement result = new ExtensionFieldElement(); result.Field = element1.Field; result.Value = (element1.Value * element2.Value) % element1.Field.DefiningPolynomial; return(result); }
public static ExtensionFieldElement operator %(ExtensionFieldElement element1, ExtensionFieldElement element2) { if (element1.Field != element2.Field) { throw new Exception("Both elements should be in the same field."); } ExtensionFieldElement result = new ExtensionFieldElement(); result.Field = element1.Field; result.Value = (element1.Value % element2.Value) % element1.Field.DefiningPolynomial; return(result); //throw new NotImplementedException("There was a problem about element operation handling."); }
public ExtensionFieldElement RandomPrimitiveElement(int degree) { if (degree > this._primitivePolynomial.Degree - 1) { throw new Exception("Element's degree can't be equal to or higher than Primitive polynomial's degree."); } Polynomial p = Polynomial.Random(this._baseField, degree, this.rnd); while (!p.IsPrimitiveElement(this._primitivePolynomial)) { p = Polynomial.Random(this._baseField, degree, this.rnd); } ExtensionFieldElement elt = new ExtensionFieldElement(this, p); return(elt); }
public static ExtensionPolynomial operator *(ExtensionPolynomial poly1, ExtensionPolynomial poly2) { if (poly1.Field.Characteristic != poly2.Field.Characteristic) { throw new Exception("Both polynomials should be defined in the same field."); } ExtensionFieldElement[] elts = new ExtensionFieldElement[poly1.Degree + poly2.Degree + 1]; for (int i = 0; i < elts.Length; i++) { ExtensionFieldElement e = ExtensionFieldElement.One(poly1.Field); elts[i] = e; } ExtensionPolynomial p = new ExtensionPolynomial(elts); for (int i = 0; i < poly1._coefficients.Length; i++) { for (int j = 0; j < poly2._coefficients.Length; j++) { p._coefficients[i + j] += poly1._coefficients[i] * poly2._coefficients[j]; } } int plen = p._coefficients.Length; for (int i = 0; i < plen - 1; i++) { if (p._coefficients[plen - i - 1].Value.IsZero) { Array.Resize(ref p._coefficients, p._coefficients.Length - 1); } else { break; } } return(p); }
public static ExtensionFieldElement Zero(ExtensionField F) { ExtensionFieldElement zero = new ExtensionFieldElement(F, new Polynomial(F.DefiningPolynomial.Field, 0)); return(zero); }
public static ExtensionFieldElement operator /(ExtensionFieldElement element1, ExtensionFieldElement element2) { if (element1.Field != element2.Field) { throw new Exception("Both elements should be in the same field."); } ExtensionFieldElement result = new ExtensionFieldElement(); result.Field = element1.Field; result.Value = (element1.Value / element2.Value) % element1.Field.DefiningPolynomial; return result; //throw new NotImplementedException("There was a problem about element operation handling."); }
public ExtensionFieldElement One() { ExtensionFieldElement one = new ExtensionFieldElement(this.Field, new Polynomial(this.Field.DefiningPolynomial.Field, 1)); return(one); }
private void btnLFSR_Click(object sender, EventArgs e) { if (lfsr == null) { ExtensionFieldElement[] eltlist1 = new ExtensionFieldElement[4]; for (int i = 0; i < 4; i++) eltlist1[i] = ExtF.RandomElement; ExtensionPolynomial extp1 = new ExtensionPolynomial(eltlist1); ExtensionFieldElement[] eltlist2 = new ExtensionFieldElement[4]; for (int i = 0; i < 4; i++) eltlist2[i] = ExtF.RandomElement; lfsr = new ExtensionLFSR(extp1, eltlist2); txtInfo.Clear(); txtInfo.AppendText("LFSR has been created.\r\n"); txtInfo.AppendText("Feedback Polynomial:\r\n" + lfsr.FeedbackPolynomial.ToString() + "\r\n"); txtInfo.AppendText("Initial State:\r\n"); for (int i = 0; i < lfsr.currentState.Length; i++) txtInfo.AppendText("c_" + i + " = " + lfsr.currentState[i].ToString() + "\r\n"); btnLFSR.Text = "Clock the LFSR"; return; } // clock time lfsr.Clock(); txtInfo.AppendText("\r\nOutput " + s++ + " : " + lfsr.StreamOutput + "\r\n"); txtInfo.AppendText("Current State:\r\n"); for (int i = 0; i < lfsr.currentState.Length; i++) txtInfo.AppendText("c_" + i + " = " + lfsr.currentState[i].ToString() + "\r\n"); }
public static ExtensionFieldElement One(ExtensionField F) { ExtensionFieldElement one = new ExtensionFieldElement(F, new Polynomial(F.DefiningPolynomial.Field, 1)); return one; }
public ExtensionFieldElement RandomPrimitiveElement(int degree) { if (degree > this._primitivePolynomial.Degree - 1) { throw new Exception("Element's degree can't be equal to or higher than Primitive polynomial's degree."); } Polynomial p = Polynomial.Random(this._baseField, degree, this.rnd); while (!p.IsPrimitiveElement(this._primitivePolynomial)) { p = Polynomial.Random(this._baseField, degree, this.rnd); } ExtensionFieldElement elt = new ExtensionFieldElement(this, p); return elt; }
public static ExtensionPolynomial operator *(ExtensionPolynomial poly1, ExtensionPolynomial poly2) { if (poly1.Field.Characteristic != poly2.Field.Characteristic) { throw new Exception("Both polynomials should be defined in the same field."); } ExtensionFieldElement[] elts = new ExtensionFieldElement[poly1.Degree + poly2.Degree + 1]; for (int i = 0; i < elts.Length; i++) { ExtensionFieldElement e = ExtensionFieldElement.One(poly1.Field); elts[i] = e; } ExtensionPolynomial p = new ExtensionPolynomial(elts); for (int i = 0; i < poly1._coefficients.Length; i++) { for (int j = 0; j < poly2._coefficients.Length; j++) p._coefficients[i + j] += poly1._coefficients[i] * poly2._coefficients[j]; } int plen = p._coefficients.Length; for (int i = 0; i < plen - 1; i++) { if (p._coefficients[plen - i - 1].Value.IsZero) Array.Resize(ref p._coefficients, p._coefficients.Length - 1); else break; } return p; }
public ExtensionFieldElement Zero() { ExtensionFieldElement zero = new ExtensionFieldElement(this.Field, new Polynomial(this.Field.DefiningPolynomial.Field, 0)); return zero; }
public ExtensionFieldElement One() { ExtensionFieldElement one = new ExtensionFieldElement(this.Field, new Polynomial(this.Field.DefiningPolynomial.Field, 1)); return one; }
public static ExtensionFieldElement Zero(ExtensionField F) { ExtensionFieldElement zero = new ExtensionFieldElement(F, new Polynomial(F.DefiningPolynomial.Field, 0)); return zero; }
private void btnExtPolyAdd_Click(object sender, EventArgs e) { ExtensionFieldElement[] eltlist1 = new ExtensionFieldElement[7]; for (int i = 0; i < 7; i++) eltlist1[i] = ExtF.RandomElement; ExtensionPolynomial extp1 = new ExtensionPolynomial(eltlist1); ExtensionFieldElement[] eltlist2 = new ExtensionFieldElement[4]; for (int i = 0; i < 4; i++) eltlist2[i] = ExtF.RandomElement; ExtensionPolynomial extp2 = new ExtensionPolynomial(eltlist2); ExtensionPolynomial result = extp1 + extp2; txtInfo.Clear(); txtInfo.AppendText("Random Extension Polynomial 1\r\n" + extp1.ToString() + "\r\n"); txtInfo.AppendText("\r\nRandom Extension Polynomial 2\r\n" + extp2.ToString() + "\r\n"); txtInfo.AppendText("\r\nPolynomial 1 + Polynomial 2\r\n" + result.ToString() + "\r\n"); }
public ExtensionFieldElement Zero() { ExtensionFieldElement zero = new ExtensionFieldElement(this.Field, new Polynomial(this.Field.DefiningPolynomial.Field, 0)); return(zero); }
public static ExtensionFieldElement One(ExtensionField F) { ExtensionFieldElement one = new ExtensionFieldElement(F, new Polynomial(F.DefiningPolynomial.Field, 1)); return(one); }
public static ExtensionFieldElement operator -(ExtensionFieldElement element1, ExtensionFieldElement element2) { if (element1.Field != element2.Field) { throw new Exception("Both elements should be in the same field."); } ExtensionFieldElement result = new ExtensionFieldElement(); result.Field = element1.Field; result.Value = (element1.Value - element2.Value) % element1.Field.DefiningPolynomial; return result; }