Python - Calculando Operaciones Matemáticas
#41 Ejemplos de Funciones sobre Cálculos y Operaciones Matemáticas
#1. Factorial usando recursividad:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
#2. Calcular el factorial de un número usando un bucle:
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
#3. Calcula la suma de una lista de números usando un bucle:
def sum_list(arr):
result = 0
for i in range(len(arr)):
result += arr[i]
return result
#4. Calcula el producto de una lista de números usando un bucle:
def product_list(arr):
result = 1
for i in range(len(arr)):
result *= arr[i]
return result
#5. Calcular la media de una lista de números:
def mean(arr):
return sum(arr) / len(arr)
#6. Calcular la mediana de una lista de números:
def median(arr):
n = len(arr)
arr.sort()
if n % 2 == 0:
return (arr[n//2] + arr[n//2-1]) / 2
else:...
return arr[n//2]
#7. Calcular la moda de una lista de números:
def mode(arr):
freq = {}
for i in arr:
if i in freq:
freq[i] += 1
else:
freq[i] = 1
max_freq = max(freq.values())
mode = [k for k, v in freq.items() if v == max_freq]
return mode
#8. Calcular la suma de las cifras de un número:
def sum_digits(n):
return sum(int(d) for d in str(n))
#9. Calcular el producto de las cifras de un número:
def product_digits(n):
result = 1
for d in str(n):
result *= int(d)
return result
#10. Calcular el MCD de dos números:
def gcd(a, b):
while b:
a, b = b, a % b
return a
#11. Calcular el MCM de dos números:
def lcm(a, b):
return a * b // gcd(a, b)
#12. Calcular la potencia de un número usando la recursividad:
def power(base, exponent):
if exponent == 0:
return 1
elif exponent % 2 == 0:
return power(base, exponent//2)**2
else:
return base * power(base, exponent-1)
#13. Calcula la raíz cuadrada de un número usando el método de Newton:
def square_root(n):
x = n
if n == 0:
return 0
guess = n/2
while True:
new_guess = (guess + n/guess)/2
if abs(guess - new_guess) < 1e-10:
return new_guess
guess = new_guess
#14. Calcular la distancia entre dos puntos (x1, y1) y (x2, y2):
import math
x1, y1 = 0, 0
x2, y2 = 3, 4
distance = math.hypot(x2 - x1, y2 - y1)
print(distance)
#15. Calcular la distancia entre un punto (x, y)
#y una línea que pasa por dos puntos (x1, y1) y (x2, y2):
import math
x, y = 3, 4
x1, y1 = 0, 0
x2, y2 = 6, 0
distance = abs((y2 - y1) * x - (x2 - x1) * y + x2 * y1 - y2 * x1) / math.hypot(x2 - x1, y2 - y1)
print(distance)
#16. Calcular la proyección de un vector (x1, y1) sobre otro vector (x2, y2):
import math
x1, y1 = 3, 4
x2, y2 = 1, 1
projection = ((x1 * x2 + y1 * y2) / (x2 ** 2 + y2 ** 2)) * x2, ((x1 * x2 + y1 * y2) / (x2 ** 2 + y2 ** 2)) * y2
print(projection)
#17. Convertir coordenadas polares (r, theta) a coordenadas cartesianas (x, y):
import math
r = 5
theta = math.pi / 4
x = r * math.cos(theta)
y = r * math.sin(theta)
print(x, y)
#Ejemplos de Funciones sobre Cálculos Matemáticos.
#18. Calcula el número pi utilizando el método de Monte Carlo.
import random
def monte_carlo_pi(num_samples):
inside_circle = 0
for i in range(num_samples):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
if x**2 + y**2 <= 1:
inside_circle += 1
pi = 4 * inside_circle / num_samples
return pi
#19. Calcula la integral de una función utilizando el método de Simpson.
def simpson_1_3(f, a, b, n):
"""
Calcula la integral de la función f en el intervalo [a, b] utilizando la regla de Simpson 1/3 con n subintervalos.
"""
h = (b - a) / n
x = [a + i * h for i in range(n+1)]
y = [f(xi) for xi in x]
integral = y[0] + y[-1] + sum([4*yi for i, yi in enumerate(y) if i % 2 == 1]) + sum([2*yi for i, yi in enumerate(y) if i % 2 == 0 and i > 0])
integral *= h/3
return integral
#20. Calcula el área bajo una curva utilizando el método del trapecio.
def trapecio(f, a, b, n):
"""
Calcula el área bajo la curva de la función f en el intervalo [a, b] utilizando el método del trapecio con n subintervalos.
"""
h = (b - a) / n
x = [a + i * h for i in range(n+1)]
y = [f(xi) for xi in x]
area = sum([(y[i] + y[i+1]) * h / 2 for i in range(n)])
return area
#21. Calcula el número de Euler utilizando la serie de Taylor.
def euler(n):
"""
Calcula el número de Euler utilizando la serie de Taylor con n términos.
"""
e = 0
for i in range(n):
e += 1 / factorial(i)
return e
#e = 1/0! + 1/1! + 1/2! + 1/3! + ... + 1/n!
from math import factorial
factorial(5) # devuelve 120
#22. Calcula el logaritmo natural de un número utilizando la serie de Taylor.
def ln(x, n):
"""
Calcula el logaritmo natural de x utilizando la serie de Taylor con n términos.
"""
if x <= 0:
return float('-inf')
elif x == 1:
return 0
else:
ln_x = 0
for i in range(1, n+1):
ln_x += ((-1)**(i+1)) * ((x-1)**i) / i
return ln_x
#ln(x) = (x-1) - (x-1)^2/2 + (x-1)^3/3 - (x-1)^4/4 + ... + (-1)^(n+1) * (x-1)^n / n
#23. Calcula la función exponencial de un número utilizando la serie de Taylor.
def exp(x, n):
"""
Calcula la función exponencial de x utilizando la serie de Taylor con n términos.
"""
exp_x = 0
for i in range(n):
exp_x += x**i / factorial(i)
return exp_x
#exp(x) = 1 + x + x^2/2! + x^3/3! + ... + x^n/n!
from math import factorial
factorial(5) # devuelve 120
#24. Calcula la función de Ackermann de dos números enteros.
def ackermann(m, n):
"""
Calcula la función de Ackermann de dos números enteros m y n.
"""
if m == 0:
return n + 1
elif m > 0 and n == 0:
return ackermann(m-1, 1)
elif m > 0 and n > 0:
return ackermann(m-1, ackermann(m, n-1))
#25. Calcula la función de Ackermann generalizada de tres números enteros.
def ackermann_generalizada(m, n, p):
"""
Calcula la función de Ackermann generalizada de tres números enteros m, n y p.
"""
if m == 0:
return n + p
elif m > 0 and n == 0:
return ackermann_generalizada(m-1, p, 1)
elif m > 0 and n > 0:
return ackermann_generalizada(m-1, ackermann_generalizada(m, n-1, p), p)
#26. Calcula la función de Jacobsthal de un número entero.
def jacobsthal(n):
"""
Calcula la función de Jacobsthal de un número entero n.
"""
if n == 0:
return 0
elif n == 1:
return 1
else:
return jacobsthal(n-1) + 2*jacobsthal(n-2)
#J(0) = 0
#J(1) = 1
#J(n) = J(n-1) + 2*J(n-2) para n > 1
#27. Calcula la función de Euler de un número entero en Python.
def euler_func(n):
"""
Calcula la función de Euler de un número entero n.
"""
phi = n
p = 2
while p * p <= n:
if n % p == 0:
phi -= phi // p
while n % p == 0:
n //= p
p += 1
if n > 1:
phi -= phi // n
return phi
#phi(n) = n * (1 - 1/p1) * (1 - 1/p2) * ... * (1 - 1/pk)
#28. Calcula el número de Bell de un número entero en Python.
def bell_number(n):
"""
Calcula el número de Bell de un número entero n.
"""
bell = [[0 for i in range(n+1)] for j in range(n+1)]
bell[0][0] = 1
for i in range(1, n+1):
bell[i][0] = bell[i-1][i-1]
for j in range(1, i+1):
bell[i][j] = bell[i-1][j-1] + bell[i][j-1]
return bell[n][0]
#B(0) = 1
#B(n) = sum_{k=0}^{n-1} binomial(n-1, k) * B(k)
#29. Calcula el número de Stirling de primer tipo de un número entero en Python.
def stirling_first(n, k):
"""
Calcula el número de Stirling de primer tipo de n y k.
"""
if n == 0 and k == 0:
return 1
elif n == 0 or k == 0:
return 0
else:
return (n-1)*stirling_first(n-1, k) + stirling_first(n-1, k-1)
s(n, k) = (n-1)*s(n-1, k) + s(n-1, k-1)
#30. Calcula el número de Stirling de segundo tipo de un número entero en Python.
def stirling_second(n, k):
"""
Calcula el número de Stirling de segundo tipo de n y k.
"""
if n == 0 and k == 0:
return 1
elif n == 0 or k == 0:
return 0
else:
return k*stirling_second(n-1, k) + stirling_second(n-1, k-1)
#S(n, k) = k*S(n-1, k) + S(n-1, k-1)
#31. Calcula el coeficiente binomial de dos números enteros en Python.
def binomial_coef(n, k):
"""
Calcula el coeficiente binomial de n y k.
"""
if k == 0 or k == n:
return 1
elif k > n:
return 0
else:
return binomial_coef(n-1, k-1) + binomial_coef(n-1, k)
#C(n, k) = 1 si k = 0 o k = n
#C(n, k) = 0 si k > n
#C(n, k) = C(n-1, k-1) + C(n-1, k) si 0 < k < n
#C(n, k) = C(n-1, k-1) * n / k
#32. Calcula el número de Catalan de un número entero en Python.
def catalan_number(n):
"""
Calcula el número de Catalan de un número entero n.
"""
if n <= 1:
return 1
else:
catalan = [0]*(n+1)
catalan[0] = 1
catalan[1] = 1
for i in range(2, n+1):
for j in range(i):
catalan[i] += catalan[j] * catalan[i-j-1]
return catalan[n]
#C(0) = 1
#C(n) = sum_{i=0}^{n-1} C(i) * C(n-i-1) para n > 0
#33. Calcula el número de Bonacci de un número entero en Python.
def bonacci_number(n, m):
"""
Calcula el número de Bonacci de un número entero n y un entero m.
"""
if n < m:
return 0
elif n == m or m == 1:
return 1
else:
bonacci = [0]*(n+1)
for i in range(m-1):
bonacci[i] = 0
bonacci[m-1] = 1
for i in range(m, n+1):
bonacci[i] = sum(bonacci[i-m:i])
return bonacci[n]
#B(m) = 1 para 1 <= m <= k
#B(n) = sum_{i=n-k}^{n-1} B(i) para n > k
#34. Calcule el número de Pell de un número entero en Python.
def pell_number(n):
"""
Calcula el número de Pell de un número entero n.
"""
if n == 0:
return 0
elif n == 1:
return 1
else:
pell = [0]*(n+1)
pell[0] = 0
pell[1] = 1
for i in range(2, n+1):
pell[i] = 2*pell[i-1] + pell[i-2]
return pell[n]
#P(0) = 0
#P(1) = 1
#P(n) = 2*P(n-1) + P(n-2) para n > 1
#35. Calcula el número de Lucas de un número entero en Python.
def lucas_number(n):
"""
Calcula el número de Lucas de un número entero n.
"""
if n == 0:
return 2
elif n == 1:
return 1
else:
lucas = [0]*(n+1)
lucas[0] = 2
lucas[1] = 1
for i in range(2, n+1):
lucas[i] = lucas[i-1] + lucas[i-2]
return lucas[n]
#L(0) = 2
#L(1) = 1
#L(n) = L(n-1) + L(n-2) para n > 1
#36. Calcula el número de Mersenne de un número entero en Python.
def mersenne_number(n):
"""
Calcula el número de Mersenne de un número entero n.
"""
if n == 0:
return 0
else:
return 2**n - 1
#M(n) = 2^n - 1
#37. Calcula el producto de dos matrices en Python.
def multiply_matrix(A, B):
"""
Calcula el producto de dos matrices A y B.
"""
if len(A[0]) == len(B):
C = [[0 for j in range(len(B[0]))] for i in range(len(A))]
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
C[i][j] += A[i][k] * B[k][j]
return C
else:
print("Las matrices no tienen las dimensiones adecuadas para la multiplicación.")
#38. Calcula el determinante de una matriz en Python.
def determinant(A):
"""
Calcula el determinante de una matriz A.
"""
n = len(A)
det = 0
if n == 1:
det = A[0][0]
elif n == 2:
det = A[0][0]*A[1][1] - A[0][1]*A[1][0]
else:
for j in range(n):
sign = (-1)**j
submatrix = [[A[i][k] for k in range(n) if k != j] for i in range(1, n)]
det += sign * A[0][j] * determinant(submatrix)
return det
#det(A) = a_{1,1} * det(A_{1,1}) - a_{1,2} * det(A_{1,2}) + ... + (-1)^{1+n} * a_{1,n} * det(A_{1,n})
#39. Calcula la inversa de una matriz en Python.
def inverse_matrix(A):
"""
Calcula la inversa de una matriz A.
"""
n = len(A)
A_inv = [[0 for j in range(n)] for i in range(n)]
det = determinant(A)
if det == 0:
print("La matriz no es invertible.")
return None
else:
for i in range(n):
for j in range(n):
sign = (-1)**(i+j)
submatrix = [[A[k][l] for l in range(n) if l != j] for k in range(n) if k != i]
A_inv[j][i] = sign * determinant(submatrix) / det
return A_inv
#40. Calcula el alineamiento óptimo entre dos secuencias en Python.
def optimal_alignment(s1, s2, match=1, mismatch=-1, gap=-1):
"""
Calcula el alineamiento óptimo entre dos secuencias s1 y s2.
"""
n = len(s1)
m = len(s2)
score = [[0 for j in range(m+1)] for i in range(n+1)]
for i in range(n+1):
score[i][0] = i * gap
for j in range(m+1):
score[0][j] = j * gap
for i in range(1, n+1):
for j in range(1, m+1):
if s1[i-1] == s2[j-1]:
diagonal = score[i-1][j-1] + match
else:
diagonal = score[i-1][j-1] + mismatch
up = score[i-1][j] + gap
left = score[i][j-1] + gap
score[i][j] = max(diagonal, up, left)
align1 = ""
align2 = ""
i = n
j = m
while i > 0 and j > 0:
if score[i][j] == score[i-1][j-1] + (match if s1[i-1] == s2[j-1] else mismatch):
align1 = s1[i-1] + align1
align2 = s2[j-1] + align2
i -= 1
j -= 1
elif score[i][j] == score[i-1][j] + gap:
align1 = s1[i-1] + align1
align2 = "-" + align2
i -= 1
else:
align1 = "-" + align1
align2 = s2[j-1] + align2
j -= 1
while i > 0:
align1 = s1[i-1] + align1
align2 = "-" + align2
i -= 1
while j > 0:
align1 = "-" + align1
align2 = s2[j-1] + align2
j -= 1
return align1, align2, score[n][m]
#41. Calcula la distancia de Levenshtein entre dos cadenas en Python.
def levenshtein_distance(s1, s2):
"""
Calcula la distancia de Levenshtein entre dos cadenas s1 y s2.
"""
n = len(s1)
m = len(s2)
d = [[0 for j in range(m+1)] for i in range(n+1)]
for i in range(n+1):
d[i][0] = i
for j in range(m+1):
d[0][j] = j
for j in range(1, m+1):
for i in range(1, n+1):
if s1[i-1] == s2[j-1]:
substitution_cost = 0
else:
substitution_cost = 1
d[i][j] = min(d[i-1][j] + 1, d[i][j-1] + 1, d[i-1][j-1] + substitution_cost)
return d[n][m]