Рубрики
Без рубрики

Как определить простое число в Java

– Как определить простое число в Java

Очень важный вопрос в математике и безопасности – определить, является ли число простым или нет. Это очень полезно при шифровании пароля. В этом уроке вы узнаете, как определить, является ли число простым в простых случаях.

Тривиальные Случаи

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

Например, у кого-то может возникнуть соблазн запустить этот алгоритм:

//checks whether an int is prime or not.
boolean isPrime(int n) {
    for(int i=2;i

Поначалу это не кажется плохим, но мы можем сделать это быстрее – намного быстрее. Учтите, что если 2 делит некоторое целое число n, то (n/2) также делит n. Это говорит нам о том, что нам не нужно пробовать все целые числа от 2 до n. Теперь мы можем изменить наш алгоритм:

//checks whether an int is prime or not.
boolean isPrime(int n) {
    for(int i=2;2*i

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

Наконец, мы знаем, что 2 – “самое странное” простое число – это единственное четное простое число. Из-за этого нам нужно только проверить 2 отдельно, а затем пересечь нечетные числа до квадратного корня из n. В конце концов, наш код будет выглядеть так:

//checks whether an int is prime or not.
boolean isPrime(int n) {
    //check if n is a multiple of 2
    if (n%2==0) return false;
    //if not, then just check the odds
    for(int i=3;i*i<=n;i+=2) {
        if(n%i==0)
            return false;
    }
    return true;
}

Как вы можете видеть, мы перешли от проверки каждого целого числа (до n, чтобы выяснить, что число простое) к простой проверке половины целых чисел до квадратного корня (на самом деле нечетных). Это огромное улучшение, особенно учитывая, когда цифры большие.

Повторения

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

Вот основная идея:

  1. Предположим, что каждое целое число, большее или равное 2, является простым.
  2. Начните с начала списка, если число простое, вычеркните из списка все кратные этому числу. Они не являются простыми.
  3. Перейдите к следующему номеру, если он зачеркнут, пропустите его – он не простой. Если оно не зачеркнуто, оно должно быть простым, зачеркните его кратным.
  4. Повторять

Давайте посмотрим, что это значит. Рассмотрим список:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

2 – простое число… вычеркните его кратным. Наш список теперь выглядит так: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Вы можете понять, почему 2 – единственное простое число. Теперь, делая это с 3, мы вычеркиваем 6 (уже вычеркнуто), 9, 12 (уже вычеркнуто), 15 и т. Д. В конце концов, ваш список будет выглядеть так: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

И наши простые числа – это те, которые остались: (2,3,5,7,11,13,17,19,23,29,…). В коде вы можете захотеть отслеживать этот список в виде массива. Это означает, что вы пройдете через n чисел, чтобы настроить это “сито”, но вы восполните это при повторном вызове функции, так как она вернет мгновенное значение независимо от того, является ли число простым или нет. Вот как это будет выглядеть. Конечно, вы можете отредактировать это самостоятельно в соответствии с вашими потребностями:

import java.util.Arrays;
//global array just to keep track of it in this example, 
//but you can easily do this within another function.

// will contain true or false values for the first 10,000 integers
boolean[] primes=new boolean[10000]; 
//set up the primesieve
public void fillSieve() {
    Arrays.fill(primes,true);        // assume all integers are prime.
    primes[0]=primes[1]=false;       // we know 0 and 1 are not prime.
    for (int i=2;i

Оригинал: “https://mkyong.com/java/how-to-determine-a-prime-number-in-java/”