예제 #1
0
        /// <summary>
        /// Гильбертов многочлен, число классов и множество привиденных форм (a,b,c) дискриминанта D
        /// </summary>
        /// <param name="D"></param>
        /// <returns></returns>
        public static ComplexPolynom GilbertPolynom(int D)
        {
            //-----Инициализация------------------------------------------

            ComplexPolynom T = new ComplexPolynom(new List <ComplexMonom> {
                new ComplexMonom(0, 1)
            });
            int b = D & 0x01;                                    // D mod 2
            int k = (int)Math.Sqrt(Math.Abs(D) / 3);
            int h = 0;                                           // счетчик классов
            List <BigInteger[]> red = new List <BigInteger[]>(); // Множество примитивных приведенных форм (a,b,c)

            //----------Основной Цикл по b---------------------------------------

            while (b <= k)
            {
                int t = (b * b - D);
                if ((t & 0x03) != 0)
                {
                    b++;
                    continue;
                }
                int m = (b * b - D) / 4;
                for (int a = 1; a *a <= m; a++)
                {
                    if (m % a != 0)
                    {
                        continue;
                    }
                    int c = m / a;
                    if (b > a)
                    {
                        continue;
                    }

                    //---------Установки для многочлена-------------------------
                    Complex r = new Complex(-b, Math.Sqrt(Math.Abs(D)));
                    r /= 2 * a;
                    Complex delt1 = Delta(Complex.Exp(4 * Math.PI * r * Complex.ImaginaryOne), 5000);
                    Complex delt2 = Delta(Complex.Exp(2 * Math.PI * r * Complex.ImaginaryOne), 5000);
                    var     f     = delt1 / delt2;
                    var     j     = Complex.Pow(256 * f + 1, 3);
                    j /= f;

                    //----------------------------------
                    if (b == a || c == a || b == 0)
                    {
                        T = ComplexPolynom.MultiplyPol(T, j, "line");
                        h++;
                        red.Add(new BigInteger[] { a, b, c });
                    }
                    else
                    {
                        T  = ComplexPolynom.MultiplyPol(T, j, "quadr");
                        h += 2;
                        red.Add(new BigInteger[] { a, b, c });
                        red.Add(new BigInteger[] { a, -b, c });
                    }
                }
                b++;
            }
            return(T);
        }