2010-10-04 5 views
1

Я делаю генератор первичных чисел, и чтобы сделать его более эффективным, я пытаюсь только проверить числа против простых чисел, которые я уже нашел, а не все числа < sqrt проверяемого числа , Я пытаюсь получить мой список простых чисел, но я не уверен, как заставить его повториться в моем втором цикле. Я думаю, что это только испытание против a <- 2 и не a <- c(a,i)Рекурсия в основном генераторе

x <- 3:1000 
a <- 2 
for (i in x) 
{for (j in a) 
    {if (i %% j == 0) 
    {next} 
    else {a <- unique(c(a,i))}}} 
a 
+0

см. этот ответ http://stackoverflow.com/questions/3789968/generate-a-list-of-primes-in-r-up-to-a-certain- номер/3791284 # 3791284 – John

+1

вы также хотели бы вырезать четные числа в 'x' и периодически увеличивать размер' a', а не с каждым добавлением, чтобы улучшить скорость. – James

ответ

1

Рекурсивный мод с использованием простой простой функции, которая примерно так же быстро, как вы можете сделать это в R, находится ниже. Вместо того, чтобы перебирать каждое индивидуальное значение и проверять его простоту, он удаляет все кратные числа простых чисел в больших кусках. Это изолирует каждое последующее оставшееся значение как простое. Таким образом, он вынимает 2x, затем 3x, затем 4 исчезает, так что 5x значения идут. Это самый эффективный способ сделать это в R.

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 
} 

(вы можете увидеть this стека вопрос для более быстрых методов с использованием сита, а также мои тайминги функции. Что выше будет работать 50, может быть 500x быстрее чем версия, с которой вы работаете.)

+0

работает красиво, спасибо – user446667

3

Решение может быть, чтобы вырезать вторую петлю и вместо того, чтобы сравнить предлагаемое простое число для всего вектора вместо этого, как:

x <- 3:1000 
a <- 2 
for (i in x) { 
    if (!any(i %% a == 0)) { 
    a <- c(a,i) 
    } 
} 

Казалось, это сработало для меня.

Смежные вопросы