Эффективное нахождение всех делителей числа

Итак, я просто хочу найти все делители данного числа (кроме самого числа). В настоящее время у меня есть это:

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;
}

, где простые числа - это список простых чисел (предположим, что он правильный и достаточно большой). Алгоритм работает в том смысле, что он находит все простые множители, но не все множители (т. Е. Для 34534 он возвращает {1,2,17267,31,1114}, но пропускает {62, 557}, поскольку 62 является комбинацией, и поэтому также пропущено 557.

Я также пробовал просто получить простые множители числа, но я не знаю, как преобразовать это в список всех правильных комбинаций.

Код для этого алгоритм выглядит следующим образом:

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;
}

Есть идеи, как исправить первое или как создать список комбинаций из второго (я бы предпочел, чтобы это было быстрее)?

11
задан Matthew Lundberg 13 May 2014 в 03:38
поделиться