10 exemples d'algorismes matemàtics

Darrera actualització: 30 de juny de 2025
  • Els algorismes matemàtics són essencials en tecnologia, permetent resoldre problemes complexos de manera eficient.
  • L'Algorisme d'Euclides i la Criba d'Eratòstenes són exemples clàssics amb aplicacions pràctiques.
  • El mètode del gradient descendent és utilitzat en machine learning per optimitzar funcions.
  • L'RSA i la codificació de Huffman són fonamentals en criptografia i compressió de dades, respectivament.
exemples d'algorismes matemàtics

Els algorismes matemàtics són el cor palpitant de la tecnologia moderna. Des dels càlculs més simples fins als processos més complexos, aquests algoritmes impulsen innombrables aplicacions que fem servir diàriament. En aquest article, ens endinsarem món d'exemples d'algorismes matemàtics, explorant exemples concrets que en demostren el poder i la versatilitat.

Exemples d'algorismes matemàtics

Els exemples d'algorismes matemàtics comprenen una àmplia gamma d'aplicacions, des de la resolució de problemes bàsics d'aritmètica fins al processament de dades complexes en intel·ligència artificial. Aquests algoritmes són les eines fonamentals que permeten als ordinadors fer càlculs i prendre decisions de manera eficient i precisa.

Alguns exemples d'algorismes matemàtics comuns inclouen algoritmes per trobar el màxim comú divisor, ordenar llistes de números, buscar el camí més curt en un graf, o comprimir dades. Cadascun d'aquests algorismes té les seves pròpies característiques i aplicacions específiques, cosa que els fa invaluables en diferents camps de la ciència i la tecnologia.

Però què fa que un algorisme matemàtic sigui realment útil? L'eficiència, precisió i escalabilitat són factors clau. Un bon algorisme ha de poder resoldre problemes ràpidament, manejar grans quantitats de dades i produir resultats fiables en diverses situacions.

1. Algorisme d'Euclides per al màxim comú divisor

Un dels exemples més antics i fonamentals d'algorismes matemàtics és l'algorisme d'Euclides. Aquest algorisme, desenvolupat pel matemàtic grec Euclides al voltant del 300 aC, s'utilitza per trobar el màxim comú divisor (MCD) de dos números.

L'algorisme funciona de la manera següent:

  1. Pren dos nombres enters positius.
  2. Divideix el nombre més gran pel més petit.
  3. Si el residu és zero, el divisor és el MCD.
  4. Si no, repeteix el procés usant el divisor com a nou dividend i el residu com a nou divisor.

Vegem-ne un exemple pràctic:

def mcd_euclides(a, b):
    while b != 0:
        a, b = b, a % b
    return a

# Ejemplo de uso
print(mcd_euclides(48, 18))  # Resultado: 6

Aquest algorisme és sorprenentment eficient i se segueix utilitzant actualment en diverses aplicacions, des de la simplificació de fraccions fins a la criptografia moderna.

2. Separació d'Eratòstenes per a nombres primers

La Criba d'Eratòstenes és un altre exemple clàssic d'algorisme matemàtic. Desenvolupat pel matemàtic grec Eratòstenes al segle III aC, aquest algorisme s'utilitza per trobar tots els nombres primers fins a un límit donat.

El procés és enginyosament simple:

  1. Crea una llista de números del 2 al límit desitjat.
  2. El primer número de la llista (2) és primer. Marca tots els seus múltiples com no cosins.
  3. El següent número no marcat és primer. Repeteix el pas 2.
  4. Continua fins que hagis processat tots els números fins a l'arrel quadrada del límit.

Aquí tens una implementació bàsica a Python:

def criba_eratostenes(n):
    primos = [True] * (n + 1)
    primos[0] = primos[1] = False

    for i in range(2, int(n**0.5) + 1):
        if primos[i]:
            for j in range(i*i, n+1, i):
                primos[j] = False

    return [i for i in range(n+1) if primos[i]]

# Ejemplo de uso
print(criba_eratostenes(30))  # Resultado: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

Aquest algorisme és sorprenentment eficient per trobar nombres primers i s'utilitza en diversos camps, des de la teoria de números fins a la criptografia.

3. Algorisme d'ordenament bombolla

