Создание всех факторов числа, учитывая его основную факторизацию

StackOverflow https://stackoverflow.com/questions/3644858

Вопрос

Если у вас уже есть главная факторизация номера, какой самый простой способ получить набор всех факторов этого номера? Я знаю, что я могу просто петить от 2 до SQRT (n) и найти все делимы, но это кажется неэффективным, поскольку у нас уже есть главная факторизация.

Предлагаю, что это в основном модифицированная версия комбинаций / выбора функции, но все, что я могу найти, - это методы подсчета количества комбинаций, и способы подсчета количества факторов, а не на самом деле генерировать комбинации / факторы.

Это было полезно?

Решение

Представьте себе, что Prime Divisors - это шары в ведре. Если, например, Prime Divisors вашего номера 2, 2, 2, 3 и 7, то вы можете занять 0, 1, 2 или 3 экземпляра «Ball 2». Точно так же вы можете взять «мяч 3» 0 или 1 раз и «мяч 7» 0 или 1 раза.

Теперь, если вы принимаете «мяч 2» дважды и «мяч 7» один раз, вы получаете девизор 2 * 2 * 7 = 28. Точно так же, если вы не принимаете шарики, вы получаете дивизор 1, и если вы берете все шары, вы получаете дивизор 2 * 2 * 2 * 3 * 7, что равняется самому номеру.

И наконец, чтобы получить все возможные комбинации шаров, которые вы можете взять из ведра, вы можете легко использовать рекурсию.

void findFactors(int[] primeDivisors, int[] multiplicity, int currentDivisor, long currentResult) {
    if (currentDivisor == primeDivisors.length) {
        // no more balls
        System.out.println(currentResult);
        return;
    }
    // how many times will we take current divisor?
    // we have to try all options
    for (int i = 0; i <= multiplicity[currentDivisor]; ++i) {
        findFactors(primeDivisors, multiplicity, currentDivisor + 1, currentResult);
        currentResult *= primeDivisors[currentDivisor];
    }
}

Теперь вы можете запустить его на приведенном выше примере:

findFactors(new int[] {2, 3, 7}, new int[] {3, 1, 1}, 0, 1);

Другие советы

DIMO414, генерирующие факторы, как правило, считаются очень сложной задачей. На самом деле, защита большинства ваших важных активов (т. Е. Деньги, информация и т. Д.), Отдых на простой, но чрезвычайно сложной задачей факторинга числа. Смотрите эту статью о схеме шифрования RSA http://en.wikipedia.org/wiki/rsa_(cryptosystem). Отказ Я отвлекся.

Чтобы ответить на ваш вопрос, комбинаторный подход - ваш лучший метод, указанный Nikita (BTW, kudos в вашем объяснении).

Я знаю, что могу просто петить от 2 до SQRT (N) и найти все делимы

Многие люди прыгают на этот вывод из-за самой аналогичной концепции, связанной с генерацией простых чисел. К сожалению, это неверно, так как вы пропустите несколько факторов, превышающие SQRT (N), которые не являются простыми числами (я позволю вам доказать это себе).

Теперь, чтобы определить количество факторов для любого данного номера N, мы смотрим на главное факторизацию N.. Отказ Если n = p.а., тогда мы знаем, что N будет иметь (A + 1.) факторы (1, P, P2, ... , па.). Это ключ к определению общего количества факторов. Если N. было несколько основных факторов, скажем,

n = p.1а.· п2преступность··· пk.р

Затем используя Правило продукта подсчет (http://en.wikipedia.org/wiki/rule_of_product.), мы знаем, что будет

М. = (A + 1.)·(B + 1.)···(R + 1.)

факторы. Теперь все, что нам нужно сделать, это найти все возможные комбинации чисел, данных нам главной факторизацией. Ниже приведен некоторый код в R, который, надеюсь, демонстрирует то, что я объяснил.

Первая часть моего кода выполняет простую проверку примата, потому что если число премьер, единственными факторами являются 1 и сам. Далее, если номер не премьет и больше 1, я сначала найду главное факторизацию номера, скажем, что у нас есть,

n = p.1а.· п2преступность··· пk.р

Я тогда нахожу только уникальные простые простые числа Обнаружено, Так что для этого примера однопроизводимое будет содержать (п1, п2, пk.). Затем я нахожу все силы каждого премьера и добавьте его в массив Магистры. После того, как этот массив сделан, я нахожу все возможные продукты комбинации элементов в магистралях. Наконец, я добавляю 1 к массиву (как это тривиальный фактор), и сортировать его. Вуаля! Это очень быстро и работает для очень большого количества со многими факторами.

Я пытался сделать код максимально переведен на другие языки (т. Е. Я предполагаю, что вы уже создали функцию, которая генерирует простое факторизацию (или использование встроенной функции) и функции тестирования простых номеров.) И я сделал T Используйте специализированные встроенные функции, уникальные для R. Дайте мне знать, если что-то не ясно. Ваше здоровье!

factor2 <- function(MyN) {

    CheckPrime <- isPrime(MyN)

    if (CheckPrime == F && !(MyN == 1)) {
            MyPrimes <- primeFactors(MyN)
            MyFactors <- vector()
            MyPowers <- vector()
            UniPrimes <- unique(MyPrimes)
                    for (i in 1:length(UniPrimes)) {

                            TempSize <- length(which(MyPrimes == UniPrimes[i]))

                            for (j in 1:TempSize) {
                                    temp <- UniPrimes[i]^j
                                    MyPowers <- c(MyPowers, temp)
                            }

                    }
            MyFactors <- c(MyFactors, MyPowers)
            MyTemp <- MyPowers
            MyTemp2 <- vector()
            r <- 2
            while (r <= length(UniPrimes)) {

                    i <- 1L

                    while (i <= length(MyTemp)) {
                            a <- which(MyPrimes >  max(primeFactors(MyTemp[i])))
                                    for (j in a) {
                                            temp <- MyTemp[i]*MyPowers[j]
                                            MyFactors <- c(MyFactors, temp)
                                            MyTemp2 <- c(MyTemp2, temp)
                                    }
                            i <- i + 1
                    }
                    MyTemp <- MyTemp2
                    MyTemp2 <- vector()
                    r <- r + 1
            }
    } else {
            if (MyN == 1) {
                    MyFactors <- vector()
            } else {
                    MyFactors <- MyN
            }
    }
    MyFactors <- c(1, MyFactors)
    sort(MyFactors)
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top