import arith, math


def conj(p,k):
    """
    Returns the conjectural valuation at p of the
    index of the Hecke algebra T_k(Gamma_0(p)) in
    its normalization.

    INPUTS:
       p -- a prime integer
       k -- an even integer >= 2.

    OUTPUT:
       an integer
    """
    assert isinstance(p,int), "Argument 1 must be an int."
    assert isinstance(k,int), "Argument 1 must be an int."
    assert arith.is_prime(p), "Argument 1 must be prime."
    assert k%2==0, "Argument 2 must be even."
    
    return int(math.floor(p/12)*arith.binom(k/2,2) + a(p,k))

def a(p,k):
    """
    Function a(p,k) involved in the conjectural formula
    returned by the conj function.

    INPUTS:
       p -- a prime integer
       k -- an even integer >= 2.

    OUTPUT:
       an integer
    """
    assert isinstance(p,int), "Argument 1 must be an int."
    assert isinstance(k,int), "Argument 1 must be an int."
    assert arith.is_prime(p), "Argument 1 must be prime."
    
    pmod = p % 12
    if pmod==1:
        return 0
    elif pmod==5:
        return 3*arith.binom(int(math.ceil(k/6.0)),2)
    elif pmod==7:
        return 2*arith.binom(int(math.ceil(k/4.0)),2)
    else:
        return a(5,k) + a(7,k)
    
