public Form3(int n, int d, BinaryString polynomial, Form2 prev_form) { InitializeComponent(); //Создаем поле Галуа galois_field_ = new GF2(polynomial.degree, polynomial); n_ = n; d_ = d; prev_form_ = prev_form; radio_button_ = new List <RadioButton>(); primitive_elems_ = new List <BinaryString>(); }
private void Form2_Load(object sender, EventArgs e) { Label text = new Label(); text.Text = $"Выберите образующий многочлен для поля GF(2^{m_}):"; text.Location = new System.Drawing.Point(10, 0); text.Font = this.Font; text.Size = text.PreferredSize; this.Controls.Add(text); if (polynomials_ == null || polynomials_.ElementAt(0).degree != m_) { polynomials_ = GF2.generatePolynomialsOfDegree(m_); } radio_button_ = new List <RadioButton>(); for (int i = 0; i < polynomials_.Count; ++i) { RadioButton new_button = new RadioButton(); new_button.Text = polynomials_.ElementAt(i).transformToPolynomial(); new_button.Size = new_button.PreferredSize; new_button.AutoSize = true; radio_button_.Add(new_button); } radio_button_.ElementAt(0).Location = new System.Drawing.Point(50, 10); panel.Controls.Add(radio_button_.ElementAt(0)); for (int i = 1; i < radio_button_.Count; ++i) { if (i > 1087) { break; } radio_button_.ElementAt(i).Location = new System.Drawing.Point(50, radio_button_.ElementAt(i - 1).Location.Y + 30); panel.Controls.Add(radio_button_.ElementAt(i)); } }
public BCHCode(int n, int m, int d, BinaryString alpha, BinaryString polynomial, Form3 previous_form) { text_ = "Построим код БЧХ для следующих параметров: n = " + n + ", d = " + d; d_ = d; n_ = n; alpha_ = alpha; galois_field_ = new GF2(m, polynomial); previous_form_ = previous_form; int s = (int)(Math.Pow(2, m) - 1) / n; text_ += ", α = " + alpha.transformToPolynomial() + ", P(x) = " + galois_field_.polynomial.transformToPolynomial(); text_ += "\n\nНаходим минимальное число m, такое, что n | 2^m - 1. m = " + m; text_ += "\n\nНаходим s по формуле: s = ((2^m) - 1)/n, s = " + s; //Формируем элементы β, β^2,...,β^(d-1) BinaryString[] beta = new BinaryString[d_ - 1]; beta[0] = galois_field_.Pow(alpha, s); text_ += "\n\nНаходим β по формуле: β = α^s, β = " + beta[0].transformToPolynomial(); text_ += "\nВычисляем β^2,...,β^(d-1): "; for (int i = 1; i < d_ - 1; ++i) { beta[i] = beta[i - 1] * beta[0]; if (i != 1) { text_ += ", "; } text_ += "\nβ^" + (i + 1) + " = (" + beta[0].transformToPolynomial() + ")*(" + beta[i - 1].transformToPolynomial() + ") = " + beta[i].transformToPolynomial(); if (beta[i].ToString() != (beta[i] % galois_field_.polynomial).ToString()) { text_ += " = " + (beta[i] % galois_field_.polynomial).transformToPolynomial(); } beta[i] %= galois_field_.polynomial; } //Разбиваем β, β^2,...,β^(d-1) на цикломатические классы List <List <BinaryString> > cyclomatic_classes = new List <List <BinaryString> >(); cyclomatic_classes.Add(new List <BinaryString>()); cyclomatic_classes.ElementAt(0).Add(beta[0]); for (int i = 1; i < d - 1; ++i) { int j; for (j = 0; j < i; ++j) //Выясняем, входит ли beta[i] в к-л существующий цикл.класс { if (inSameCyclClass(i + 1, j + 1, (int)(Math.Pow(2, m) - 1) / s)) { for (int k = 0; k < cyclomatic_classes.Count; ++k) //Ищем нужный цикл. класс { if (cyclomatic_classes.ElementAt(k).Contains(beta[j])) { cyclomatic_classes.ElementAt(k).Add(beta[i]); } } break; } } if (j == i) //если цикл. класс не найден { //cоздаем новый cyclomatic_classes.Add(new List <BinaryString>()); cyclomatic_classes.ElementAt(cyclomatic_classes.Count - 1).Add(beta[i]); } } text_ += "\n\nРазбиваем элементы β, β^2,...,β^(d-1) на цикломатические классы:"; for (int cycl_class = 0; cycl_class < cyclomatic_classes.Count; ++cycl_class) { text_ += "\n" + (cycl_class + 1) + "-й цикломатический класс: "; for (int elem = 0; elem < cyclomatic_classes.ElementAt(cycl_class).Count; ++elem) { text_ += cyclomatic_classes.ElementAt(cycl_class).ElementAt(elem).transformToPolynomial(); if (elem < cyclomatic_classes.ElementAt(cycl_class).Count - 1) { text_ += ", "; } } } //Ищем минимальные полиномы, которые будем проверять List <BinaryString> polynomials_to_check = new List <BinaryString>(); for (int i = 1; i <= m; ++i) { if (m % i == 0) { List <BinaryString> temp_list = GF2.generatePolynomialsOfDegree(i); polynomials_to_check.AddRange(temp_list); } } text_ += "\n\nРаскладываем полином x^" + (Math.Pow(2, m) - 1) + " + 1 на множители:\n" + "x^" + (Math.Pow(2, m) - 1) + " + 1 = "; for (int i = 0; i < polynomials_to_check.Count; ++i) { text_ += "(" + polynomials_to_check.ElementAt(i).transformToPolynomial() + ")"; if (i < polynomials_to_check.Count - 1) { text_ += "*"; } } //Составляем образующий многочлен text_ += "\n\nСреди делителей полинома x^" + (Math.Pow(2, m) - 1) + " + 1 ищем минимальный для каждого " + "цикломатического класса:"; string main_pol_dividers = ""; code_polynomial_ = new BinaryString("1"); int cur_cycl_class = 0; for (int i = 0; i < polynomials_to_check.Count && cur_cycl_class < cyclomatic_classes.Count; ++i) { if (isRootOf(cyclomatic_classes.ElementAt(cur_cycl_class).ElementAt(0), polynomials_to_check.ElementAt(i))) { text_ += "\n\nДля " + (cur_cycl_class + 1) + "-го цикломатического класса: Р" + (i + 1) + "(x) = " + polynomials_to_check.ElementAt(i).transformToPolynomial(); text_ += "\nP" + (i + 1) + "(" + cyclomatic_classes.ElementAt(cur_cycl_class).ElementAt(0).transformToPolynomial() + ") = "; string temp_str1 = ""; string temp_str2 = " = "; for (int j = 0; j <= polynomials_to_check.ElementAt(i).degree; ++j) { if (polynomials_to_check.ElementAt(i)[j] == '1') { if (temp_str1.Length > 0) { temp_str1 += " + "; temp_str2 += " + "; } if (j == polynomials_to_check.ElementAt(i).degree) { temp_str1 += "1"; temp_str2 += "1"; } else { temp_str1 += "(" + cyclomatic_classes.ElementAt(cur_cycl_class).ElementAt(0).transformToPolynomial() + ")^" + (polynomials_to_check.ElementAt(i).degree - j); temp_str2 += (galois_field_.Pow(cyclomatic_classes.ElementAt(cur_cycl_class).ElementAt(0), polynomials_to_check.ElementAt(i).degree - j) % galois_field_.polynomial).transformToPolynomial(); } } } text_ += temp_str1 + temp_str2 + " = 0"; if (main_pol_dividers.Length > 0) { main_pol_dividers += " * "; } main_pol_dividers += "(" + polynomials_to_check.ElementAt(i).transformToPolynomial() + ")"; code_polynomial_ *= polynomials_to_check.ElementAt(i); cur_cycl_class++; i = -1; } } text_ += "\n\nНаходим образующий многочлен для кода:\n"; if (main_pol_dividers.Contains('*')) { text_ += "F(x) = " + main_pol_dividers + " = " + code_polynomial_.transformToPolynomial() + "\n\n"; } else { text_ += "F(x) = " + code_polynomial_.transformToPolynomial() + "\n\n"; } //Устанавливаем параметр k k = n - code_polynomial_.degree; }