r中小于1000的双素数

时间:2018-10-22 12:29:38

标签: r

我有一个问题:构造一个所有小于1000的双素数的列表

到目前为止,我的代码是:

isPrime <- function (n ) n==2L || all (n %%  2L:max (2, floor(sqrt(n)))!=0)

在构建实际列表本身时遇到麻烦,有什么建议吗?

4 个答案:

答案 0 :(得分:2)

您可以使用sapply命令获取素数,然后使用diff函数对。

(感谢Rui指出sapplylapply更合适!)

testThese <- 1:1000
primes <- testThese[sapply(testThese,isPrime)]

pairs.temp <- which(diff(primes)==2)
pairs <- sort(c(pairs.temp, pairs.temp+1))

matrix(primes[pairs], ncol=2, byrow=TRUE)


      [,1] [,2]
 [1,]    3    5
 [2,]    5    7
 [3,]   11   13
 [4,]   17   19
 [5,]   29   31
  ...  ...  ...

答案 1 :(得分:1)

以下是您可以使用函数构造素数列表的方法(尽管效率不高):

.json

您应该能够将其扩展为梳理双素数。

答案 2 :(得分:1)

以下内容如何?

library(gmp)
library(dplyr)
df <- expand.grid(x = 1:1000)
df$y <- isprime(df$x)

df <- df[df$y == 2,]
df[c(0,diff(df$x)) == 2 | lead(c(0,diff(df$x)) == 2, 1, F),]


      x y
3     3 2
5     5 2
7     7 2
11   11 2
13   13 2
17   17 2
19   19 2
29   29 2
31   31 2
41   41 2
43   43 2
59   59 2
61   61 2
71   71 2
73   73 2
101 101 2
103 103 2
107 107 2
109 109 2
137 137 2
139 139 2
149 149 2
151 151 2
179 179 2
181 181 2
191 191 2
193 193 2
197 197 2
199 199 2
227 227 2
229 229 2
239 239 2
241 241 2
269 269 2
271 271 2
281 281 2
283 283 2
311 311 2
313 313 2
347 347 2
349 349 2
419 419 2
421 421 2
431 431 2
433 433 2
461 461 2
463 463 2
521 521 2
523 523 2
569 569 2
571 571 2
599 599 2
601 601 2
617 617 2
619 619 2
641 641 2
643 643 2
659 659 2
661 661 2
809 809 2
811 811 2
821 821 2
823 823 2
827 827 2
829 829 2
857 857 2
859 859 2
881 881 2
883 883 2

答案 3 :(得分:1)

以下是使用Sieve of Eratosthenes的解决方案:

E <- rep(TRUE, 1000)
E[1] <- FALSE
for (i in 2:33) {
  if (!E[i]) next
  E[seq(i+i, 1000, i)] <- FALSE
}
P  <- which(E) ## primes
pp <- which(diff(P)==2) ## index of the first twin
cbind(P[pp], P[pp+1])   ## the twins

如果您需要功能isPrime(),可以这样做:

isPrime <- function(i) E[i]
isPrime(c(1,2,4,5)) ## Test