public static Polinomio operator -(Polinomio n, Polinomio d)
        {
            BigInteger[] coeff = d.Coefficienti.ToList().Select(c => - c).ToArray();
            Polinomio    p     = new Polinomio(coeff);

            return(n + p);
        }
        public static Polinomio operator *(Polinomio n, Polinomio d)
        {
            Polinomio risultato = new Polinomio(n.Grado + d.Grado);

            for (int i = n.Grado; i >= 0; i--)
            {
                for (int j = d.Grado; j >= 0; j--)
                {
                    risultato[i + j] += n[i] * d[j];
                }
            }

            return(risultato);
        }
        public static Polinomio operator %(Polinomio n, Polinomio d)
        {
            Polinomio risultato = new Polinomio(n.Grado - d.Grado);
            Polinomio a         = new Polinomio(n.Coefficienti);
            Polinomio m         = null;

            for (int i = risultato.Grado; i >= 0; i--)
            {
                risultato[i] = a[a.Grado] / d[d.Grado];
                Polinomio temp = new Polinomio(i);
                temp[i] = risultato[i];
                m       = d * temp;
                a       = a - m;
            }

            return(a);
        }
        public static Polinomio operator +(Polinomio n, Polinomio d)
        {
            Polinomio max = null;
            Polinomio min = null;

            if (n.Grado > d.Grado)
            {
                max = new Polinomio(n.Coefficienti);
                min = new Polinomio(d.Coefficienti);
            }
            else
            {
                max = new Polinomio(d.Coefficienti);
                min = new Polinomio(n.Coefficienti);
            }

            List <BigInteger> coeff = Enumerable.Repeat <BigInteger>(0, max.Grado - min.Grado).ToList();

            coeff.AddRange(min.Coefficienti.ToList());

            BigInteger[] coeffRisultato = coeff.Zip(max.Coefficienti, (a, b) => a + b).ToArray();

            return(new Polinomio(coeffRisultato));
        }