L'algorisme d' ordenament bombolla és un dels exemples més senzills d'algorismes d'ordenació. Tot i que no és el més eficient per a grans conjunts de dades, és fàcil d'entendre i serveix com una introducció excel·lent als conceptes d'ordenament.

L'algorisme funciona de la manera següent:

  1. Compara elements adjacents d'una llista.
  2. Si esteu en l'ordre incorrecte, els intercanvieu.
  3. Repeteix aquest procés per a tota la llista fins que no es necessitin més intercanvis.

Vegem una implementació a Python:

def ordenamiento_burbuja(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

# Ejemplo de uso
lista = [64, 34, 25, 12, 22, 11, 90]
print(ordenamiento_burbuja(lista))  # Resultado: [11, 12, 22, 25, 34, 64, 90]

Tot i que l'ordenament bombolla no és eficient per a grans conjunts de dades , la seva simplicitat el fa útil per ensenyar conceptes de programació i ordenar petites quantitats d'elements.

  Living Intelligence: què és, com funciona i per què importa

4. Cerca binària

La cerca binària és un algorisme eficient per trobar un element en una llista ordenada. A diferència de la cerca lineal, que revisa cada element un per un, la cerca binària divideix repetidament la llista per la meitat, reduint dràsticament el temps de cerca.

L'algorisme funciona així:

  1. Comença amb l'element mitjà de la llista ordenada.
  2. Si l'element cercat és igual a l'element mitjà, la cerca s'acaba.
  3. Si l'element cercat és menor, repetiu la cerca a la meitat inferior de la llista.
  4. Si l'element cercat és més gran, repetiu la cerca a la meitat superior de la llista.
  5. Continua dividint la llista fins a trobar l'element o determinar que no és present.

Aquí tens una implementació a Python:

```python
def busqueda_binaria(arr, x):
    bajo = 0
    alto = len(arr) - 1

    while bajo <= alto:
        medio = (bajo + alto) // 2
        if arr[medio] == x:
            return medio
        elif arr[medio] < x:
            bajo = medio + 1
        else:
            alto = medio - 1

    return -1  # El elemento no está en la lista

# Ejemplo de uso
lista_ordenada = [2, 3, 4, 10, 40]
print(busqueda_binaria(lista_ordenada, 10))  # Resultado: 3 (índice del elemento 10)

La cerca binària és extremadament eficient, especialment per a grans conjunts de dades, i s'utilitza en moltes aplicacions, des de la cerca en bases de dades fins a l'optimització de jocs.

5. Mètode del gradient descendent

El mètode del gradient descendent és un algorisme d'optimització àmpliament utilitzat en machine learning i anàlisi numèrica. S'utilitza per trobar el mínim d'una funció, cosa que és crucial en problemes com l'entrenament de xarxes neuronals.

L'algorisme funciona de la manera següent:

  1. Comença amb un punt inicial a la funció.
  2. Calcula la direcció del gradient (el pendent) en aquest punt.
  3. Fa un petit pas en la direcció oposada al gradient (descendint).
  4. Repetiu els passos 2 i 3 fins que el gradient sigui gairebé zero o s'arribi a un nombre màxim d'iteracions.

Aquí teniu un exemple simplificat a Python per a una funció d'una variable:

def gradiente_descendente(funcion, derivada, punto_inicial, tasa_aprendizaje, num_iteraciones):
    x = punto_inicial
    for _ in range(num_iteraciones):
        gradiente = derivada(x)
        x = x - tasa_aprendizaje * gradiente
    return x

# Ejemplo: Encontrar el mínimo de f(x) = x^2 + 2x + 1
def f(x):
    return x**2 + 2*x + 1

def df(x):
    return 2*x + 2

minimo = gradiente_descendente(f, df, 0, 0.1, 100)
print(f"El mínimo se encuentra en x = {minimo}")

Aquest algorisme és fonamental en laprenentatge automàtic, on sutilitza per optimitzar els paràmetres de models complexos.

6. Algorisme de Dijkstra per al camí més curt

L'algorisme de Dijkstra és un exemple clàssic d' algorisme de grafs que es fa servir per trobar el camí més curt entre un node i tots els altres nodes en un graf amb pesos positius.

L'algorisme funciona de la manera següent:

  1. Assigna una distància temptativa a cada node: 0 per al node inicial, infinit per als altres.
  2. Marca tots els nodes com a no visitats i estableix el node inicial com a node actual.
  3. Per al node actual, considera tots els seus veïns no visitats i calcula'n les distàncies temptatives.
  4. Quan s'han considerat tots els veïns del node actual, marqueu-lo com a visitat.
  5. Si el node de destinació ha estat marcat com a visitat, l'algorisme ha acabat.
  6. Si no, seleccioneu el node no visitat amb la menor distància temptativa i repetiu des del pas 3.

Aquí tens una implementació simplificada a Python:

import heapq

def dijkstra(grafo, inicio):
    distancias = {nodo: float('inf') for nodo in grafo}
    distancias[inicio] = 0
    pq = [(0, inicio)]

    while pq:
        distancia_actual, nodo_actual = heapq.heappop(pq)

        if distancia_actual > distancias[nodo_actual]:
            continue

        for vecino, peso in grafo[nodo_actual].items():
            distancia = distancia_actual + peso
            if distancia < distancias[vecino]:
                distancias[vecino] = distancia
                heapq.heappush(pq, (distancia, vecino))

    return distancias

# Ejemplo de uso
grafo = {
    'A': {'B': 4, 'C': 2},
    'B': {'D': 3, 'E': 1},
    'C': {'B': 1, 'D': 5},
    'D': {'E': 2},
    'E': {}
}
print(dijkstra(grafo, 'A'))

Aquest algorisme té nombroses aplicacions pràctiques, des de la planificació de rutes en sistemes de navegació GPS fins a l'optimització de xarxes de comunicació.

  Raonament profund en intel·ligència artificial: guia completa

7. Eliminació gaussiana

L'eliminació gaussiana és un algorisme fonamental en àlgebra lineal utilitzat per resoldre sistemes d'equacions lineals. Aquest mètode transforma un sistema d‟equacions en una forma equivalent més fàcil de resoldre mitjançant una seqüència d‟operacions.

El procés bàsic és el següent:

  1. Convertir el sistema dʻequacions en una matriu augmentada.
  2. Usar operacions de fila per convertir la matriu en forma esglaonada.
  3. Resoldre el sistema resultant per substitució cap enrere.

Vegem una implementació simplificada a Python:

import numpy as np

def eliminacion_gaussiana(A, b):
    n = len(A)
    # Crear la matriz aumentada
    Ab = np.column_stack((A, b))

    for i in range(n):
        # Encontrar el pivote máximo en la columna actual
        max_element = abs(Ab[i][i])
        max_row = i
        for k in range(i + 1, n):
            if abs(Ab[k][i]) > max_element:
                max_element = abs(Ab[k][i])
                max_row = k

        # Intercambiar la fila máxima con la fila actual
        Ab[i], Ab[max_row] = Ab[max_row], Ab[i].copy()

        # Hacer que todos los elementos debajo del pivote sean cero
        for k in range(i + 1, n):
            c = -Ab[k][i] / Ab[i][i]
            for j in range(i, n + 1):
                if i == j:
                    Ab[k][j] = 0
                else:
                    Ab[k][j] += c * Ab[i][j]

    # Resolver por sustitución hacia atrás
    x = np.zeros(n)
    for i in range(n - 1, -1, -1):
        x[i] = Ab[i][n] / Ab[i][i]
        for k in range(i - 1, -1, -1):
            Ab[k][n] -= Ab[k][i] * x[i]

    return x

# Ejemplo de uso
A = np.array([[2, 1, -1],
              [-3, -1, 2],
              [-2, 1, 2]])
b = np.array([8, -11, -3])

print(eliminacion_gaussiana(A, b))  # Resultado: [2. 3. -1.]

L'eliminació gaussiana és crucial en moltes aplicacions d'enginyeria i de ciències, des de l'anàlisi estructural fins al processament de senyals.

8. Algorisme RSA

L'algorisme RSA és un dels exemples més importants d'algorismes matemàtics al camp de la criptografia. Desenvolupat per Ron Rivest, Adi Shamir i Leonard Adleman el 1977, RSA s'utilitza àmpliament per al xifratge de clau pública i la signatura digital.

El funcionament bàsic del RSA es basa en la dificultat computacional de factoritzar el producte de dos nombres primers grans. Aquí us presento una versió simplificada de l'algorisme:

  1. Triar dos nombres primers grans, pi q.
  2. Calculeu n = p * q.
  3. Calculeu φ(n) = (p-1) * (q-1).
  4. Escollir un número e, coprimeixo amb φ(n), que serà la clau pública.
  5. Calculeu d, l'invers multiplicatiu d'e mòdul φ(n), que serà la clau privada.

Per xifrar un missatge m, es fa servir la fórmula: c = m^e mod n Per desxifrar el missatge xifrat c, s'usa: m = c^d mod n

Vegem una implementació bàsica a Python:

import random

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def multiplicative_inverse(e, phi):
    d = 0
    x1 = 0
    x2 = 1
    y1 = 1
    temp_phi = phi

    while e > 0:
        temp1 = temp_phi // e
        temp2 = temp_phi - temp1 * e
        temp_phi = e
        e = temp2

        x = x2 - temp1 * x1
        y = d - temp1 * y1

        x2 = x1
        x1 = x
        d = y1
        y1 = y

    if temp_phi == 1:
        return d + phi

def generate_keypair(p, q):
    n = p * q
    phi = (p-1) * (q-1)

    e = 65537
    g = gcd(e, phi)
    while g != 1:
        e = random.randrange(1, phi)
        g = gcd(e, phi)

    d = multiplicative_inverse(e, phi)
    return ((e, n), (d, n))

def encrypt(pk, plaintext):
    key, n = pk
    cipher = [pow(ord(char), key, n) for char in plaintext]
    return cipher

def decrypt(pk, ciphertext):
    key, n = pk
    plain = [chr(pow(char, key, n)) for char in ciphertext]
    return ''.join(plain)

# Ejemplo de uso
p = 61
q = 53
public, private = generate_keypair(p, q)
mensaje = "Hola, mundo!"
cifrado = encrypt(public, mensaje)
descifrado = decrypt(private, cifrado)
print(f"Mensaje original: {mensaje}")
print(f"Mensaje cifrado: {cifrado}")
print(f"Mensaje descifrado: {descifrado}")

L'algorisme RSA és fonamental en la seguretat d'Internet, protegint milions de transaccions en línia diàriament.

9. Codificació de Huffman

La codificació de Huffman és un algorisme de compressió de dades sense pèrdua que s'utilitza per reduir la mida de les dades transmeses o emmagatzemades. Va ser desenvolupat per David A. Huffman el 1952 i segueix sent àmpliament utilitzat en formats de compressió moderns.

L'algorisme funciona assignant codis més curts als símbols més freqüents i codis més llargs als menys freqüents. Aquí hi ha els passos bàsics:

  1. Calcular la freqüència de cada símbol a les dades.
  2. Crear un node fulla per a cada símbol i afegir-lo a una cua de prioritat.
  3. Mentre hi hagi més d'un node a la cua:
    • Extreure els dos nodes amb les freqüències més baixes.
    • Crear un nou node intern amb aquests dos nodes com a fills.
    • Afegir aquest nou node a la cua.
  4. L'últim node restant és l'arrel de l'arbre de Huffman.
  5. Assigneu codis binaris recorrent l'arbre (0 per a esquerra, 1 per a dreta).
  La Importància de saber per a què serveix un Algorisme al segle XXI

Vegem una implementació bàsica a Python:

import heapq
from collections import defaultdict

class NodoHuffman:
    def __init__(self, char, freq):
        self.char = char
        self.freq = freq
        self.left = None
        self.right = None

    def __lt__(self, other):
        return self.freq < other.freq

def construir_arbol_huffman(texto):
    frecuencias = defaultdict(int)
    for char in texto:
        frecuencias[char] += 1

    heap = [NodoHuffman(char, freq) for char, freq in frecuencias.items()]
    heapq.heapify(heap)

    while len(heap) > 1:
        izq = heapq.heappop(heap)
        der = heapq.heappop(heap)
        nodo_interno = NodoHuffman(None, izq.freq + der.freq)
        nodo_interno.left = izq
        nodo_interno.right = der
        heapq.heappush(heap, nodo_interno)

    return heap[0]

def generar_codigos(raiz, codigo_actual="", codigos={}):
    if raiz is None:
        return

    if raiz.char is not None:
        codigos[raiz.char] = codigo_actual
        return

    generar_codigos(raiz.left, codigo_actual + "0", codigos)
    generar_codigos(raiz.right, codigo_actual + "1", codigos)

    return codigos

# Ejemplo de uso
texto = "este es un ejemplo de codificacion de huffman"
raiz = construir_arbol_huffman(texto)
codigos = generar_codigos(raiz)

print("Códigos de Huffman:")
for char, codigo in codigos.items():
    print(f"'{char}': {codigo}")

texto_codificado = ''.join(codigos[char] for char in texto)
print(f"\nTexto original: {len(texto)*8} bits")
print(f"Texto comprimido: {len(texto_codificado)} bits")
print(f"Tasa de compresión: {(1 - len(texto_codificado)/(len(texto)*8))*100:.2f}%")

La codificació de Huffman s'utilitza en molts formats de compressió, incloent JPEG, PNG i MP3, ajudant a reduir significativament la mida de fitxers.

10. K-means per a clustering

L'algorisme K-means és un dels exemples més populars d'algorismes d'aprenentatge no supervisat. S'utilitza per agrupar dades en K-clusters basant-se en la similitud de les seves característiques.

L'algorisme funciona de la manera següent:

  1. Escollir K punts a l'atzar com a centreides inicials.
  2. Assigneu cada punt de dades al centreide més proper.
  3. Recalcular la posició de cada centroide com la mitjana de tots els punts assignats a ell.
  4. Repetiu els passos 2 i 3 fins que els centroides no canviïn significativament o s'assoleixi un nombre màxim d'iteracions.

Aquí tens una implementació bàsica a Python utilitzant NumPy:

import numpy as np
import matplotlib.pyplot as plt

def kmeans(X, k, max_iters=100):
    # Inicializar centroides aleatoriamente
    centroides = X[np.random.choice(X.shape[0], k, replace=False)]

    for _ in range(max_iters):
        # Asignar puntos a centroides
        distancias = np.sqrt(((X - centroides[:, np.newaxis])**2).sum(axis=2))
        etiquetas = np.argmin(distancias, axis=0)

        # Actualizar centroides
        nuevos_centroides = np.array([X[etiquetas == i].mean(axis=0) for i in range(k)])

        # Comprobar convergencia
        if np.all(centroides == nuevos_centroides):
            break

        centroides = nuevos_centroides

    return etiquetas, centroides

# Generar datos de ejemplo
np.random.seed(42)
X = np.concatenate([
    np.random.normal(0, 1, (100, 2)),
    np.random.normal(5, 1, (100, 2)),
    np.random.normal(10, 1, (100, 2))
])

# Aplicar K-means
k = 3
etiquetas, centroides = kmeans(X, k)

# Visualizar resultados
plt.scatter(X[:, 0], X[:, 1], c=etiquetas, cmap='viridis')
plt.scatter(centroides[:, 0], centroides[:, 1], c='red', marker='x', s=200, linewidths=3)
plt.title('K-means Clustering')
plt.show()

K-means és àmpliament utilitzat en anàlisi de dades , segmentació de clients, compressió d'imatges i moltes altres aplicacions on cal agrupar dades similars.

Conclusió i perspectives futures

Els exemples d'algorismes matemàtics que hem explorat són només la punta de l'iceberg al vast oceà de la computació i les matemàtiques aplicades. Des dels antics mètodes d'Euclides fins a les tècniques modernes de machine learning, aquests algoritmes formen la columna vertebral de la tecnologia que fem servir cada dia.

A mesura que avancem cap a un futur cada cop més digitalitzat, la importància d'aquests algorismes només augmentarà. Els desafiaments en camps com la intel·ligència artificial, la criptografia quàntica i el big data requeriran algorismes encara més sofisticats i eficients.

Què ens ofereix el futur? És probable que vegem avenços significatius en algoritmes d'aprenentatge profund, capaços de processar i comprendre dades cada cop més complexes. També podem esperar desenvolupaments en algorismes quàntics, que prometen resoldre certs problemes molt més ràpid que els ordinadors clàssiques.

L'evolució dels algorismes matemàtics continuarà impulsant la innovació a tots els camps de la ciència i la tecnologia. Com hem vist, aquests algoritmes no són només eines abstractes, sinó solucions pràctiques a problemes del món real.

T'ha semblat interessant aquest viatge pel món d'exemples d'algorismes matemàtics? Quins altres exemples d'algorismes voldríeu explorar? No dubtis a compartir aquest article i continuar la conversa sobre el fascinant món de les matemàtiques i la computació.