diff --git a/physics/gamma_function.py b/physics/gamma_function.py new file mode 100644 index 000000000..395968aeb --- /dev/null +++ b/physics/gamma_function.py @@ -0,0 +1,83 @@ +""" +Gamma function is a very useful tool in physics. +It helps calculating complex integral in a convenient way. +for more info: https://en.wikipedia.org/wiki/Gamma_function +""" + +# Importing packages +from math import sqrt, pi +from re import match +from typing import Union + + +def gamma(num : Union[int, float]) -> Union[int, float]: + """ + Calculates the value of Gamma function of num + where num is either an integer (1,2,3..) or a half-integer (0.5,1.5,2.5...). + Implemented using recursion + Examples: + >>> Gamma of: 0.5 + √π + >>> Gamma of: 2 + 1 + >>> Gamma of: 3.5 + 1.875√π + """ + if num == 1: + return 1 + elif num == 0.5: + return sqrt(pi) + elif num > 1: + return (num - 1) * gamma(num - 1) + else: + # Error + return -2 + + +def test_gamma() -> None: + """ + >>> test_gamma() + """ + assert sqrt(pi) == gamma(0.5) + assert 1 == gamma(1) + assert 1 == gamma(2) + + +if __name__ == "__main__": + # Initialize boolean + number = True + # Get input from user + input_ = input("Gamma of: ") + # Ensure valid input + try: + # Ensure input matches half-integer (float) pattern + if match(r'^[0-9]*\.5$', input_): + # Convert string to float + num = float(input_) + # Ensure input matches an integer pattern + elif match(r'^[1-9][0-9]*$', input_): + # Convert string to int + num = int(input_) + # Input is not a valid number + else: + # raise an error + raise ValueError + # Ensure print an error message + except ValueError: + print("Invalid input: Must be an integer or an half-integer!") + number = False + finally: + # Ensure input is a valid number + if number: + # Ensure input is an integer + if (isinstance(gamma(num), int)): + # Print result + print(gamma(num)) + # Otherwise print results with √π (gamma of 0.5 is √π) + # Therefore all results will be a number times √π + else: + results = "{result:.4f}".format(result=gamma(num) / sqrt(pi)) + results = results.rstrip('0').rstrip('.') + if results == "1": + results = "" + print(results + "\u221A\u03c0")