10 primjera matematičkih algoritama

Zadnje ažuriranje: 30 lipnja 2025
  • Matematički algoritmi su ključni u tehnologiji jer omogućuju učinkovito rješavanje složenih problema.
  • Euklidov algoritam i Eratostenovo sito su klasični primjeri s praktičnom primjenom.
  • Metoda gradijentnog spusta koristi se u strojnom učenju za optimizaciju funkcija.
  • RSA i Huffmanovo kodiranje su temeljni u kriptografiji i kompresiji podataka.
primjeri matematičkih algoritama

Matematički algoritmi srce su moderne tehnologije. Od najjednostavnijih izračuna do najsloženijih procesa, ovi algoritmi pokreću nebrojene aplikacije koje koristimo svaki dan. U ovom ćemo članku zaroniti u svijet primjera matematičkih algoritama, istražujući konkretne primjere koji pokazuju njihovu snagu i svestranost.

Primjeri matematičkih algoritama

Primjeri matematičkih algoritama pokrivaju širok raspon primjena, od rješavanja osnovnih aritmetičkih problema do obrade složenih podataka u umjetnoj inteligenciji. Ovi algoritmi temeljni su alati koji omogućuju računalima učinkovito i točno izvođenje izračuna i donošenje odluka.

Neki primjeri uobičajenih matematičkih algoritama uključuju algoritme za pronalaženje najvećeg zajedničkog djelitelja, sortiranje popisa brojeva, pronalaženje najkraćeg puta u grafu ili komprimiranje podataka. Svaki od ovih algoritama ima svoje specifične karakteristike i primjene, što ih čini neprocjenjivima u različitim područjima znanosti i tehnologije.

Ali što čini matematički algoritam stvarno korisnim? Učinkovitost, točnost i skalabilnost ključni su čimbenici. Dobar algoritam trebao bi moći brzo riješiti probleme, rukovati velikim količinama podataka i proizvoditi pouzdane rezultate u različitim situacijama.

1. Euklidov algoritam za najveći zajednički djelitelj

Jedan od najstarijih i najtemeljnijih primjera matematičkih algoritama je Euklidov algoritam. Ovaj algoritam, koji je razvio grčki matematičar Euklid oko 300. pr. Kr., koristi se za pronalaženje najvećeg zajedničkog djelitelja (GCD) dvaju brojeva.

Algoritam radi na sljedeći način:

  1. Uzmite dva pozitivna cijela broja.
  2. Podijelite veći broj s manjim brojem.
  3. Ako je ostatak nula, djelitelj je GCD.
  4. Ako nije, ponovite postupak koristeći djelitelj kao novu dividendu i ostatak kao novi djelitelj.

Pogledajmo praktičan primjer:

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

Ovaj je algoritam iznenađujuće učinkovit te se i danas koristi u raznim primjenama, od pojednostavljivanja razlomaka do moderne kriptografije.

2. Eratostenovo sito za proste brojeve

Eratostenovo sito još je jedan klasičan primjer matematičkog algoritma. Ovaj algoritam koji je razvio grčki matematičar Eratosten u 3. stoljeću prije Krista koristi se za pronalaženje svih prostih brojeva do zadane granice.

Proces je genijalno jednostavan:

  1. Napravite popis brojeva od 2 do željenog ograničenja.
  2. Prvi broj na listi (2) je prost. Označite sve njegove višekratnike kao neproste.
  3. Sljedeći neoznačeni broj je prost. Ponovite korak 2.
  4. Nastavite dok ne obradite sve brojeve do kvadratnog korijena granice.

Evo osnovne implementacije u Pythonu:

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]

Ovaj je algoritam iznenađujuće učinkovit u pronalaženju prostih brojeva i koristi se u raznim područjima od teorije brojeva do kriptografije.

3. Algoritam sortiranja mjehurićima

Algoritam mjehurićastog sortiranja jedan je od najjednostavnijih primjera algoritama za sortiranje. Iako nije najučinkovitiji za velike skupove podataka, lako ga je razumjeti i služi kao izvrstan uvod u koncepte sortiranja.

Algoritam radi na sljedeći način:

  1. Uspoređuje susjedne elemente na popisu.
  2. Ako su u pogrešnom redoslijedu, zamijenite ih.
  3. Ponovite ovaj postupak za cijeli popis dok više ne budu potrebne razmjene.

Pogledajmo Python implementaciju:

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]

