@@ -719,18 +719,38 @@ Euler integral of the first kind ``\\operatorname{B}(x,y) = \\Gamma(x)\\Gamma(y)
719
719
"""
720
720
function beta end
721
721
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)
727
747
end
728
748
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 )
734
754
end
735
755
736
756
"""
@@ -740,7 +760,7 @@ Natural logarithm of the [`beta`](@ref) function ``\\log(|\\operatorname{B}(x,y)
740
760
741
761
See also [`logabsbeta`](@ref).
742
762
"""
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 )
744
764
745
765
"""
746
766
logabsbeta(x, y)
@@ -749,11 +769,30 @@ Compute the natural logarithm of the absolute value of the [`beta`](@ref) functi
749
769
750
770
See also [`logbeta`](@ref).
751
771
"""
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)
757
796
end
758
797
# # from base/mpfr.jl
759
798
0 commit comments