作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试生成一个小于 10 亿的素数列表。我正在尝试这个,但这种结构非常糟糕。有什么建议吗?
a <- 1:1000000000
d <- 0
b <- for (i in a) {for (j in 1:i) {if (i %% j !=0) {d <- c(d,i)}}}
最佳答案
George Dontas 发布的那个筛子是一个很好的起点。这是一个更快的版本,1e6 个素数的运行时间为 0.095 秒,而原始版本为 30 秒。
sieve <- function(n)
{
n <- as.integer(n)
if(n > 1e8) stop("n too large")
primes <- rep(TRUE, n)
primes[1] <- FALSE
last.prime <- 2L
fsqr <- floor(sqrt(n))
while (last.prime <= fsqr)
{
primes[seq.int(2L*last.prime, n, last.prime)] <- FALSE
sel <- which(primes[(last.prime+1):(fsqr+1)])
if(any(sel)){
last.prime <- last.prime + min(sel)
}else last.prime <- fsqr+1
}
which(primes)
}
下面是一些在 R 中尽可能快地编码的替代算法。它们比筛子慢,但比提问者的原始帖子快得多。
这是一个使用 mod 但被矢量化的递归函数。它几乎立即返回 1e5,并在 2 秒内返回 1e6。
primes <- function(n){
primesR <- function(p, i = 1){
f <- p %% p[i] == 0 & p != p[i]
if (any(f)){
p <- primesR(p[!f], i+1)
}
p
}
primesR(2:n)
}
下一个不是递归的,而且速度更快。下面的代码在我的机器上在大约 1.5 秒内完成了 1e6。
primest <- function(n){
p <- 2:n
i <- 1
while (p[i] <= sqrt(n)) {
p <- p[p %% p[i] != 0 | p==p[i]]
i <- i+1
}
p
}
顺便说一句,spuRs 包有许多主要的查找功能,包括 E 的筛选。还没有检查过它们的速度如何。
虽然我正在写一个很长的答案......如果一个值是素数,你将如何检查 R。
isPrime <- function(x){
div <- 2:ceiling(sqrt(x))
!any(x %% div == 0)
}
关于algorithm - 生成不超过一定数量的素数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3789968/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!