dimo414, generando factores generalmente se considera una tarea muy difícil. De hecho, la protección de la mayoría de sus activos importantes (es decir, dinero, información, etc.) se basa en la tarea simple pero extremadamente difícil de factorizar un número. Consulte este artículo sobre el esquema de cifrado de RSA http://en.wikipedia.org/wiki/RSA_(cryptosystem). Estoy divagando.
Para responder a su pregunta, un enfoque combinatorio es su mejor método como lo señala Nikita (por cierto, felicitaciones por su explicación).
Sé que podría simplemente bucle de 2 a sqrt (n) y encontrar todos los números divisibles
Muchas personas saltan a esta conclusión debido al concepto muy similar asociado con la generación de números primos. Desafortunadamente, esto es incorrecto, ya que omitirá varios factores mayores que el sqrt (n) que no son números primos (le dejaré probar esto a usted mismo).
Ahora, para determinar el número de factores para un número dado n, buscamos la factorización prima de n. Si n = p un, entonces sabemos que tendrá n (a + 1) factores (1, p, p , ..., p un). Esta es la clave para determinar el número total de factores.Si n tenían múltiples factores primos, por ejemplo
n = p un middoty; p b& middot; & middot; & middot; p kr
a continuación, utilizando la Regla Producto de recuento (http://en.wikipedia.org/wiki/Rule_of_product), sabemos que habrá
m = (a + 1) y middot; (b + 1) & middot; & middot; & middot; (r + 1)
factores. Ahora, todo lo que tenemos que hacer es encontrar todas las combinaciones posibles de los números que nos da la factorización prima. A continuación, hay algún código en R, que con suerte demuestra lo que he explicado.
La primera parte de mi código hace una simple comprobación de primalidad porque si el número es primo, los únicos factores son 1 y sí mismo. A continuación, si el número no es primo y mayor que 1, lo primero que encuentro la descomposición en factores primos del número, digamos que tenemos,
n = p uny middot; p b& middot; & middot; & middot; p kr
entonces encuentro sólo los números primos singulares labled UniPrimes, por lo que para este ejemplo, UniPrimes contendría (p , p , p k) Luego encuentro todos los poderes de cada primo y lo agrego a una matriz con la etiqueta MyFactors. Después de crear esta matriz, encuentro todas las posibles combinaciones de productos de los elementos en MyFactors. Por último, agrego 1 a la matriz (ya que es un factor trivial) y la clasifico. Voila! Es extremadamente rápido y funciona para números muy grandes con muchos factores.
He intentado hacer que el código sea lo más traducible posible a otros idiomas (es decir, supongo que ya ha creado una función que genera la factorización prima (o utiliza una función incorporada) y una función de prueba de número primo). y no utilicé funciones integradas especializadas únicas a R. Avíseme si algo no está claro. ¡Aclamaciones!
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)
}
pregunta relacionada (Python): http://stackoverflow.com/questions/3643725/i-have-a-python-list-of-the-prime-factors-of-a-number-how- do-i-pythonically-fi – tzot
cf. http://stackoverflow.com/questions/29992904/enumerate-factors-of-a-number-directly-in-ascending-order-without-sorting/30181351#30181351 –