Способов подсчета предельных чисел

Хорошо, так что, может быть, я не должен был сильно угадать этот вопрос... Я видел сообщение на наиболее эффективном способе поиска первых 10000 простых чисел, Я ищу все возможные способы. Цель состоит в том, чтобы иметь единый магазин для тестов на первичность. Любые тесты, которые люди знают для поиска простых чисел, приветствуются.

И так:

  • Каковы все способы поиска простых чисел?

Ответ 1

Некоторые простые тесты работают только с определенными числами, например, Тест Lucas-Lehmer работает только для чисел Мерсенна.

Большинство простых тестов, используемых для больших чисел, могут только сказать вам, что определенное число "вероятно, просто" (или, если число не проходит тест, оно явно не prime). Обычно вы можете продолжить алгоритм, пока не получите очень высокую вероятность того, что число будет простым.

Посмотрите эту страницу и особенно раздел "См. также".

Тест Миллера-Рабина, я думаю, один из лучших тестов. В стандартной форме это дает вам вероятные простые числа, хотя было показано, что если вы применяете тест к числу ниже 3.4 * 10 ^ 14, и он проходит тест для каждого параметра 2, 3, 5, 7, 11, 13 и 17, это определенно простое.

Тест AKS стал первым детерминированным, проверенным, общим, полиномиальным тестом. Однако, насколько мне известно, его лучшая реализация оказывается более медленной, чем другие тесты, если вход не смехотворно большой.

Ответ 2

Сито Эратосфена - достойный алгоритм:

  • Возьмем список положительных целых чисел 2 для любого потолка.
  • Возьмите следующий элемент в списке (2 в первой итерации) и удалите все его кратные (за пределами первого) из списка.
  • Повторите шаг два, пока не достигнете данного потолка.
  • Ваш список теперь состоит из простых чисел.

Существует функциональный предел для этого алгоритма в том, что он обменивается скоростью для памяти. При создании очень больших списков простых чисел объем памяти, необходимый для ускорения скачков.

Ответ 3

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

  • Возьмите список из 2 в квадратный корень из целого.
  • Прокрутите список, оставив целое число/ текущего числа
    •   
    • Если остаток равен нулю для любого числа в списке, то целое число не является простым.  
    • Если остаток был ненулевым для всех чисел в списке, то целое число является простым.  

Он использует значительно меньше памяти, чем Theieve of Eratosthenes и, как правило, быстрее для отдельных номеров.

Ответ 4

@akdom вопрос ко мне:

Looping будет работать нормально в моем предыдущем предложении, и вам не нужно делать какие-либо вычисления, чтобы определить, четное ли число; в вашем цикле, просто пропустите каждое четное число, как показано ниже:

//Assuming theInteger is the number to be tested for primality.
// Check if theInteger is divisible by 2.  If not, run this loop.
//  This loop skips all even numbers.
for( int i = 3; i < sqrt(theInteger); i + 2) 
{
    if( theInteger % i == 0) 
    {
       //getting here denotes that theInteger is not prime 
       // somehow indicate that some number, i, divides it and break
       break;
    }
}

Ответ 5

Недавно студент-студент Rutgers нашел ссылку , которая генерирует простые числа. Разность его последовательных чисел будет генерировать либо простые числа, либо 1.

a(1) = 7
a(n) = a(n-1) + gcd(n,a(n-1)). 

Это делает много дерьма, который нужно отфильтровать. У Benoit Cloitre также есть этот повтор, который выполняет аналогичную задачу:

b(1) = 1
b(n) = b(n-1) + lcm(n,b(n-1))

тогда отношение последовательных чисел, минус одно [b (n)/b (n-1) -1], является простым. Полный отчет обо всем этом можно прочитать в Рекурсивность.

Для сита вы можете сделать это лучше, используя колесо, а не добавляя его каждый раз, посмотрите Улучшенные инкрементные сита с первичным номером, Вот пример колеса. Посмотрите на цифры, 2 и 5, чтобы игнорировать. Их колесо, [2,4,2,2].

Ответ 6

В вашем алгоритме, используя список от 2 до корня целого числа, вы можете повысить производительность за счет тестирования нечетных чисел после 2. То есть ваш список должен содержать только 2 и все нечетные числа от 3 до квадратного корня от целого числа. Это сокращает количество циклов, когда вы зацикливаетесь вдвое, не создавая никакой сложности.

Ответ 7

@theprise

Если бы я хотел использовать инкрементный цикл вместо инстанцированного списка (проблемы с памятью для массивных чисел...), что было бы хорошим способом сделать это без создания списка?

Не похоже, что было бы дешевле выполнить проверку делимости для данного целого (X% 3), чем просто проверить нормальное число (N% X).

Ответ 8

Если вы хотите найти способ генерации простых чисел, это было рассмотрено в предыдущем вопросе.