/// <summary> /// Параметры кривых полученных комплексным умножением /// </summary> /// <param name="D">Фундаментальный Дискриминант</param> /// <returns></returns> private List <BigInteger[]> GetCurveComplexMultiply(int D) { List <BigInteger[]> paramCurve = new List <BigInteger[]>(); BigInteger g = GetNonQuadr(); if (D == -3) { for (int i = 0; i < 6; i++) { paramCurve.Add(new BigInteger[] { 0, -BigInteger.ModPow(g, i, Number) }); } return(paramCurve); } else if (D == -4) { for (int i = 0; i < 4; i++) { paramCurve.Add(new BigInteger[] { -BigInteger.ModPow(g, i, Number), 0 }); } return(paramCurve); } else { Polynom GilbPolFp; if (GilbertPolynoms.ContainsKey(D)) { ComplexPolynom GilbPol; GilbertPolynoms.TryGetValue(D, out GilbPol); GilbPolFp = GilbPol.GetPolynomReal(Number); } else { ComplexPolynom GilbPol = Extension.GilbertPolynom(D); GilbertPolynoms.Add(D, GilbPol); GilbPolFp = GilbPol.GetPolynomReal(Number); } //--------------------------------------------------------------- //-----------------Получение корня полинома---------------------- BigInteger root; if (GilbPolFp.Degree <= 2) { var roots = GilbPolFp.GetRoots(); if (roots.Count != 0) { root = roots[0]; } else { return(null); } } else { #region Поиск нод //var nod = Polynom.GreatCommonDivisor(GilbPolFp, Polynom.Derivative(GilbPolFp)); //if(nod.Degree!=0 && nod.Degree<3) //{ // var roots = nod.GetRoots(); // if (roots.Count != 0) // root = roots[0]; // else // { // return null; // } //} //else //{ // using (StreamWriter sw = new StreamWriter(new FileStream("polynom.txt", FileMode.Append))) // { // sw.WriteLine("//------------------------------------------------------------------------"); // sw.WriteLine(Number); // sw.WriteLine("D = " + D); // sw.WriteLine(GilbPolFp + " mod " + Number); // sw.WriteLine("//------------------------------------------------------------------------"); // sw.Close(); // } // return null; //} #endregion return(null); } //--------------------------------------------------------------- //------------------Получение параметров------------------------- BigInteger c = root * Extension.Inverse(root - 1728, Number); c = BigInteger.Remainder(c, Number); BigInteger r = BigInteger.Remainder(3 * BigInteger.Negate(c), Number); BigInteger s = BigInteger.Remainder(2 * c, Number); //--------------------------------------------------------------- paramCurve.Add(new BigInteger[] { r, s }); paramCurve.Add(new BigInteger[] { BigInteger.Remainder(r * BigInteger.ModPow(g, 2, Number), Number), BigInteger.Remainder(s * BigInteger.ModPow(g, 3, Number), Number) }); return(paramCurve); //--------------------------------------------------------------- } }