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