void FindOrderThreaded() { try { int p = (int)Tab1nupFieldSize.Value; if (!MathTools.IsPrime(p)) { MessageBox.Show("Finite Field size must be a prime number!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } FiniteField F = new FiniteField(p); Polynomial P = Polynomial.Parse(F, Tab1txtPolyCoefs.Text.Trim(), true); Tab1lblResult.Text = ""; Tab1lblResult.Text += "Recognized polynomial: " + P.ToString() + "\r\n\r\nComputing the order...\r\n\r\n"; Application.DoEvents(); int order = P.Order; Tab1lblResult.Text += "Order of the polynomial is " + order.ToString(); } catch (Exception exp) { MessageBox.Show(exp.Message); } }
private void btnFixField_Click(object sender, EventArgs e) { int t = 0; bool dene = int.TryParse(txtSize.Text.Trim(), out t); if (dene) { if (MathTools.IsPrime(t)) { p = t; F = new FiniteField(p); lblInfo.Text = "Current Field: " + F.ToString(); } else { MessageBox.Show("Please enter a prime number!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); txtSize.Focus(); } } else { MessageBox.Show("Please check the value you have written!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); txtSize.Focus(); } btnFixField.Enabled = false; btnFixValues.Enabled = true; //lblInfo.Text = "Please enter the parameters"; }
public static Polynomial Random(FiniteField F, int degree, Random rnd) { int[] coefs = new int[degree + 1]; for (int i = 0; i < coefs.Length - 1; i++) { coefs[i] = rnd.Next(F.Elements[0].Value, F.Elements[F.Elements.Length - 1].Value + 1); } coefs[coefs.Length - 1] = rnd.Next(F.Elements[1].Value, F.Elements[F.Elements.Length - 1].Value + 1); Polynomial p = new Polynomial(F, coefs); return(p); }
/// <summary> /// If the characteristic of the finite field is less or equal then 7 you can't use seperators. /// Example; For char=5 you should write string as "11232340134324320" /// For char=11 you should write string as "1-10-0-8-2-1-3-10-9-2" /// You can use . , ; _ - and space char as seperator. /// </summary> /// <param name="F"></param> /// <param name="s"></param> /// <returns></returns> public static Polynomial Parse(FiniteField F, string s, bool trimZeros) { FiniteFieldElement[] list = new FiniteFieldElement[0]; if (F.Characteristic > 7) { string[] slist = s.Split('.', ',', ';', '_', '-', ' '); for (int i = 0; i < slist.Length; i++) { FiniteFieldElement f = new FiniteFieldElement(); f.Field = F; f.Value = int.Parse(slist[i].ToString()) % F.Characteristic; Array.Resize(ref list, list.Length + 1); list[list.Length - 1] = f; } } else { for (int i = 0; i < s.Length; i++) { FiniteFieldElement f = new FiniteFieldElement(); f.Field = F; f.Value = int.Parse(s[i].ToString()) % F.Characteristic; Array.Resize(ref list, list.Length + 1); list[list.Length - 1] = f; } } // Trim 0s if (trimZeros) { int listlen = list.Length; for (int i = 0; i < listlen - 1; i++) { if (list[listlen - i - 1].Value == 0) { Array.Resize(ref list, list.Length - 1); } else { break; } } } return(new Polynomial(list)); }
public Polynomial(FiniteField F, params int[] coefficients) { _coefficients = new FiniteFieldElement[0]; for (int i = 0; i < coefficients.Length; i++) { FiniteFieldElement elt = new FiniteFieldElement(); elt.Field = F; elt.Value = coefficients[i] % elt.Field.Characteristic; Array.Resize(ref _coefficients, _coefficients.Length + 1); _coefficients[_coefficients.Length - 1] = elt; } }
/// <summary> /// Generates a polynomial which consists only 1 term over given field F. e.g. (F,alfa,4) returns the polynomial alfa*x^4 over F and alfa in F. /// </summary> public static Polynomial GenerateFromTerm(FiniteField F, FiniteFieldElement Coefficient, int Degree) { if (F.Characteristic != Coefficient.Field.Characteristic) { throw new Exception("Coefficient must be an element of given Finite Field F."); } FiniteFieldElement[] coefs = new FiniteFieldElement[0]; for (int i = 0; i < Degree; i++) { Array.Resize(ref coefs, coefs.Length + 1); coefs[coefs.Length - 1] = F.Elements[0]; } Array.Resize(ref coefs, coefs.Length + 1); FiniteFieldElement f = Coefficient; coefs[coefs.Length - 1] = f; return(new Polynomial(coefs)); }
protected void btnRunBM_Click(object sender, EventArgs e) { FiniteField F = null; int p = int.Parse(txtSize.Text.Trim()); if (MathTools.IsPrime(p)) { F = new FiniteField(p); } else { Response.Clear(); Response.Write("Please write a prime number!"); Response.End(); } // Clean The Mess string seq = txtSeq.Text, newseq = ""; for (int i = 0; i < seq.Length; i++) { int t = 0; bool dene = int.TryParse(seq[i].ToString(), out t); if (dene) { if (t < F.Characteristic) newseq += seq[i]; } } if (newseq.Length == 0) { Response.Clear(); Response.Write("Please enter the sequence."); Response.End(); } txtSeq.Text = newseq; Polynomial poly = Polynomial.Parse(F, newseq, false); Polynomial c; int LC = LFSRTools.BerlekampMassey(poly, out c); lblResult.Text = "Sequence Length = " + newseq.Length + "<br/>" + "Linear Complexity = " + LC + "<br/>" + "Connection Polynomial = " + c.ToString(); }
void GetTab2Ready() { // Finite Field F3 = new FiniteField(3); // LFSR 1 - 3 string strf1 = "201", stri1 = "001"; Polynomial feedback1 = Polynomial.Parse(F3, strf1, false); Polynomial initial1 = Polynomial.Parse(F3, stri1, false); L1 = new LFSR(feedback1, initial1.Coefficients); Tab2lblLFSR1.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "1" + strf1, false).ToString() + "\r\nInitial: " + stri1 + "\r\nPeriod = " + L1.Period; // LFSR 2 - 4 string strf2 = "2001", stri2 = "0001"; Polynomial feedback2 = Polynomial.Parse(F3, strf2, false); Polynomial initial2 = Polynomial.Parse(F3, stri2, false); L2 = new LFSR(feedback2, initial2.Coefficients); Tab2lblLFSR2.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "2" + strf2, false).ToString() + "\r\nInitial: " + stri2 + "\r\nPeriod = " + L2.Period; // LFSR 3 - 5 string strf3 = "20001", stri3 = "00001"; Polynomial feedback3 = Polynomial.Parse(F3, strf3, false); Polynomial initial3 = Polynomial.Parse(F3, stri3, false); L3 = new LFSR(feedback3, initial3.Coefficients); Tab2lblLFSR3.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "1" + strf3, false).ToString() + "\r\nInitial: " + stri3 + "\r\nPeriod = " + L3.Period; // LFSR 4 - 7 string strf4 = "0000201", stri4 = "1012220"; Polynomial feedback4 = Polynomial.Parse(F3, strf4, false); Polynomial initial4 = Polynomial.Parse(F3, stri4, false); L4 = new LFSR(feedback4, initial4.Coefficients); Tab2lblLFSR4.Text += "\r\n" + "Feedback: " + Polynomial.Parse(F3, "1" + strf4, false).ToString() + "\r\nInitial: " + stri4 + "\r\nPeriod = 26 (precomputed)";// +L4.Period; // Nonlinear Combiner NonlinCombOutput = ""; Tab2lblNonLinComb.Text += "\r\n(X1+X3) * (X2+X4)"; }
private void Form1_Load(object sender, EventArgs e) { GF5 = new FiniteField(5); GF56Primitive = new Polynomial(GF5, 2, 0, 1, 4, 1, 0, 1); ExtF = new ExtensionField(GF56Primitive); lblInfo.Text = "Current Field Info: " + ExtF.ToString(); }
private void txtSize_Leave(object sender, EventArgs e) { int t = 0; bool dene = int.TryParse(txtSize.Text.Trim(), out t); if (dene) { if (MathTools.IsPrime(t)) { eskip = p; p = t; F = new FiniteField(p); lblInfo.Text = "Current Field: " + F.ToString(); if (eskip > p) { txtSeq.Clear(); txtResult.Clear(); } } else { MessageBox.Show("Please enter a prime number!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); txtSize.Focus(); } } else { MessageBox.Show("Please check the value you have written!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); txtSize.Focus(); } }
/// <summary> /// Generates a polynomial which consists only 1 term over given field F. e.g. (F,alfa,4) returns the polynomial alfa*x^4 over F and alfa in F. /// </summary> public static Polynomial GenerateFromTerm(FiniteField F, FiniteFieldElement Coefficient, int Degree) { if (F.Characteristic != Coefficient.Field.Characteristic) { throw new Exception("Coefficient must be an element of given Finite Field F."); } FiniteFieldElement[] coefs = new FiniteFieldElement[0]; for (int i = 0; i < Degree; i++) { Array.Resize(ref coefs, coefs.Length + 1); coefs[coefs.Length - 1] = F.Elements[0]; } Array.Resize(ref coefs, coefs.Length + 1); FiniteFieldElement f = Coefficient; coefs[coefs.Length - 1] = f; return new Polynomial(coefs); }
public Polynomial(FiniteField F, params int[] coefficients) { _coefficients = new FiniteFieldElement[0]; for (int i = 0; i < coefficients.Length; i++) { FiniteFieldElement elt = new FiniteFieldElement(); elt.Field = F; elt.Value = coefficients[i] % elt.Field.Characteristic; Array.Resize(ref _coefficients, _coefficients.Length + 1); _coefficients[_coefficients.Length - 1] = elt; } }
public ExtensionField(Polynomial primitivePolynomial) { this._baseField = primitivePolynomial.Field; this._primitivePolynomial = primitivePolynomial; this.rnd = new Random(); }
/// <summary> /// Generates a monic polynomial of given degree over given field F. /// </summary> public static Polynomial RandomMonic(FiniteField F, int degree) { Random rnd = new Random(); int[] coefs = new int[degree + 1]; for (int i = 0; i < coefs.Length - 1; i++) coefs[i] = rnd.Next(F.Elements[0].Value, F.Elements[F.Elements.Length - 1].Value + 1); coefs[coefs.Length - 1] = 1; Polynomial p = new Polynomial(F, coefs); return p; }
/// <summary> /// If the characteristic of the finite field is less or equal then 7 you can't use seperators. /// Example; For char=5 you should write string as "11232340134324320" /// For char=11 you should write string as "1-10-0-8-2-1-3-10-9-2" /// You can use . , ; _ - and space char as seperator. /// </summary> /// <param name="F"></param> /// <param name="s"></param> /// <returns></returns> public static Polynomial Parse(FiniteField F, string s, bool trimZeros) { FiniteFieldElement[] list = new FiniteFieldElement[0]; if (F.Characteristic > 7) { string[] slist = s.Split('.', ',', ';', '_', '-', ' '); for (int i = 0; i < slist.Length; i++) { FiniteFieldElement f = new FiniteFieldElement(); f.Field = F; f.Value = int.Parse(slist[i].ToString()) % F.Characteristic; Array.Resize(ref list, list.Length + 1); list[list.Length - 1] = f; } } else { for (int i = 0; i < s.Length; i++) { FiniteFieldElement f = new FiniteFieldElement(); f.Field = F; f.Value = int.Parse(s[i].ToString()) % F.Characteristic; Array.Resize(ref list, list.Length + 1); list[list.Length - 1] = f; } } // Trim 0s if (trimZeros) { int listlen = list.Length; for (int i = 0; i < listlen - 1; i++) { if (list[listlen - i - 1].Value == 0) Array.Resize(ref list, list.Length - 1); else break; } } return new Polynomial(list); }