Iako mjehurićasto sortiranje nije učinkovito za velike skupove podataka , njegova jednostavnost čini ga korisnim za podučavanje programskih koncepata i za sortiranje malih količina elemenata.

  Strukture podataka u programiranju: konačni vodič

4. Binarno pretraživanje

Binarno pretraživanje je učinkovit algoritam za pronalaženje elementa u sortiranom popisu. Za razliku od linearnog pretraživanja, koje provjerava svaki element jedan po jedan, binarno pretraživanje više puta dijeli popis na pola, drastično smanjujući vrijeme pretraživanja.

Algoritam radi ovako:

  1. Započnite sa srednjim elementom sortirane liste.
  2. Ako je traženi element jednak srednjem elementu, pretraga završava.
  3. Ako je tražena stavka manja, ponovite pretragu na donjoj polovici popisa.
  4. Ako je tražena stavka veća, ponovite pretragu u gornjoj polovici popisa.
  5. Nastavite dijeliti popis dok ne pronađete stavku ili utvrdite da nije prisutna.

Evo implementacije Pythona:

```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)

Binarno pretraživanje je izuzetno učinkovito, posebno za velike skupove podataka, i koristi se u mnogim primjenama, od pretraživanja baza podataka do optimizacije igara.

5. Metoda gradijentnog spuštanja

Metoda gradijentnog spuštanja je optimizacijski algoritam koji se široko koristi u strojnom učenju i numeričkoj analizi. Koristi se za pronalaženje minimuma funkcije, što je ključno u problemima kao što je treniranje neuronskih mreža.

Algoritam radi na sljedeći način:

  1. Počnite s početnom točkom u funkciji.
  2. Izračunajte smjer gradijenta (nagib) u toj točki.
  3. Napravite mali korak u smjeru suprotnom od gradijenta (prema dolje).
  4. Ponavljajte korake 2 i 3 sve dok gradijent ne postane gotovo nula ili dok se ne postigne maksimalan broj ponavljanja.

Evo pojednostavljenog primjera u Pythonu za funkciju s jednom varijablom:

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}")

Ovaj je algoritam temeljni u strojnom učenju, gdje se koristi za optimizaciju parametara složenih modela.

6. Dijkstrin algoritam za najkraći put

Dijkstrin algoritam je klasičan primjer algoritma za graf koji se koristi za pronalaženje najkraćeg puta između čvora i svih ostalih čvorova u grafu s pozitivnim težinama.

Algoritam radi na sljedeći način:

  1. Dodijelite privremenu udaljenost svakom čvoru: 0 za početni čvor, beskonačno za ostale.
  2. Označite sve čvorove kao neposjećene i postavite početni čvor kao trenutni čvor.
  3. Za trenutni čvor, uzmite u obzir sve njegove neposjećene susjede i izračunajte njihove privremene udaljenosti.
  4. Kada se uzmu u obzir svi susjedi trenutnog čvora, označite ga kao posjećenog.
  5. Ako je odredišni čvor označen kao posjećen, algoritam je završen.
  6. Ako nije, odaberite neposjećeni čvor s najmanjom probnom udaljenošću i ponovite od koraka 3.

Evo pojednostavljene implementacije u Pythonu:

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'))

Ovaj algoritam ima brojne praktične primjene, od planiranja rute u GPS navigacijskim sustavima do optimizacije komunikacijskih mreža.

  Kako napraviti algoritam od nule: Sve što trebate znati

7. Gaussova eliminacija

Gaussova eliminacija je temeljni algoritam u linearnoj algebri koji se koristi za rješavanje sustava linearnih jednadžbi. Ova metoda transformira sustav jednadžbi u ekvivalentan oblik koji je lakše riješiti nizom operacija.

Osnovni proces je sljedeći:

  1. Pretvorite sustav jednadžbi u proširenu matricu.
  2. Upotrijebite operacije redaka da biste matricu pretvorili u oblik reda reda.
  3. Dobiveni sustav riješite povratnom zamjenom.

Pogledajmo pojednostavljenu implementaciju u Pythonu:

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.]

Gaussova eliminacija ključna je u mnogim inženjerskim i znanstvenim primjenama, od strukturne analize do obrade signala.

8. RSA algoritam

RSA algoritam jedan je od najvažnijih primjera matematičkih algoritama u području kriptografije. Razvili su ga Ron Rivest, Adi Shamir i Leonard Adleman 1977., RSA se široko koristi za enkripciju s javnim ključem i digitalne potpise.

Osnovna operacija RSA-a temelji se na računskoj težini rastavljanja umnoška dva velika prosta broja. Evo pojednostavljene verzije algoritma:

  1. Odaberite dva velika prosta broja, p i q.
  2. Izračunajte n = p * q.
  3. Izračunajte φ(n) = (p-1) * (q-1).
  4. Odaberite broj e, koprost s φ(n), koji će biti javni ključ.
  5. Izračunajte d, multiplikativni inverz od e po modulu φ(n), koji će biti privatni ključ.

Za šifriranje poruke m koristi se formula: c = m^e mod n Za dešifriranje šifrirane poruke c koristi se formula: m = c^d mod n

Pogledajmo osnovnu implementaciju u Pythonu:

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}")

RSA algoritam temelj je internetske sigurnosti, štiteći milijune online transakcija svaki dan.

9. Huffmanovo kodiranje

Huffmanovo kodiranje je algoritam kompresije podataka bez gubitaka koji se koristi za smanjenje veličine prenesenih ili pohranjenih podataka. Razvio ga je David A. Huffman 1952. i još uvijek se široko koristi u modernim formatima kompresije.

Algoritam funkcionira dodjeljivanjem kraćih kodova češćim simbolima i dužih kodova rjeđim. Evo osnovnih koraka:

  1. Izračunajte učestalost svakog simbola u podacima.
  2. Stvorite lisni čvor za svaki simbol i dodajte ga u red prioriteta.
  3. Sve dok postoji više od jednog čvora u redu:
    • Izdvojite dva čvora s najnižim frekvencijama.
    • Stvorite novi interni čvor s ova dva čvora kao djecu.
    • Dodajte ovaj novi čvor u red čekanja.
  4. Posljednji preostali čvor je korijen Huffmanovog stabla.
  5. Dodijelite binarne kodove prelazeći stablo (0 lijevo, 1 desno).
  Algoritamsko razmišljanje: 10 ključeva za svladavanje računalne logike

Pogledajmo osnovnu implementaciju u Pythonu:

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}%")

Huffmanovo kodiranje koristi se u mnogim formatima kompresije, uključujući JPEG, PNG i MP3, što pomaže značajnom smanjenju veličine datoteka.

10. K-srednje vrijednosti za grupiranje

Algoritam K-means jedan je od najpopularnijih primjera algoritama učenja bez nadzora. Koristi se za grupiranje podataka u K klastera na temelju sličnosti njihovih karakteristika.

Algoritam radi na sljedeći način:

  1. Odaberite K nasumičnih točaka kao početne težišnice.
  2. Dodijelite svaku podatkovnu točku najbližem težištu.
  3. Ponovno izračunajte položaj svakog težišta kao prosjek svih točaka koje su mu dodijeljene.
  4. Ponavljajte korake 2 i 3 dok se težišne točke ne promijene značajno ili dok se ne postigne maksimalan broj ponavljanja.

Evo osnovne implementacije u Pythonu koristeći 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 se široko koristi u analizi podataka , segmentaciji kupaca, kompresiji slika i mnogim drugim primjenama gdje je potrebno grupirati slične podatke.

Zaključak i budući izgledi

Primjeri matematičkih algoritama koje smo istražili samo su vrh ledenog brijega u ogromnom oceanu računarstva i primijenjene matematike. Od drevnih Euklidovih metoda do modernih tehnika strojnog učenja, ti algoritmi čine okosnicu tehnologije koju koristimo svaki dan.

Kako se krećemo prema sve digitaliziranijoj budućnosti, važnost ovih algoritama samo će rasti. Izazovi u područjima kao što su umjetna inteligencija, kvantna kriptografija i veliki podaci zahtijevat će još sofisticiranije i učinkovitije algoritme.

Što nosi budućnost? Vjerojatno ćemo vidjeti značajan napredak u algoritmima dubokog učenja, sposobnim za obradu i razumijevanje sve složenijih podataka. Možemo očekivati ​​i razvoj kvantnih algoritama koji obećavaju rješavanje određenih problema puno brže od klasičnih računala.

Evolucija matematičkih algoritama nastavit će poticati inovacije u svim područjima znanosti i tehnologije. Kao što smo vidjeli, ovi algoritmi nisu samo apstraktni alati, već praktična rješenja za probleme iz stvarnog svijeta.

Je li vam bilo zanimljivo ovo putovanje kroz svijet primjera matematičkih algoritama? Koje biste još primjere algoritama željeli istražiti? Slobodno podijelite ovaj članak i nastavite razgovor o fascinantnom svijetu matematike i računarstva.