Décomposition en facteurs premiers

Pour les élèves en Maths expertes + NSI.

L'exercice 6 de la feuille n°1. Partie 2

Notion de complexité

Exemple

Avec un algorithme en Θ(n)\Theta(\sqrt n ), qui met 4s4\,s pour traiter le cas n=106n = 10^6, on sait qu'il mettra 40s40\,s pour n=108n=10^8. En effet, on complète le tableau de proportionnalité suivant.

Entrée nn Temps (s)
106\sqrt{10^6} 44
108\sqrt{10^8}

Script en O(n)\mathcal O(n)

Nous avons reproduit ici notre script de la partie 1, en O(n)\mathcal O(n) :

def factor(n):
    """Renvoie une liste, la décomposition en facteurs premiers de n.
    >>> factor(6)
    [2, 3]
    >>> factor(8)
    [2, 2, 2]
    """
    assert n > 0
    Factor = []
    p = 2
    while n > 1:
        if n % p == 0:
            n //= p
            Factor.append(p)
            while n % p == 0:
                n //= p
                Factor.append(p)
        p += 1
    return Factor

La question est de faire un nouveau script qui donne une décomposition en facteurs premiers, en O(n)\mathcal O(\sqrt n).

Script en O(n)\mathcal O(\sqrt n)

C'était l'objet de l'exercice. Voici une solution.

def factor(n):
    """ Renvoie la décomposition en facteurs premiers de n
    >>> factor(6)
    [2, 3]
    >>> factor(50)
    [2, 5, 5]
    """
    assert n > 0
    Factor = []
    p = 2
    while p * p <= n:
        if n % p == 0:
            n //= p
            Factor.append(p)
            while n % p == 0:
                n //= p
                Factor.append(p)
        p += 1
    if n > 1:
        Factor.append(n)
    return Factor

Commentaires

On sort de la boucle quand p2>np^2 > n.

Dans ce cas, nn ne possède aucun facteur premier inférieur ou égal à n\sqrt n.
On déduit que n=1n=1, ou alors nn est premier.

Ce script permet d'obtenir très vite la décomposition en facteurs premiers de nombres tels que 20000000182\,000\,000\,018, en effet, le premier facteur 22 amène nn à 10000000091\,000\,000\,009 qui est un nombre premier.