1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.numbers.gamma; 18 19 /** 20 * Computes \( \log_e(\Gamma(a+b)) \). 21 * <p> 22 * This class is immutable. 23 * </p> 24 */ 25 final class LogGammaSum { 26 /** Private constructor. */ 27 private LogGammaSum() { 28 // intentionally empty 29 } 30 31 /** 32 * Computes the value of log Γ(a + b) for 1 ≤ a, b ≤ 2. 33 * Based on the <em>NSWC Library of Mathematics Subroutines</em> 34 * implementation, {@code DGSMLN}. 35 * 36 * @param a First argument. 37 * @param b Second argument. 38 * @return the value of {@code log(Gamma(a + b))}. 39 * @throws IllegalArgumentException if {@code a} or {@code b} is lower than 1 40 * or larger than 2. 41 */ 42 static double value(double a, 43 double b) { 44 if (a < 1 || 45 a > 2) { 46 throw new GammaException(GammaException.OUT_OF_RANGE, a, 1, 2); 47 } 48 if (b < 1 || 49 b > 2) { 50 throw new GammaException(GammaException.OUT_OF_RANGE, b, 1, 2); 51 } 52 53 final double x = (a - 1) + (b - 1); 54 if (x <= 0.5) { 55 return LogGamma1p.value(1 + x); 56 } else if (x <= 1.5) { 57 return LogGamma1p.value(x) + Math.log1p(x); 58 } else { 59 return LogGamma1p.value(x - 1) + Math.log(x * (1 + x)); 60 } 61 } 62 }