Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- findDivisor <- function(num){
- p = vector('numeric', 1e5)
- k = 1
- step_p = 1e7
- repeat{
- s = min(k, num):min(num, k+step_p)
- tmp = which(num %% s == 0)
- if (length(tmp) > 0)
- {
- if (sum(p!=0)+length(tmp) > 1e5)
- p = c(p, rep(0, 1e5))
- p[(sum(p!=0)+1):(sum(p!=0)+length(tmp))] = s[tmp]
- }
- if (k > num)
- break
- k = k + step_p
- }
- unique(p[p!=0])
- }
- primefactorFast <- function(num){
- p <- findDivisor(num)
- isPrime <- function(num){
- return(length(findDivisor(num)) == 2)
- }
- p <- p[sapply(p, isPrime)]
- e <- vector('numeric', length(p))
- e_basic <- 1
- step_e <- 5
- subset_e <- 1:length(p)
- repeat{
- m = num %% sweep(matrix(replicate(step_e, p[subset_e]), length(p[subset_e])), 2,
- e_basic:(e_basic + step_e - 1), '^') == 0
- e[subset_e] = e[subset_e] + rowSums(m)
- e_basic = e_basic + step_e
- subset_e = which(apply(m,1,all))
- if (is.null(subset_e) || (length(subset_e) == 0))
- break
- }
- return(list('pfactor'=p, 'multi'=e))
- }
- testNum = 2^11*3^6*47
- log10(testNum) # [1] 7.846155
- st = proc.time()
- out = primefactorFast(testNum)
- proc.time() - st
- # user system elapsed
- # 5.74 0.78 6.52
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement