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