/// <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; }