dimo414, генерация факторов обычно считается очень сложной задачей.На самом деле защита большинства ваших важных активов (например, денег, информации и т. Д.) Основывается на простой, но чрезвычайно сложной задаче факторизации числа.См. Эту статью о схеме шифрования RSA http://en.wikipedia.org/wiki/RSA_(cryptosystem). Я отвлекся.
Чтобы ответить на ваш вопрос, комбинаторный подход - ваш лучший метод, на который указывает Никита (кстати, слава в вашем объяснении).
Я знаю, что мог бы просто выполнить цикл от 2 до sqrt (n) и найти все делимые числа
Многие люди приходят к такому выводу из-за очень похожей концепции, связанной с генерациейпростые числа.К сожалению, это неверно, так как вы пропустите несколько факторов больше, чем sqrt (n), которые не являются простыми числами (я позволю вам доказать это себе).
Теперь, чтобы определить числофакторы для любого данного числа n, мы смотрим на простую факторизацию n .Если n = p a , то мы знаем, что n будет иметь ( a + 1 ) факторов ( 1, p, p 2)., ..., p a ).Это ключ к определению общего количества факторов.Если n имеет несколько простых множителей, скажем,
n = p 1 a · p 2 b ··· p k r
с использованием Правило продукта подсчета (http://en.wikipedia.org/wiki/Rule_of_product), мы знаем, что будет
м = ( a + 1 ) · ( b + 1 ) ··· ( r + 1 )
факторов. Теперь все, что нам нужно сделать, этонайти любую возможную комбинацию чисел, данных нам простой факторизацией. Ниже приведен некоторый код в R, который, надеюсь, демонстрирует то, что я объяснил.
Первая часть моего кода выполняет простую проверку простоты, потому чтоесли число простое, единственными факторами являются 1 и само. Затем, если число не простое и больше 1, я сначала нахожу простое разложение числа, скажем, у нас,
n = p 1 a · p 2 b ··· pk r
Затем я найду только уникальные простые числа, помеченные UniPrimes, , поэтому для этого примера UniPrimes будет содержать ( p 1 , p 2 , p k ).Затем я нахожу все силы каждого простого числа и добавляю его в массив labled MyFactors. После создания этого массива я нахожу все возможные комбинации продуктов из элементов в MyFactors.Наконец, я добавляю 1 к массиву (поскольку это тривиальный фактор) и сортирую его.Вуаля!Это очень быстро и работает для очень больших чисел со многими факторами.
Я попытался сделать код максимально переводимым на другие языки (т.е. я предполагаю, что вы уже создали функцию, которая генерирует простую факторизацию (или используя встроенную функцию) и тестовую функцию простого числа.) и я не использовал специализированные встроенные функции, уникальные для 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)
}