예제 #1
0
        /// <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);
                //---------------------------------------------------------------
            }
        }