Algorithmes fondamentaux et concepts mathématiques

Théorie des nombres

Algorithme d'Euclide pour le PGCD

Soient deux entiers positisf \(m,n\) avec \(m > n\). Le plus grand commun diviseur \(\gcd(m,n)\) satisfait la propriété \(\gcd(m,n) = \gcd(n, m \mod n)\).

Cette propriété permet de calculer le PGCD par réduction successive jusqu'à obtenir un reste nul.

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

Algorithme d'Euclide étendu

Le lemme de Bézout stipule que l'équation \(ax + by = c\) admet des solutions entières si et seulement si \(\gcd(a,b)\) divise \(c\). L'algorithme étendu fournit une solution particulière pour le cas \(ax + by = \gcd(a,b)\).

def bezout(a, b):
    if b == 0:
        return 1, 0, a
    else:
        u, v, d = bezout(b, a % b)
        return v, u - (a // b) * v, d

Inverse modulaire

L'inverse modulo \(p\) d'un entier \(x\) vérifie \(x \cdot y \equiv 1 \pmod{p}\). Il peut être déterminé via l'algorithme d'Euclide étendu lorsque \(\gcd(x,p) = 1\).

Crible d'Ératosthène

Le crible classique marque les multiples de chaque nombre premier trouvé. Sa complexité est \(O(n \log \log n)\).

def crible(n):
    est_premier = [True] * (n + 1)
    for i in range(2, int(n**0.5) + 1):
        if est_premier[i]:
            for j in range(i*i, n + 1, i):
                est_premier[j] = False
    return [i for i in range(2, n + 1) if est_premier[i]]

Crible linéaire (d'Euler)

Cette méthode garantit que chaque composé est marqué une seule fois par son plus petit facteur premier, assurant une complexité \(O(n)\).

def crible_euler(n):
    premiers = []
    plus_petit_facteur = [0] * (n + 1)
    for i in range(2, n + 1):
        if plus_petit_facteur[i] == 0:
            plus_petit_facteur[i] = i
            premiers.append(i)
        for p in premiers:
            if p > plus_petit_facteur[i] or p * i > n:
                break
            plus_petit_facteur[p * i] = p
    return premiers

Mathématiques

Exponentiation rapide

Le calcul de \(a^b\) modulo \(m\) s'effectue en décomposant l'exposant en binaire, réduisant la complexité à \(O(\log b)\).

def puissance_mod(base, exp, mod):
    resultat = 1
    base %= mod
    while exp > 0:
        if exp % 2 == 1:
            resultat = (resultat * base) % mod
        exp = exp >> 1
        base = (base * base) % mod
    return resultat

Espérance mathématique

L'espérance d'une variable aléatoire discrète est la somme des produits de chaque valeur par sa probabilité.

Algèbre linéaire

Matrice et déterminant

Le déterminent d'une matrice triangulaire supérieure est le produit des éléments diagonaux. Il peut être obtenu par élimination de Gauss.

Élimination de Gauss

La méthode de Gauss résout des systèmes linéaires en transformatn la matrice augmentée en forme échelonnée réduite.

import numpy as np

def gauss_jordan(A, b):
    n = len(b)
    M = np.hstack([A.astype(float), b.reshape(n, 1)])
    
    for col in range(n):
        # Pivot partiel
        max_row = np.argmax(np.abs(M[col:, col])) + col
        M[[col, max_row]] = M[[max_row, col]]
        
        # Élimination
        pivot = M[col, col]
        M[col] = M[col] / pivot
        for ligne in range(n):
            if ligne != col:
                facteur = M[ligne, col]
                M[ligne] -= facteur * M[col]
    
    return M[:, -1]

Mathématiques combinatoires

Théorème binomial

Le développement de \((x + y)^n\) correspond au nombre de façons de choisir \(k\) termes \(x\) parmi \(n\) facteurs.

Nombres de Stirling

Les nombres de Stirling de première espèce comptent les permutations de \(n\) éléments avec \(m\) cycles. Les nombres de deuxième espèce comptent les partitions d'un ensemble de \(n\) éléments en \(m\) sous-ensembles non vides.

Analyse

Sujet à compléter ultérieurement.

Étiquettes: pgcd algorithme-euclide crible-eratosthenes exponentiation-modulaire gauss-elimination

Publié le 17 juin à 21h04