diff --git a/maths/power_using_iteration.py b/maths/power_using_iteration.py new file mode 100644 index 000000000000..f86b6454f4c3 --- /dev/null +++ b/maths/power_using_iteration.py @@ -0,0 +1,86 @@ +def power(base: float, exponent: int) -> float: + """ + Optimized power function using exponentiation by squaring. + + Args: + base (float): The base number. + exponent (int): The exponent. + + Returns: + float: The result of base raised to the power of exponent. + + Examples: + >>> power(2, 3) + 8.0 + >>> power(5, -2) + 0.04 + >>> power(10, 0) + 1.0 + >>> power(7, 2) + 49.0 + >>> power(2, -3) + 0.125 + >>> power(2.5, 4) + 39.0625 + >>> power(-3.5, 2) + 12.25 + >>> power(-2, 3) + -8.0 + >>> power(0, 5) + 0.0 + >>> power(0, 1) + 0.0 + >>> power(0, -1) + Traceback (most recent call last): + ... + ZeroDivisionError: 0.0 cannot be raised to a negative power. + >>> power(0, 0) + Traceback (most recent call last): + ... + ValueError: 0.0 raised to the power of 0 is indeterminate. + >>> power(1, 1000) + 1.0 + + """ + if base == 0 and exponent == 0: + raise ValueError("0.0 raised to the power of 0 is indeterminate.") + if base == 0 and exponent < 0: + raise ZeroDivisionError("0.0 cannot be raised to a negative power.") + + result = 1.0 + if exponent < 0: + base = 1 / base + exponent = -exponent + while exponent: + if exponent % 2 == 1: + result *= base + base *= base # Square the base + exponent //= 2 # Halve the exponent + return round(result, 5) # Round to 5 decimal places + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print("Raise base to the power of exponent using an optimized approach...") + + try: + # Input handling and validation + base = float(input("Enter the base: ").strip()) # Supports float & int + exponent = int( + input("Enter the exponent: ").strip() + ) # Ensures exponent is an integer + + # Calculate result + result = power(base, exponent) + + # Display the result + print(f"{base} to the power of {exponent} is {result}") + + except ValueError as e: + # Handle invalid input or indeterminate cases + print(e) + except ZeroDivisionError as e: + # Handle division by zero + print(e) diff --git a/physics/escape_velocity.py b/physics/escape_velocity.py new file mode 100644 index 000000000000..bd87dca6d60d --- /dev/null +++ b/physics/escape_velocity.py @@ -0,0 +1,66 @@ +import math + + +def escape_velocity(mass: float, radius: float) -> float: + """ + Calculates the escape velocity needed to break free from a celestial body's gravitational field. + + The formula used is: + v = sqrt(2 * G * M / R) + where: + v = escape velocity (m/s) + G = gravitational constant (6.67430 × 10^-11 m^3 kg^-1 s^-2) + M = mass of the celestial body (kg) + R = radius from the center of mass (m) + + Args: + mass (float): Mass of the celestial body in kilograms. + radius (float): Radius from the center of mass in meters. + + Returns: + float: Escape velocity in meters per second, rounded to 3 decimal places. + + Examples: + >>> escape_velocity(5.972e24, 6.371e6) # Earth + 11185.978 + >>> escape_velocity(7.348e22, 1.737e6) # Moon + 2376.307 + >>> escape_velocity(1.898e27, 6.9911e7) # Jupiter + 60199.545 + >>> escape_velocity(0, 1.0) + 0.0 + >>> escape_velocity(1.0, 0) + Traceback (most recent call last): + ... + ZeroDivisionError: Radius cannot be zero. + """ + G = 6.67430e-11 # Gravitational constant in m^3 kg^-1 s^-2 + + if radius == 0: + raise ZeroDivisionError("Radius cannot be zero.") + if mass == 0: + return 0.0 + + velocity = math.sqrt(2 * G * mass / radius) + return round(velocity, 3) + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + print("Calculate escape velocity of a celestial body...\n") + + try: + # User input + mass = float(input("Enter mass of the celestial body (in kg): ").strip()) + radius = float(input("Enter radius from center (in meters): ").strip()) + + # Result + velocity = escape_velocity(mass, radius) + print(f"Escape velocity is {velocity} m/s") + + except ValueError: + print("Invalid input. Please enter valid numeric values.") + except ZeroDivisionError as e: + print(e)