@@ -50,6 +50,8 @@ function _₂F₁(a, b, c, z; method::Symbol = :general, kwds...)
50
50
end
51
51
if method == :positive
52
52
return _₂F₁positive (a, b, c, z; kwds... )
53
+ elseif method == :general2
54
+ return _₂F₁general2 (a, b, c, z; kwds... )
53
55
else # if method == :general
54
56
return _₂F₁general (a, b, c, z; kwds... ) # catch-all
55
57
end
@@ -103,55 +105,55 @@ This polyalgorithm is designed based on the review
103
105
104
106
> J. W. Pearson, S. Olver and M. A. Porter, [Numerical methods for the computation of the confluent and Gauss hypergeometric functions](https://doi.org/10.1007/s11075-016-0173-0), *Numer. Algor.*, **74**:821–866, 2017.
105
107
"""
106
- function _₂F₁general2 (a, b, c, z)
108
+ function _₂F₁general2 (a, b, c, z; kwds ... )
107
109
T = promote_type (typeof (a), typeof (b), typeof (c), typeof (z))
108
110
if z == 1
109
- return _₂F₁argument_unity (a, b, c, z)
111
+ return _₂F₁argument_unity (a, b, c, z; kwds ... )
110
112
elseif real (b) < real (a)
111
- return _₂F₁general2 (b, a, c, z)
113
+ return _₂F₁general2 (b, a, c, z; kwds ... )
112
114
elseif abs (z) ≤ ρ || - a ∈ ℕ₀ || - b ∈ ℕ₀
113
- return _₂F₁maclaurin (a, b, c, z)
115
+ return _₂F₁maclaurin (a, b, c, z; kwds ... )
114
116
elseif ! isalmostwellpoised (a, b, c)
115
- return exp ((c- a- b)* log1p (- z))* _₂F₁general2 (c- a, c- b, c, z)
117
+ return exp ((c- a- b)* log1p (- z))* _₂F₁general2 (c- a, c- b, c, z; kwds ... )
116
118
elseif abs (z / (z - 1 )) ≤ ρ && absarg (1 - z) < convert (real (T), π) # 15.8.1
117
119
w = z/ (z- 1 )
118
- return _₂F₁maclaurin (a, c- b, c, w)* exp (- a* log1p (- z))
120
+ return _₂F₁maclaurin (a, c- b, c, w; kwds ... )* exp (- a* log1p (- z))
119
121
elseif abs (inv (z)) ≤ ρ && absarg (- z) < convert (real (T), π)
120
122
w = inv (z)
121
123
if isapprox (a, b) # 15.8.8
122
- return gamma (c)/ gamma (a)/ gamma (c- a)* (- w)^ a* _₂F₁logsumalt (a, c- a, z, w)
124
+ return gamma (c)/ gamma (a)/ gamma (c- a)* (- w)^ a* _₂F₁logsumalt (a, c- a, z, w; kwds ... )
123
125
elseif a- b ∉ ℤ # 15.8.2
124
- return gamma (c)* ((- w)^ a* gamma (b- a)/ gamma (b)/ gamma (c- a)* _₂F₁maclaurin (a, a- c+ 1 , a- b+ 1 , w)+ (- w)^ b* gamma (a- b)/ gamma (a)/ gamma (c- b)* _₂F₁maclaurin (b, b- c+ 1 , b- a+ 1 , w))
126
+ return gamma (c)* ((- w)^ a* gamma (b- a)/ gamma (b)/ gamma (c- a)* _₂F₁maclaurin (a, a- c+ 1 , a- b+ 1 , w; kwds ... )+ (- w)^ b* gamma (a- b)/ gamma (a)/ gamma (c- b)* _₂F₁maclaurin (b, b- c+ 1 , b- a+ 1 , w; kwds ... ))
125
127
end # TODO : full 15.8.8
126
128
elseif abs (inv (1 - z)) ≤ ρ && absarg (- z) < convert (real (T), π)
127
129
w = inv (1 - z)
128
130
if isapprox (a, b) # 15.8.9
129
- return gamma (c)* exp (- a* log1p (- z))/ gamma (a)/ gamma (c- b)* _₂F₁logsum (a, c- a, z, w, 1 )
131
+ return gamma (c)* exp (- a* log1p (- z))/ gamma (a)/ gamma (c- b)* _₂F₁logsum (a, c- a, z, w, 1 ; kwds ... )
130
132
elseif a- b ∉ ℤ # 15.8.3
131
- return gamma (c)* (exp (- a* log1p (- z))* gamma (b- a)/ gamma (b)/ gamma (c- a)* _₂F₁maclaurin (a, c- b, a- b+ 1 , w)+ exp (- b* log1p (- z))* gamma (a- b)/ gamma (a)/ gamma (c- b)* _₂F₁maclaurin (b, c- a, b- a+ 1 , w))
133
+ return gamma (c)* (exp (- a* log1p (- z))* gamma (b- a)/ gamma (b)/ gamma (c- a)* _₂F₁maclaurin (a, c- b, a- b+ 1 , w; kwds ... )+ exp (- b* log1p (- z))* gamma (a- b)/ gamma (a)/ gamma (c- b)* _₂F₁maclaurin (b, c- a, b- a+ 1 , w; kwds ... ))
132
134
end # TODO : full 15.8.9
133
135
elseif abs (1 - z) ≤ ρ && absarg (z) < convert (real (T), π) && absarg (1 - z) < convert (real (T), π)
134
136
w = 1 - z
135
137
if isapprox (c, a + b) # 15.8.10
136
- return gamma (c)/ gamma (a)/ gamma (b)* _₂F₁logsum (a, b, z, w, - 1 )
138
+ return gamma (c)/ gamma (a)/ gamma (b)* _₂F₁logsum (a, b, z, w, - 1 ; kwds ... )
137
139
elseif c - a - b ∉ ℤ # 15.8.4
138
- return gamma (c)* (gamma (c- a- b)/ gamma (c- a)/ gamma (c- b)* _₂F₁maclaurin (a, b, a+ b- c+ 1 , w)+ exp ((c- a- b)* log1p (- z))* gamma (a+ b- c)/ gamma (a)/ gamma (b)* _₂F₁maclaurin (c- a, c- b, c- a- b+ 1 , w))
140
+ return gamma (c)* (gamma (c- a- b)/ gamma (c- a)/ gamma (c- b)* _₂F₁maclaurin (a, b, a+ b- c+ 1 , w; kwds ... )+ exp ((c- a- b)* log1p (- z))* gamma (a+ b- c)/ gamma (a)/ gamma (b)* _₂F₁maclaurin (c- a, c- b, c- a- b+ 1 , w; kwds ... ))
139
141
end # TODO : full 15.8.10
140
142
elseif abs (1 - inv (z)) ≤ ρ && absarg (z) < convert (real (T), π) && absarg (1 - z) < convert (real (T), π)
141
143
w = 1 - inv (z)
142
144
if isapprox (c, a + b) # 15.8.11
143
- return gamma (c)* z^ (- a)/ gamma (a)* _₂F₁logsumalt (a, b, z, w)
145
+ return gamma (c)* z^ (- a)/ gamma (a)* _₂F₁logsumalt (a, b, z, w; kwds ... )
144
146
elseif c - a - b ∉ ℤ # 15.8.5
145
- return gamma (c)* (z^ (- a)* gamma (c- a- b)/ gamma (c- a)/ gamma (c- b)* _₂F₁maclaurin (a, a- c+ 1 , a+ b- c+ 1 , w)+ z^ (a- c)* (1 - z)^ (c- a- b)* gamma (a+ b- c)/ gamma (a)/ gamma (b)* _₂F₁maclaurin (c- a, 1 - a, c- a- b+ 1 , w))
147
+ return gamma (c)* (z^ (- a)* gamma (c- a- b)/ gamma (c- a)/ gamma (c- b)* _₂F₁maclaurin (a, a- c+ 1 , a+ b- c+ 1 , w; kwds ... )+ z^ (a- c)* (1 - z)^ (c- a- b)* gamma (a+ b- c)/ gamma (a)/ gamma (b)* _₂F₁maclaurin (c- a, 1 - a, c- a- b+ 1 , w; kwds ... ))
146
148
end # TODO : full 15.8.11
147
149
elseif abs (z- 0.5 ) > 0.5
148
150
if isapprox (a, b) && ! isapprox (c, a+ 0.5 )
149
- return gamma (c)/ gamma (a)/ gamma (c- a)* (0.5 - z)^ (- a)* _₂F₁continuationalt (a, c, 0.5 , z)
151
+ return gamma (c)/ gamma (a)/ gamma (c- a)* (0.5 - z)^ (- a)* _₂F₁continuationalt (a, c, 0.5 , z; kwds ... )
150
152
elseif a- b ∉ ℤ
151
- return gamma (c)* (gamma (b- a)/ gamma (b)/ gamma (c- a)* (0.5 - z)^ (- a)* _₂F₁continuation (a, a+ b, c, 0.5 , z) + gamma (a- b)/ gamma (a)/ gamma (c- b)* (0.5 - z)^ (- b)* _₂F₁continuation (b, a+ b, c, 0.5 , z))
153
+ return gamma (c)* (gamma (b- a)/ gamma (b)/ gamma (c- a)* (0.5 - z)^ (- a)* _₂F₁continuation (a, a+ b, c, 0.5 , z; kwds ... ) + gamma (a- b)/ gamma (a)/ gamma (c- b)* (0.5 - z)^ (- b)* _₂F₁continuation (b, a+ b, c, 0.5 , z; kwds ... ))
152
154
end
153
155
end
154
- return pFqweniger ((a, b), (c, ), z)
156
+ return pFqweniger ((a, b), (c, ), z; kwds ... ) # _₂F₁taylor(a, b, c, z; kwds... )
155
157
end
156
158
157
159
# Special case of (-x)^a*_₂F₁ to handle LogNumber correctly in RiemannHilbert.jl
0 commit comments