@@ -719,18 +719,38 @@ Euler integral of the first kind ``\\operatorname{B}(x,y) = \\Gamma(x)\\Gamma(y)
719719""" 
720720function  beta end 
721721
722- function  beta (x:: Real , w:: Real )
723-     yx, sx =  logabsgamma (x)
724-     yw, sw =  logabsgamma (w)
725-     yxw, sxw =  logabsgamma (x+ w)
726-     return  exp (yx +  yw -  yxw) *  (sx* sw* sxw)
722+ function  beta (a:: Real , b:: Real )
723+     # Special case for negative integer argument
724+     if  a <=  0.0 
725+         if  isinteger (a) &&  1 - a- b >  0 
726+             sgn =  isinteger (b/ 2 ) ?  1  :  - 1 
727+             return  sgn*  beta (1 - a- b,b)
728+         end 
729+     end 
730+     if  b <=  0.0 
731+         if  isinteger (b) &&  1 - a- b >  0 
732+             sgn =  isinteger (a/ 2 ) ?  1  :  - 1 
733+             return  sgn*  beta (1 - a- b,a)
734+         end 
735+     end 
736+     if  a <  b
737+         a,b =  b,a
738+     end 
739+     # asymptotic expansion for log(B(a,b)) for |a| >> |b|
740+     if  abs (a) >  1e5 * abs (b) &&  abs (a) >  1e5 
741+         return  exp (loggammadiv (b,a) +  loggamma (b))
742+     end 
743+     ya, sa =  logabsgamma (a)
744+     yb, sb =  logabsgamma (b)
745+     yab, sab =  logabsgamma (a+ b)
746+     return  exp (ya +  yb -  yab) *  (sa* sb* sab)
727747end 
728748
729- function  beta (x :: Number , w :: Number )
730-     yx  =  loggamma (x )
731-     yw  =  loggamma (w )
732-     yxw  =  loggamma (x + w )
733-     return  exp (yx  +  yw  -  yxw )
749+ function  beta (a :: Number , b :: Number )
750+     ya  =  loggamma (a )
751+     yb  =  loggamma (b )
752+     yab  =  loggamma (a + b )
753+     return  exp (ya  +  yb  -  yab )
734754end 
735755
736756""" 
@@ -740,7 +760,7 @@ Natural logarithm of the [`beta`](@ref) function ``\\log(|\\operatorname{B}(x,y)
740760
741761See also [`logabsbeta`](@ref). 
742762""" 
743- logbeta (x :: Number , w :: Number ) =  loggamma (x )+ loggamma (w )- loggamma (x + w )
763+ logbeta (a :: Number , b :: Number ) =  loggamma (a )+ loggamma (b )- loggamma (a + b )
744764
745765""" 
746766    logabsbeta(x, y) 
@@ -749,11 +769,30 @@ Compute the natural logarithm of the absolute value of the [`beta`](@ref) functi
749769
750770See also [`logbeta`](@ref). 
751771""" 
752- function  logabsbeta (x:: Real , w:: Real )
753-     yx, sx =  logabsgamma (x)
754-     yw, sw =  logabsgamma (w)
755-     yxw, sxw =  logabsgamma (x+ w)
756-     (yx +  yw -  yxw), (sx* sw* sxw)
772+ function  logabsbeta (a:: Real , b:: Real )
773+     if  a <=  0.0 
774+         if  isinteger (a) &&  1 - a- b >  0 
775+             sgn =  isinteger (b/ 2 ) ?  1  :  - 1 
776+             return  logabsbeta (1 - a- b,b)
777+         end 
778+     end 
779+     if  b <=  0.0 
780+         if  isinteger (b) &&  1 - a- b >  0 
781+             sgn =  isinteger (a/ 2 ) ?  1  :  - 1 
782+             return  logabsbeta (1 - a- b,a)
783+         end 
784+     end 
785+     if  a <  b
786+         a,b =  b,a
787+     end 
788+     # asymptotic expansion for log(B(a,b)) for |a| >> |b|
789+     if  abs (a) >  1e5 * abs (b) &&  abs (a) >  1e5 
790+         return  (loggammadiv (b,a) +  loggamma (b)), 1 
791+     end 
792+     ya, sa =  logabsgamma (a)
793+     yb, sb =  logabsgamma (b)
794+     yab, sab =  logabsgamma (a+ b)
795+     (ya +  yb -  yab), (sa* sb* sab)
757796end 
758797# # from base/mpfr.jl
759798
0 commit comments