Ejemplo n.º 1
0
        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>();
        }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
        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;
        }