Exemplo n.º 1
0
        public static BinaryString operator %(BinaryString bin_str1, BinaryString bin_str2)
        {
            if (bin_str1.cutUnsignificantZeros().size() < bin_str2.cutUnsignificantZeros().size())
            {
                return(bin_str1);
            }

            BinaryString dividend = bin_str1.cutUnsignificantZeros(); //Делимое
            BinaryString divider  = bin_str2.cutUnsignificantZeros(); //Делитель

            while (dividend.size() >= divider.size())
            {
                //Выделяем часть делимого, равную по размеру делителю
                string temp_str = dividend.ToString().Substring(0, divider.size());
                //То, что останется после сложения делителя и части делимого в виде строки
                string new_dividend = (new BinaryString(temp_str) + divider).cutUnsignificantZeros().ToString();
                if (dividend.size() > divider.size()) //Присоединяем оставшийся кусок делимого
                {
                    new_dividend += dividend.ToString().Substring(divider.size(), dividend.size() - divider.size());
                }
                dividend = new BinaryString(new_dividend);
                dividend = dividend.cutUnsignificantZeros();
            }

            if (dividend.size() == 0)
            {
                dividend = new BinaryString("0");
            }

            return(dividend);
        }
Exemplo n.º 2
0
        public GF2(int degree, BinaryString polynomial)
        {
            polynomial = polynomial.cutUnsignificantZeros();
            //Проверка на соответствие degree степени полинома polinomial
            if (degree != polynomial.size() - 1)
            {
                MessageBox.Show("Степень образующего многочлена не соответствует степени поля Галуа.");
                Application.Exit();
            }

            degree_     = degree;
            elements_   = new BinaryString[(int)Math.Pow(2, degree_)];
            polynomial_ = polynomial;

            //Формируем нулевой элемент
            string temp_str = "";

            for (int i = 0; i < degree_; ++i)
            {
                temp_str += "0";
            }
            elements_[0] = new BinaryString(temp_str);

            //Формируем ненулевые элементы поля
            for (int i = 1; i < elements_.Length; ++i)
            {
                elements_[i] = elements_[i - 1];
                ++elements_[i];
            }
        }
Exemplo n.º 3
0
        public bool isPrimitive(BinaryString element)
        {
            if (element.cutUnsignificantZeros().ToString() == "1" || element.cutUnsignificantZeros().ToString() == "0")
            {
                return(false);
            }

            BinaryString el = element % polynomial_;

            for (int i = 1; i < (int)Math.Pow(2, degree_) - 1; ++i)
            {
                if (el.cutUnsignificantZeros().ToString() == "1")
                {
                    return(false);
                }
                el *= element;
                el %= polynomial_;
            }

            return(true);
        }
Exemplo n.º 4
0
        public bool isRootOf(BinaryString root, BinaryString equation)
        {
            BinaryString result = new BinaryString("0");

            for (int i = 0; i <= equation.degree; ++i)
            {
                if (equation[equation.degree - i] == '1')
                {
                    result += galois_field_.Pow(root, i);
                }
            }

            if (result.cutUnsignificantZeros().ToString() == "0")
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }