コード例 #1
0
ファイル: FFT.cs プロジェクト: tomaspavlin/Nonrecursive-FFT
        /// <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);
        }
コード例 #2
0
ファイル: FFT.cs プロジェクト: tomaspavlin/Nonrecursive-FFT
        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);
        }
コード例 #3
0
ファイル: FFT.cs プロジェクト: tomaspavlin/Nonrecursive-FFT
        /// <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);
        }