РЕДАКТИРОВАТЬ: я добавил третье средство для повышения эффективности
РЕДАКТИРОВАТЬ 2: Добавлено объяснение, почему сито не должно быть решением и некоторые отношения тригонометрии. Более того, я добавил примечание по истории вопроса
Ваша проблема не в том, чтобы сосчитать все простые числа в данном диапазоне, а только те, которые сгенерированы вашей функцией.
Поэтому я не думаю, что сито Эратосфена является решением для этого конкретного упражнения по следующей причине: n
всегда довольно мало, а k
может быть очень большим. Если k
очень велико, то алгоритм Sieve должен будет генерировать огромное количество простых чисел, чтобы, наконец, использовать его для небольшого числа кандидатов.
Вы можете повысить эффективность своей программы тремя способами:
- Избегайте вычисления
sin(.)
каждый раз. Вы можете использовать тригонометрические отношения, например. Более того, при первом вычислении этих значений вы сохраняете их в массив и повторно используете эти значения. Расчет sin()
очень трудоемкий
- В вашем тесте, чтобы проверить, является ли число простым, ограничьте поиск до
sqrt(res)
. Кроме того, рассмотрите возможность проведения теста только с нечетным j
, плюс 2
- Если кандидат
res
равен предыдущему, избегайте повторного выполнения теста
Немного тригонометрии
Если c = cos (0.1) и s = sin (0.1), вы можете использовать соотношения:
sin (0.1(i+1)) = s*cos (0.1*i) + c*sin(0.1*i))
cos (0.1(i+1)) = c*cos (0.1*i) - s*sin(0.1*i))
Если n
было большим, необходимо регулярно пересчитывать sin()
с помощью функции, чтобы избежать слишком большого вычисления ошибки округления. Но это не должно иметь место, поскольку n
всегда довольно мало.
Однако, как я уже говорил, на первом этапе лучше использовать только трюк «запоминания» и проверить, достаточно ли этого.
Примечание к истории этого вопроса и почему этот ответ:
Недавно на этом сайте появилось несколько вопросов "как улучшить мою программу, чтобы подсчитать количество простых чисел, сгенерированных этой функцией k*sin()
..." Насколько мне известно, все эти вопросы были закрыты как дубликаты, по той причине, что Решето является решением и было объяснено в предыдущем аналогичном (но немного другом) вопросе. Теперь тот же вопрос появился в несколько иной форме: «Как я могу вставить алгоритм Sieve в эту программу ... (снова с помощью k * sin ())». И тогда я понял, что Сито не является решением. Это не критика предыдущих закрытий, поскольку я сделал ту же ошибку в понимании вопроса. Тем не менее, я думаю, что пришло время предложить новое решение, даже если оно не совсем соответствует новому вопросу