Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Actually I found it much more efficient to use a direct computation in the class group. All my attempts to interact with GAP were quite slow.

def get_bqf(D,p):
    d = fundamental_discriminant(D)
    v = isqrt(D//d)
    if v % p == 0:
        return None
    ks = kronecker_symbol(D,p)
    if ks == -1:
        return None
    c= floor(-D/(4*p))
    while True:
        c += 1
        b2 = D+4*p*c
        if isqrt(b2)**2 == b2:
            b = isqrt(b2)
            return  BinaryQF([p,b,c])
    return None

def get_prime_forms(D):
    P = Primes()
    p = 2
    B = isqrt(abs(D)/3)
    gens = []
    while p < B:
        bq = get_bqf(D,p)
        if  bq is not None :
            gens.append(bq)
        p = P.next(p)
    return gens

# p.16 of https://arxiv.org/pdf/0903.2785

def TableInsert(T,g):
    T.append(g.reduced_form())
    return None

def TableLookup(T,beta):
    b = beta.reduced_form()
    if b in T:
        return T.index(b)
    else:
        return None

def poly_rep(gens):
    G = (gens[0].form_class()).parent()
    n = len(gens)
    T = []
    r = []
    s = []
    TableInsert(T,G.zero().form())
    for i in range(1,n+1):
        beta = gens[i-1].reduced_form()
        ri = 1
        N = len(T)
        si = TableLookup(T,beta)
        while si == None:
            for j in range(N):
                TableInsert(T,beta*T[j])
            beta = beta*gens[i-1]
            si = TableLookup(T,beta)
            ri += 1
        r.append(ri)
        s.append(si)
    return T,r,s

D = -5291
gens = get_prime_forms(D)  
T,r,s=poly_rep(gens)

This does not include improvements from p.17 of Computing Hilbert Class Polynomials With Chinese Remainder Theorem from Andrew Sutherland.