private Polynom MultiplyAlphaPolynoms(Polynom polynomBase, Polynom polynomMultiplier)
        {
            var resultPolynom = new Polynom();

            foreach (var polItemBase in polynomMultiplier.PolyItems)
            {
                foreach (var polItemMulti in polynomBase.PolyItems)
                {
                    var polItemRes = new PolynomItem();
                    polItemRes.Coefficient = ShrinkAlphaExp(polItemBase.Coefficient + polItemMulti.Coefficient);
                    polItemRes.Exponent    = (polItemBase.Exponent + polItemMulti.Exponent);
                    resultPolynom.PolyItems.Add(polItemRes);
                }
            }
            var exponentsToGlue = resultPolynom.PolyItems.GroupBy(x => x.Exponent).Where(x => x.Count() > 1).Select(x => x.First().Exponent);
            var gluedPolynoms   = new List <PolynomItem>();

            foreach (var exponent in exponentsToGlue)
            {
                var polynomFixed = new PolynomItem();
                polynomFixed.Exponent = exponent;
                var coefficient = 0;
                foreach (var polynomOld in resultPolynom.PolyItems.Where(x => x.Exponent == exponent))
                {
                    coefficient ^= GetIntValFromAlphaExp(polynomOld.Coefficient);
                }
                polynomFixed.Coefficient = GetAlphaExpFromIntVal(coefficient);
                gluedPolynoms.Add(polynomFixed);
            }
            resultPolynom.PolyItems.RemoveAll(x => exponentsToGlue.Contains(x.Exponent));
            resultPolynom.PolyItems.AddRange(gluedPolynoms);
            resultPolynom.PolyItems = resultPolynom.PolyItems.OrderByDescending(x => x.Exponent).ToList();
            return(resultPolynom);
        }
        private Polynom XORPolynoms(Polynom messagePolynom, Polynom resPolynom)
        {
            var     resultPolynom = new Polynom();
            Polynom longPoly, shortPoly;

            if (messagePolynom.PolyItems.Count >= resPolynom.PolyItems.Count)
            {
                longPoly  = messagePolynom;
                shortPoly = resPolynom;
            }
            else
            {
                longPoly  = resPolynom;
                shortPoly = messagePolynom;
            }

            for (var i = 0; i < longPoly.PolyItems.Count; i++)
            {
                var polItemRes = new PolynomItem();
                polItemRes.Coefficient = longPoly.PolyItems[i].Coefficient ^ (shortPoly.PolyItems.Count > i ? shortPoly.PolyItems[i].Coefficient : 0);
                polItemRes.Exponent    = messagePolynom.PolyItems[0].Exponent - i;
                resultPolynom.PolyItems.Add(polItemRes);
            }
            resultPolynom.PolyItems.RemoveAt(0);
            return(resultPolynom);
        }
        private Polynom MultiplyGeneratorPolynomByLeadterm(Polynom genPolynom, PolynomItem leadTerm, int lowerExponentBy)
        {
            var resultPolynom = new Polynom();

            foreach (var polItemBase in genPolynom.PolyItems)
            {
                var polItemRes = new PolynomItem();
                polItemRes.Coefficient = (polItemBase.Coefficient + leadTerm.Coefficient) % 255;
                polItemRes.Exponent    = polItemBase.Exponent - lowerExponentBy;
                resultPolynom.PolyItems.Add(polItemRes);
            }
            return(resultPolynom);
        }