Двойные простые числа менее 1000 в г - PullRequest
0 голосов
/ 22 октября 2018

У меня вопрос: составьте список всех двойниковых чисел, меньших 1000

Пока мой код:

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

У меня проблемы с составлением самого списка, любые предложения?

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Вот решение, использующее Сито Эратосфена :

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
0 голосов
/ 22 октября 2018

Вот как вы можете построить (хотя и не очень эффективно) список простых чисел, используя вашу функцию:

primes_list <- vector(length = 0, mode = "integer")
for (i in 1:1000) {
  if (isPrime(i)) primes_list <- c(primes_list, i)
}

Вы должны быть в состоянии расширить это до сортировки двойных простых чисел.

0 голосов
/ 22 октября 2018

Как насчет следующего?

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
0 голосов
/ 22 октября 2018

Вы можете использовать команду sapply для получения простых чисел, а затем с помощью функции diff пары

(Спасибо Руи за то, что указал, что sapply больше подходит, чем lapply здесь!)

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
  ...  ...  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...