示例#1
0
        /// <summary>
        /// Умножение двух многочленов методом Фурье
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public cpolinom mul_FFT(cpolinom p)
        {
            int N = lengthFFT(Count + p.Count);
            Complex[] a = new Complex[N];
            Complex[] b = new Complex[N];

            //заполним массивы Complex коеффициентами полиномов
            for (int i = 0; i < N; i++)
            {
                a[i] = this[i];
                b[i] = p[i];
            }

            //преобразуем коеффициенты по FFT
            a = FFT.fft(a);
            b = FFT.fft(b);

            //умножим полученные коеффициенты
            for (int i = 0; i < N; i++)
                a[i] *= b[i];

            //проведем обратное преобразование фурье
            a = FFT.ifft(a);

            //создадим полином с новыми коеффициентами
            cpolinom res = new cpolinom(N - 1, mod);
            for (int i = 0; i < N; i++)
            {
                //округлим значения до ближайшего
                try
                {
                    int k = (int)Math.Round(a[i].Real);
                    res[i] = k % mod;
                }
                catch (ArgumentOutOfRangeException e) { }
            }

            //пересчитаем степень полинома
            res.CheckPolinomCount(Zeros(this, p));

            return res;
        }