# 3.2. Math Stdlib¶

## 3.2.1. Constans¶

• inf or Infinity

• -inf or -Infinity

• 1e6 or 1e-4

## 3.2.2. Functions¶

• abs()

• round()

• pow()

• sum()

• min()

• max()

• divmod()

• complex()

## 3.2.4. Constants¶

import math

math.pi         # The mathematical constant π = 3.141592..., to available precision.
math.e          # The mathematical constant e = 2.718281..., to available precision.
math.tau        # The mathematical constant τ = 6.283185..., to available precision.


import math

math.degrees(x)     # Convert angle x from radians to degrees.


## 3.2.6. Rounding to lower¶

import math

math.floor(3.14)                # 3
math.floor(3.00000000000000)    # 3
math.floor(3.00000000000001)    # 3
math.floor(3.99999999999999)    # 3


## 3.2.7. Rounding to higher¶

import math

math.ceil(3.14)                 # 4
math.ceil(3.00000000000000)     # 3
math.ceil(3.00000000000001)     # 4
math.ceil(3.99999999999999)     # 4


## 3.2.8. Logarithms¶

import math

math.log(x)     # if base is not set, then e
math.log(x, base=2)
math.log(x, base=10)
math.log10()    # Return the base-10 logarithm of x. This is usually more accurate than log(x, 10).
math.log2(x)    # Return the base-2 logarithm of x. This is usually more accurate than log(x, 2).

math.exp(x)


## 3.2.9. Linear Algebra¶

import math

math.sqrt(x)     # Return the square root of x.
math.pow(x, y)   # Return x raised to the power y.

import math

math.hypot(*coordinates)    # 2D, since Python 3.8 also multiple dimensions
math.dist(p, q)             # Euclidean distance, since Python 3.8
math.gcd(*integers)         # Greatest common divisor
math.lcm(*integers)         # Least common multiple, since Python 3.9
math.perm(n, k=None)        # Return the number of ways to choose k items from n items without repetition and with order.
math.prod(iterable, *, start=1)  # Calculate the product of all the elements in the input iterable. The default start value for the product is 1., since Python 3.8
math.remainder(x, y)        # Return the IEEE 754-style remainder of x with respect to y.


## 3.2.10. Trigonometry¶

import math

math.sin()
math.cos()
math.tan()

math.asin(x)
math.acos(x)
math.atan(x)
math.atan2(x)


Hyperbolic functions:

import math

math.sinh()         # Return the hyperbolic sine of x.
math.cosh()         # Return the hyperbolic cosine of x.
math.tanh()         # Return the hyperbolic tangent of x.

math.asinh(x)       # Return the inverse hyperbolic sine of x.
math.acosh(x)       # Return the inverse hyperbolic cosine of x.
math.atanh(x)       # Return the inverse hyperbolic tangent of x.


## 3.2.11. Infinity¶

float('inf')                # inf
float('-inf')               # -inf
float('Infinity')           # inf
float('-Infinity')          # -inf

from math import isinf

isinf(float('inf'))         # True
isinf(float('Infinity'))    # True
isinf(float('-inf'))        # True
isinf(float('-Infinity'))   # True

isinf(1e308)                # False
isinf(1e309)                # True

isinf(1e-9999999999999999)  # False


## 3.2.12. Absolute value¶

abs(1)          # 1
abs(-1)         # 1

abs(1.2)        # 1.2
abs(-1.2)       # 1.2

from math import fabs

fabs(1)         # 1.0
fabs(-1)        # 1.0

fabs(1.2)       # 1.2
fabs(-1.2)      # 1.2

from math import fabs

vector = [1, 0, 1]

abs(vector)
# Traceback (most recent call last):
# TypeError: bad operand type for abs(): 'list'

fabs(vector)
# Traceback (most recent call last):
# TypeError: must be real number, not list

from math import sqrt

def vector_abs(vector):
return sqrt(sum(n**2 for n in vector))

vector = [1, 0, 1]
vector_abs(vector)
# 1.4142135623730951

from math import sqrt

class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z

def __abs__(self):
return sqrt(self.x**2 + self.y**2 + self.z**2)

vector = Vector(x=1, y=0, z=1)
abs(vector)
# 1.4142135623730951


## 3.2.13. Assignments¶

"""
* Complexity: easy
* Lines of code: 10 lines
* Time: 5 min

English:
1. Read input (angle in degrees) from user
2. User will type int or float
3. Print all trigonometric functions (sin, cos, tg, ctg)
4. If there is no value for this angle, raise an exception
5. Round results to two decimal places
6. Run doctests - all must succeed

Polish:
1. Program wczytuje od użytkownika wielkość kąta w stopniach
2. Użytkownik zawsze podaje int albo float
3. Wyświetl wartość funkcji trygonometrycznych (sin, cos, tg, ctg)
4. Jeżeli funkcja trygonometryczna nie istnieje dla danego kąta podnieś
stosowny wyjątek
5. Wyniki zaokrąglij do dwóch miejsc po przecinku
6. Uruchom doctesty - wszystkie muszą się powieść

Tests:
>>> import sys; sys.tracebacklimit = 0

>>> result_sin
0.02
>>> result_cos
1.0
>>> result_tg
0.02
>>> result_ctg
57.29
>>> result_pi
3.14
"""

