mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 23:11:09 +00:00
Add files via upload
This commit is contained in:
parent
c1b15a86ba
commit
a56525855c
83
physics/gamma_function.py
Normal file
83
physics/gamma_function.py
Normal file
|
@ -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")
|
Loading…
Reference in New Issue
Block a user