Path: blob/master/src/sage/databases/db_class_polynomials.py
8814 views
"""1Database of Hilbert Polynomials2"""34#######################################################################56# Sage: System for Algebra and Geometry Experimentation7#8# Copyright (C) 2006 David Kohel <[email protected]>9#10# Distributed under the terms of the GNU General Public License (GPL)11#12# The full text of the GPL is available at:13#14# http://www.gnu.org/licenses/15#######################################################################161718import bz2, os19import sage.misc.misc20from sage.rings.integer_ring import IntegerRing21from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing2223dblocation = os.path.join(sage.misc.misc.SAGE_SHARE,'kohel')2425disc_length = 726level_length = 32728def _dbz_to_integers(name):29file = '%s/%s'%(dblocation, name)30if not os.path.exists(file):31raise RuntimeError("Class polynomial database file %s not available"%file)32data = bz2.decompress(open(file).read())33data = "[" + data.replace("\n",",") + "]"34return eval(data)3536def _pad_int_str(s,n):37return "0"*(n-len(str(s))) + str(s)3839class ClassPolynomialDatabase:40def _dbpath(self,disc,level=1):41"""42TESTS:43sage: db = HilbertClassPolynomialDatabase()44sage: db.__getitem__(-23,level=2)45Traceback (most recent call last):46...47NotImplementedError: Level (= 2) > 1 not yet implemented.48"""49if level != 1:50raise NotImplementedError("Level (= %s) > 1 not yet implemented."%level)51n1 = 5000*((abs(disc)-1)//5000)52s1 = _pad_int_str(n1+1,disc_length)53s2 = _pad_int_str(n1+5000,disc_length)54subdir = "%s-%s"%(s1,s2)55discstr = _pad_int_str(abs(disc),disc_length)56return "PolHeeg/%s/%s/pol.%s.dbz"%(self.model,subdir,discstr)5758def __getitem__(self,disc,level=1,var='x'):59classpol = self._dbpath(disc,level)60try:61coeff_list = _dbz_to_integers(classpol)62except RuntimeError as msg:63print(msg)64raise RuntimeError("No database entry for class polynomial of discriminant %s"%disc)65P = PolynomialRing(IntegerRing(),names=var)66return P(list(coeff_list))6768class HilbertClassPolynomialDatabase(ClassPolynomialDatabase):69"""70The database of Hilbert class polynomials.7172EXAMPLES::7374sage: db = HilbertClassPolynomialDatabase()75sage: db[-4] # optional - database_kohel76x - 172877sage: db[-7] # optional78x + 337579sage: f = db[-23]; f # optional80x^3 + 3491750*x^2 - 5151296875*x + 1277188085937581sage: f.discriminant().factor() # optional82-1 * 5^18 * 7^12 * 11^4 * 17^2 * 19^2 * 2383sage: db[-23] # optional84x^3 + 3491750*x^2 - 5151296875*x + 1277188085937585"""86def __init__(self):87"""88Initialize the database.89"""90self.model = "Cls"9192def __repr__(self):93return "Hilbert class polynomial database"9495######################################################96# None of the following are implemented yet.97######################################################9899class AtkinClassPolynomialDatabase(ClassPolynomialDatabase):100"""101The database of Atkin class polynomials.102"""103def __repr__(self):104return "Atkin class polynomial database"105106class WeberClassPolynomialDatabase(ClassPolynomialDatabase):107"""108The database of Weber class polynomials.109"""110def __repr__(self):111return "Weber class polynomial database"112113class DedekindEtaClassPolynomialDatabase(ClassPolynomialDatabase):114"""115The database of Dedekind eta class polynomials.116"""117def __repr__(self):118return "Dedekind eta class polynomial database"119120121122