import math
from unittest.mock import MagicMock

PRECISION = 2

# Simulate user input (for test automation)
input = MagicMock(side_effect=['1'])
degrees = input('What is the angle [deg]?: ')

result_sin = ...
result_cos = ...
result_tg = ...
result_ctg = ...
result_pi = ...


"""
* Assignment: Math Algebra Distance2D
* Complexity: easy
* Lines of code: 5 lines
* Time: 8 min

English:
1. Given are two points A: tuple[int, int] and B: tuple[int, int]
2. Coordinates are in cartesian system
3. Points A and B are in two dimensional space
4. Calculate distance between points using Euclidean algorithm
5. Run doctests - all must succeed

Polish:
1. Dane są dwa punkty A: tuple[int, int] i B: tuple[int, int]
2. Koordynaty są w systemie kartezjańskim
3. Punkty A i B są w dwuwymiarowej przestrzeni
4. Oblicz odległość między nimi wykorzystując algorytm Euklidesa
5. Uruchom doctesty - wszystkie muszą się powieść

Tests:
>>> A = (1, 0)
>>> B = (0, 1)
>>> result(A, B)
1.4142135623730951

>>> result((0,0), (1,0))
1.0

>>> result((0,0), (1,1))
1.4142135623730951

>>> result((0,1), (1,1))
1.0

>>> result((0,10), (1,1))
9.055385138137417
"""

from math import sqrt

# type: point = tuple[int,...]
# type: Callable[[point, point], float]
def result(A, B):
...


"""
* Assignment: Math Algebra DistanceND
* Complexity: easy
* Lines of code: 10 lines
* Time: 5 min

English:
1. Given are two points A: Sequence[int] and B: Sequence[int]
2. Coordinates are in cartesian system
3. Points A and B are in N-dimensional space
4. Points A and B must be in the same space
5. Calculate distance between points using Euclidean algorithm
6. Run doctests - all must succeed

Polish:
1. Dane są dwa punkty A: Sequence[int] i B: Sequence[int]
2. Koordynaty są w systemie kartezjańskim
3. Punkty A i B są w N-wymiarowej przestrzeni
4. Punkty A i B muszą być w tej samej przestrzeni
5. Oblicz odległość między nimi wykorzystując algorytm Euklidesa
6. Uruchom doctesty - wszystkie muszą się powieść

Hints:
* for n1, n2 in zip(A, B)

Tests:
>>> result((0,0,0), (0,0,0))
0.0

>>> result((0,0,0), (1,1,1))
1.7320508075688772

>>> result((0,1,0,1), (1,1,0,0))
1.4142135623730951

>>> result((0,0,1,0,1), (1,1,0,0,1))
1.7320508075688772

>>> result((0,0,1,0,1), (1,1))
Traceback (most recent call last):
ValueError: Points must be in the same dimensions
"""

from math import sqrt

# type: point = tuple[int,...]
# type: Callable[[point, point], float]
def result(A, B):
...


Hints:
• $$distance(a, b) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2$$

• $$distance(a, b) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + ... + (n_2 - n_1)^2}$$

"""
* Assignment: Math Algebra Matmul
* Complexity: hard
* Lines of code: 13 lines
* Time: 21 min

English:
1. Multiply matrices using nested for loops
2. Do not use any library, such as: numpy, pandas, itp
3. Run doctests - all must succeed

Polish:
1. Pomnóż macierze wykorzystując zagnieżdżone pętle for
2. Nie wykorzystuj żadnej biblioteki, tj.: numpy, pandas, itp
3. Uruchom doctesty - wszystkie muszą się powieść

Hints:
* Zero matrix
* Three nested for loops

Tests:
>>> A = [[1, 0],
...      [0, 1]]
>>>
>>> B = [[4, 1],
...      [2, 2]]
>>>
>>> result(A, B)
[[4, 1], [2, 2]]

>>> A = [[1,0,1,0],
...      [0,1,1,0],
...      [3,2,1,0],
...      [4,1,2,0]]
>>>
>>> B = [[4,1],
...      [2,2],
...      [5,1],
...      [2,3]]
>>>
>>> result(A, B)
[[9, 2], [7, 3], [21, 8], [28, 8]]
"""

# type: matrix = list[list[int]]
# type: Callable[[matrix, matrix], matrix]
def result(A, B):
...