human
Complete the below
def hypsum(expr, n, start, prec):

    ''''Sum a rapidly convergent infinite hypergeometric series with
    given general term, e.g. e = hypsum(1/factorial(n), n). The
    quotient between successive terms must be a quotient of integer
    polynomials.'
    '''
 What is a the Python code you requested?
assistant
#Here is the Python code you requested.
    from sympy import Float, hypersimp, lambdify
    if (prec == float('inf')):
        raise NotImplementedError('does    not    support    inf    prec')
    if start:
        expr = expr.subs(n, (n + start))
    hs = hypersimp(expr, n)
    if (hs is None):
        raise NotImplementedError('a    hypergeometric    series    is    required')
    (num, den) = hs.as_numer_denom()
    func1 = lambdify(n, num)
    func2 = lambdify(n, den)
    (h, g, p) = check_convergence(num, den, n)
    if (h < 0):
        raise ValueError(('Sum    diverges    like    (n!)^%i' % (- h)))
    term = expr.subs(n, 0)
    if (not term.is_Rational):
        raise NotImplementedError('Non    rational    term    functionality    is    not    implemented.')
    if ((h > 0) or ((h == 0) and (abs(g) > 1))):
        term = ((MPZ(term.p) << prec) // term.q)
        s = term
        k = 1
        while (abs(term) > 5):
            term *= MPZ(func1((k - 1)))
            term //= MPZ(func2((k - 1)))
            s += term
            k += 1
        return from_man_exp(s, (- prec))
    else:
        alt = (g < 0)
        if (abs(g) < 1):
            raise ValueError(('Sum    diverges    like    (%i)^n' % abs((1 / g))))
        if ((p < 1) or ((p == 1) and (not alt))):
            raise ValueError(('Sum    diverges    like    n^%i' % (- p)))
        vold = None
        ndig = prec_to_dps(prec)
        while True:
            prec2 = (4 * prec)
            term0 = ((MPZ(term.p) << prec2) // term.q)
            def summand(k, _term=[term0]):
                if k:
                    k = int(k)
                    _term[0] *= MPZ(func1((k - 1)))
                    _term[0] //= MPZ(func2((k - 1)))
                return make_mpf(from_man_exp(_term[0], (- prec2)))
            with workprec(prec):
                v = nsum(summand, [0, mpmath_inf], method='richardson')
            vf = Float(v, ndig)
            if ((vold is not None) and (vold == vf)):
                break
            prec += prec
            vold = vf
        return v._mpf_