Efficacement trouver tous les diviseurs d'un nombre

Donc, je veux simplement trouver tous les diviseurs d'un nombre donné (à l'exception du nombre lui-même).
Actuellement, j'ai ceci:

public static List<int> proper_divisors(int x)
{
    List<int> toreturn = new List<int>();
    toreturn.Add(1);
    int i = 0;
    int j=1;
    int z = 0;
    while (primes.ElementAt(i) < Math.Sqrt(x))
    {
        if (x % primes.ElementAt(i) == 0)
        {
            toreturn.Add(primes.ElementAt(i));
            toreturn.Add(x / primes.ElementAt(i));
            j = 2;
            z = (int)Math.Pow(primes.ElementAt(i), 2);
            while (z < x)
            {
                if (x % z == 0)
                {
                    toreturn.Add(z);
                    toreturn.Add(x / z);
                    j++;
                    z = (int)Math.Pow(primes.ElementAt(i), j);
                }
                else
                {
                    z = x;
                }
            }
        }
        i++;
    }
    toreturn = toreturn.Distinct().ToList<int>();
    return toreturn;
}

où les nombres premiers est une liste de nombres premiers (à supposer qu'il est correct, et est assez grand).
L'algorithme fonctionne dans le sens qu'il trouve tous les facteurs premiers, mais pas tous les facteurs (c'est à dire étant donné 34534, il retourne {1,2,17267,31,1114} mais rate {62, 557} 62 est une combinaison, et, par conséquent, manque 557.

J'ai aussi essayé simplement d'obtenir les facteurs premiers d'un nombre, mais je ne sais pas comment faire pour les convertir en une liste de toutes les corriger combinaisons.

Le code pour que l'algorithme est le suivant:

public static List<int> prime_factors(int x)
{
    List<int> toreturn = new List<int>();
    int i = 0;
    while (primes.ElementAt(i) <= x)
    {
        if (x % primes.ElementAt(i) == 0)
        {
            toreturn.Add(primes.ElementAt(i));
            x = x / primes.ElementAt(i);
        }
        else
        {
            i++;
        }
    }
    return toreturn;
}

Des idées sur la façon de résoudre le premier, ou comment créer la liste des combinaisons à partir de la seconde (je préfère qu'il serait plus rapide)?

OriginalL'auteur soandos | 2011-04-26