dimo414, generując czynników jest powszechnie uważany za bardzo trudnym zadaniem. W rzeczywistości ochrona większości waszych ważnych zasobów (tj. Pieniędzy, informacji itp.) Spoczywa na prostym, ale niezwykle trudnym zadaniu polegającym na faktorowaniu liczby. Zobacz ten artykuł na schemacie szyfrowania RSA http://en.wikipedia.org/wiki/RSA_(cryptosystem). Dygresję.
Aby odpowiedzieć na twoje pytanie, podejście kombinatoryczne jest twoją najlepszą metodą wskazaną przez Nikitę (btw, kudos na twoje wyjaśnienie).
wiem, może po prostu pętla od 2 do sqrt (n) i znaleźć wszystkie liczby podzielne
Wiele osób Skocz do tego wniosku ze względu na bardzo podobnym pojęcia związane z generowaniem liczb pierwszych. Niestety, jest to niepoprawne, ponieważ stracisz kilka czynników większych niż sqrt (n), które nie są liczbami pierwszymi (pozwolę ci to udowodnić sobie).
Teraz, aby określić liczbę czynników dla dowolnej liczby n, patrzymy na główną czynnikowość n. Jeśli n = p , to wiemy, że n będzie miał (a + 1 ) czynniki (1, p, p , ..., p ). Jest to klucz do określenia całkowitej liczby czynników.Jeśli n prime miał wiele czynników, np
n = p i Middot; p b& middot; & middot; & middot; p kr
następnie stosując regułę produktu liczenia (http://en.wikipedia.org/wiki/Rule_of_product), wiemy, że nie będzie
m = (a + 1) & middot; (b + 1) & middot; & middot; & middot; (r + 1)
czynników. Teraz wszystko, co musimy zrobić, to znaleźć każdą możliwą kombinację liczb podanych nam przez główną faktoryzację. Poniżej znajduje się kod w R, który, mam nadzieję, demonstruje to, co wyjaśniłem.
Pierwsza część mojego kodu wykonuje prostą kontrolę pierwszości, ponieważ jeśli liczba jest liczbą pierwszą, jedynymi czynnikami są 1 i sam. Następnie, jeśli liczba jest prime i nie większa niż 1, po raz pierwszy znaleźć czynniki pierwsze liczby, że mamy,
n = p & middot; p b& middot; & middot; & middot; P KR
Następnie znaleźć tylko unikalne bodźce znakowanych UniPrimes, więc w tym przykładzie, UniPrimes zawierałby (P , s , s K). Następnie znajduję wszystkie moce każdego z primerów i dodam je do tablicy Liniowej MyFactors. Po wykonaniu tej tablicy, znajduję każdą możliwą kombinację produktów elementów w MyFactors. Na koniec dodaję 1 do tablicy (ponieważ jest to czynnik trywialny) i sortuję ją. Voila! Jest niezwykle szybki i działa na bardzo duże liczby z wieloma czynnikami.
Próbowałem uczynić kod możliwym do przetłumaczenia jak to tylko możliwe dla innych języków (tj. Zakładam, że już zbudowałeś funkcję, która generuje rozkład czynnikowy (lub używając wbudowanej funkcji) i funkcję testu liczby pierwszej). i nie korzystałem z wyspecjalizowanych wbudowanych funkcji unikalnych dla R. Daj mi znać, jeśli coś nie jest jasne. Twoje zdrowie!
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)
}
Podobne zapytania (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-ending-order-morto-sorting/30181351#30181351 –