Таблица степеней для полинома - C# (185996)

Узнай цену своей работы

Формулировка задачи:

Как написать таблицу степеней для полинома, чтобы при возведение в степень результат брался по модулю, если его степень больше необходимой. например, наш неприводимый многочлен x^5+x^2+1. строим таблицу x=x,x^2=x^2,x^4=x^4 а при x^8=x^3+x^2+1(x^8 поделили на неприводимый многочлен так как степень больше 5)

Решение задачи: «Таблица степеней для полинома»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication207
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Polynom p1 = "x16";
            Polynom p2 = "x5 + x2 + 1";
 
            var res = p1 % p2;//получаем остаток от деления
 
            Console.WriteLine(res);// x^4 + x^3 + x + 1
            //
            Console.ReadLine();
        }
    }
 
    /// <summary>
    /// Полином
    /// </summary>
    class Polynom : HashSet<int>//полином это множество степеней
    {
        public Polynom Clone()
        {
            var res = new Polynom();
            foreach (var elem in this)
                res.Add(elem);
            return res;
        }
 
        public Polynom()
        {
        }
 
        public Polynom(params int[] powers) : base(powers)
        {
        }
 
        /// <summary>
        /// Максимальная степень
        /// </summary>
        public int MaxPower
        {
            get { return Count == 0 ? -1 : this.Max(); }
        }
 
        /// <summary>
        /// Парсим строку в полином
        /// </summary>
        public static Polynom Parse(string str)
        {
            var res = new Polynom();
            foreach(var part in str.ToLower().Replace(" ", "").Trim().Split('+'))
            {
                if (part == "1") res.Add(0);
                else
                if (part == "x") res.Add(1);
                else
                if (part.StartsWith("x^")) res.Add(int.Parse(part.Substring(2)));
                else
                if (part.StartsWith("x")) res.Add(int.Parse(part.Substring(1)));
                else
                    throw new Exception("Syntax error");
            }
 
            return res;
        }
 
        /// <summary>
        /// Оператор вычитания
        /// </summary>
        public static Polynom operator -(Polynom p1, Polynom p2)
        {
            var res = new Polynom();
 
            foreach (var elem in p1)
            if(!p2.Contains(elem))
                res.Add(elem);
 
            foreach (var elem in p2)
            if (!p1.Contains(elem))
                res.Add(elem);
 
            return res;
        }
 
        /// <summary>
        /// Оператор умножения
        /// </summary>
        public static Polynom operator *(Polynom p1, Polynom p2)
        {
            var res = new Polynom();
 
            foreach (var elem in p1)
            foreach (var elem2 in p2)
                res.Add(elem + elem2);//степени складываются
 
            return res;
        }
 
        /// <summary>
        /// Остаток от деления
        /// </summary>
        public static Polynom operator %(Polynom dividend, Polynom divisor)
        {
            var res = dividend.Clone();
 
            while (res.MaxPower >= divisor.MaxPower)
            {
                var m = res.MaxPower - divisor.MaxPower;//на какую степень нужно умножить делитель?
                var mm = divisor * new Polynom(m);//умножаем
                res -= mm;//отнимаем
            }
 
            return res;
        }
 
        /// <summary>
        /// Неявное преобразование из строки
        /// </summary>
        public static implicit operator Polynom(string str)
        {
            return Parse(str);
        }
 
        public override string ToString()
        {
            return string.Join(" + ", this.OrderBy(e => -e).Select(x=>x==0?"1":x==1?"x":("x^" + x)));
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы