Почему мой код неправильно идентифицирует только простые числа?

#r

Вопрос:

Я не могу понять, почему приведенный ниже код также создает вектор с некоторыми не простыми числами.

 i <- (3)
v1 <- (2)
v2 <- c()

while (i < 13195)
{
    v1 <- c(v1,i)
#The IF statement below is intended to identify only primes that are factors of 13195, but some none primes such as 2639 appeared in the vector 'v2'
    if (((i/v1) != round(i/v1)) amp; ((13195/i) == round(13195/i)))
    {
        v2 <- c(v2, i)
        i <- i 1
    }
    else
    {
        i <- i 1
    }
}
 

Комментарии:

1. Один недостаток заключается в том, v1 что вектор, таким 1/v1 образом, на самом деле является векторизованным разделением, больше похожим 1/1, 1/2, 1/3 и if не является векторизованной функцией и сравнивается только на основе первого элемента

2. Еще одним недостатком является вся часть «определить простые числа, которые являются коэффициентом 13195». Никакие простые числа не являются коэффициентом 13195 по определению, так как простое число делится только на себя и 1. Вы пытаетесь найти простые числа или числа, кратные 13195?

3. Вы основываете это на известном алгоритме? Я просто никогда не видел, чтобы round() использовался для поиска простых чисел. Чего мне не хватает?

4. Ну, простые числа не имеют никаких других факторов, кроме самих себя и 1, поэтому, если вы разделите число на каждое предыдущее число, начиная с 2, и результат всех делений будет нецелым числом, то использование != round() покажет его, и, следовательно, это будет простое число. Если хотя бы одно из чисел, полученных в результате деления, является целым числом, то оно не является простым числом, и !=round() этого числа не будет ИСТИННЫМ. По крайней мере, такова была идея, но я подозреваю, что моя логика ошибочна.

5. @Keo Выполняется warnings() в конце вашего фрагмента. Предупреждения помогут вам.

Ответ №1:

Я думаю, что твоя логика в порядке. Проблема, которую я вижу, заключается в том, что if утверждение имеет структуру if(vector amp; scalar) , которая может все испортить. Возможно, вы захотите изменить его на

 if (all((i/v1) != round(i/v1)) amp; ...
 

Другая проблема заключается в том, что каждая итерация i добавляла v1 до условного. Таким образом , последний элемент (i/v1) != round(i/v1) всегда будет оцениваться False , потому что последний элемент v1 есть i и i/i != round(i/i) будет False . Это сделает условное всегда False . Решение состоит в обновлении i <- i 1 после добавления старого i в v1.

Вот обновленный код:

 i<-2
v1<-c()
v2<-c()

while (i<13195) {
  v1<-c(v1,i)
  i<-i 1
  
  if (all((i/v1) != round(i/v1)) amp; ((13195/i)==round(13195/i))){
    v2<-c(v2, i)
  }
  
}