def normal_denom(fa, fd, ga, gd, DE):
    dn, ds = splitfactor(fd, DE)
    en, es = splitfactor(gd, DE)

    p = dn.gcd(en)
    h = en.gcd(en.diff(DE.t)).quo(p.gcd(p.diff(DE.t)))

    a = dn*h
    c = a*h
    if c.div(en)[1]:
        # en does not divide dn*h**2
        raise NonElementaryIntegralException
    ca = c*ga
    ca, cd = ca.cancel(gd, include=True)

    ba = a*fa - dn*derivation(h, DE)*fd
    ba, bd = ba.cancel(fd, include=True)

    # (dn*h, dn*h*f - dn*Dh, dn*h**2*g, h)
    return (a, (ba, bd), (ca, cd), h)
Test database saving (and reload).
dataset/ETHPy150Open sympy/sympy/sympy/integrals/rde.py/normal_denom--crossover with--dataset/ETHPy150Open GeoscienceAustralia/agdc/tests/test_dbutil.py/TestServer.test_save