def _RG(x, y, z=None): '''Symmetric integral of the second kind C{_RG}. @return: C{_RG(x, y, z)}. @see: U{C{_RG} definition<https://DLMF.NIST.gov/19.16.E3>} and in Carlson, eq. 1.5. ''' if z is None: # Carlson, eqs 2.36 - 2.39 a, b = sqrt(x), sqrt(y) if a < b: a, b = b, a S = Fsum(0.25 * (a + b)**2) m = -0.25 # note, negative while abs(a - b) > (_tolRG0 * a): # max 4 trips b, a = sqrt(a * b), (a + b) * 0.5 m *= 2 S.fadd_(m * (a - b)**2) return S.fsum() * PI_2 / (a + b) if not z: y, z = z, y # Carlson, eq 1.7 return fsum_( _RF(x, y, z) * z, _RD_3(x, y, z) * (x - z) * (z - y), sqrt(x * y / z)) * 0.5
def _RD(x, y, z): '''Degenerate symmetric integral of the third kind C{_RD}. @return: C{_RD(x, y, z) = _RJ(x, y, z, z)}. @see: U{C{_RD} definition<https://DLMF.NIST.gov/19.16.E5>}. ''' # Carlson, eqs 2.28 - 2.34 m = 1.0 S = Fsum() A = fsum_(x, y, z, z, z) * 0.2 T = [A, x, y, z] Q = _Q(A, T, _tolRD) for _ in range(_TRIPS): if Q < abs(m * T[0]): # max 7 trips break t = T[3] # z0 r, s, T = _rsT(T) S.fadd_(1.0 / (m * s[2] * (t + r))) m *= 4 else: raise EllipticError('no %s convergence' % ('RD', )) S *= 3 m *= T[0] # An x = (x - A) / m y = (y - A) / m z = (x + y) / 3.0 z2 = z**2 xy = x * y return _Hf(S.fsum(), m * sqrt(T[0]), xy - 6 * z2, (xy * 3 - 8 * z2) * z, (xy - z2) * 3 * z2, xy * z2 * z)
def _RJ(x, y, z, p): '''Symmetric integral of the third kind C{_RJ}. @return: C{_RJ(x, y, z, p)}. @see: U{C{_RJ} definition<https://DLMF.NIST.gov/19.16.E2>}. ''' def _xyzp(x, y, z, p): return (x + p) * (y + p) * (z + p) # Carlson, eqs 2.17 - 2.25 m = m3 = 1.0 S = Fsum() D = -_xyzp(x, y, z, -p) A = fsum_(x, y, z, 2 * p) * 0.2 T = [A, x, y, z, p] Q = _Q(A, T, _tolRD) for _ in range(_TRIPS): if Q < abs(m * T[0]): # max 7 trips break _, s, T = _rsT(T) d = _xyzp(*s) e = D / (m3 * d**2) S.fadd_(_RC(1, 1 + e) / (m * d)) m *= 4 m3 *= 64 else: raise EllipticError('no %s convergence' % ('RJ', )) S *= 6 m *= T[0] # An x = (A - x) / m y = (A - y) / m z = (A - z) / m xyz = x * y * z p = -(x + y + z) * 0.5 p2 = p**2 e2 = fsum_(x * y, x * z, y * z, -3 * p2) return _Hf(S.fsum(), m * sqrt(T[0]), e2, fsum_(xyz, 2 * p * e2, 4 * p * p2), fsum_(xyz * 2, p * e2, 3 * p * p2) * p, p2 * xyz)