from math import pi, sqrt



def 			__SCREAMING_SNAKE_CASE						(      __UpperCamelCase					: float			)							->      float:







  """simple docstring"""





  if num <= 0:
    raise ValueError("""math domain error"""			)
  if num > 1_71.5:
    raise OverflowError("""math range error"""			)
  elif num - int(__UpperCamelCase			) not in (0, 0.5):
    raise NotImplementedError("""num must be an integer or a half-integer"""			)
  elif num == 0.5:
    return sqrt(__UpperCamelCase			)
  else:
    return 1.0 if num == 1 else (num - 1) * gamma(num - 1			)



def 			__SCREAMING_SNAKE_CASE						(      )							->      None:







  """simple docstring"""





  assert gamma(0.5			) == sqrt(__UpperCamelCase			)
  assert gamma(1			) == 1.0
  assert gamma(2			) == 1.0


if __name__ == "__main__":
  from doctest import testmod

  testmod()
  __lowerCamelCase    :				List[Any]							     =	1.0
  while num:
    __lowerCamelCase    :				Optional[int]							     =	float(input('''Gamma of: '''))
    print(F"""gamma({num}) = {gamma(num)}""")
    print('''\nEnter 0 to exit...''')

from math import log

from scipy.constants import Boltzmann, physical_constants

__lowerCamelCase    :				int							     =	300  # TEMPERATURE (unit = K)



def 			__SCREAMING_SNAKE_CASE						(      __UpperCamelCase					: float				,  __UpperCamelCase					: float				,  __UpperCamelCase					: float				,  )							->      float:







  """simple docstring"""





  if donor_conc <= 0:
    raise ValueError("""Donor concentration should be positive"""			)
  elif acceptor_conc <= 0:
    raise ValueError("""Acceptor concentration should be positive"""			)
  elif intrinsic_conc <= 0:
    raise ValueError("""Intrinsic concentration should be positive"""			)
  elif donor_conc <= intrinsic_conc:
    raise ValueError(
        """Donor concentration should be greater than intrinsic concentration"""			)
  elif acceptor_conc <= intrinsic_conc:
    raise ValueError(
        """Acceptor concentration should be greater than intrinsic concentration"""			)
  else:
    return (
        Boltzmann
        * T
        * log((donor_conc * acceptor_conc) / intrinsic_conc**2			)
        / physical_constants["electron volt"][0]
    )


if __name__ == "__main__":
   import doctest

   doctest.testmod()
