/// <summary> /// Multiple a and b by convolution /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static Polynom MulByConvolution(Polynom a, Polynom b) { Polynom ret = new Polynom(); for (int i = 0; i < a.Count + b.Count - 1; i++) //i index of ret { Complex c = 0; for (int ii = 0; ii <= i; ii++) { if (ii >= a.Count) { continue; } if ((i - ii) >= b.Count) { continue; } c += a[ii] * b[i - ii]; } ret.Add(c); } ret.Trim(); return(ret); }
public static bool AreAlmostEquival(Polynom p, Polynom q, bool output = false) { p = p.Clone(); q = q.Clone(); p.Trim(); q.Trim(); if (p.Count != q.Count) { if (output) { Console.WriteLine("p.Count: {0},\nq.Count: {1}\n", p.Count, q.Count); } return(false); } for (int i = 0; i < p.Count; i++) { if (!ComplexUtils.IsAlmostEqual(p[i], q[i])) { if (output) { Console.WriteLine("p[i]: {0},\nq[i]: {1},\ni: {2}\n", p[i], q[i], i); } return(false); } } return(true); }
/// <summary> /// Return multiplication of two polynoms using nonrecursive FFT /// </summary> /// <param name="p">First polynom</param> /// <param name="q">Second polynom</param> /// <returns>p * q</returns> public static Polynom operator *(Polynom p, Polynom q) { p = p.Clone(); q = q.Clone(); p.Trim(); q.Trim(); //set rank of mul int count = p.Count + q.Count - 1; if (p.Count == 0 || q.Count == 0) { throw new ArgumentException("Polynom must have at least one member."); } // So FFT returns polynom with bigger rank while (p.Count < count) { p.Add(0); p = p.ComplementWithNulls(); } while (q.Count < count) { q.Add(0); q = q.ComplementWithNulls(); } // Nonrecursive FFT Polynom p_vals = FFT.NonrecursiveFFT(p); Polynom q_vals = FFT.NonrecursiveFFT(q); Polynom r_vals = new Polynom(count).ComplementWithNulls(); count = r_vals.Count; for (int i = 0; i < count; i++) { Complex a = p_vals[i]; Complex b = q_vals[i]; r_vals[i] = a * b; } Polynom ret = FFT.NonrecursiveFFT(r_vals, true) / count; ret.Trim(); return(ret); }