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

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

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

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

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

…​.//checks whether an int is prime or not. boolean isPrime(int n) { for(int i=2;i<n;i++) { if(n%i==0) return false; } return true; }

Сначала это не кажется плохим, но мы можем сделать это быстрее - намного быстрее.

Предположим, что если 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;i++) {
        if(n%i==0)
            return false;
    }
    return true;
}

При более эффективном кодировании мы замечаем, что вам действительно нужно перейти только к квадратному корню из 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, чтобы узнать, что число простое) до простой проверки половины целых чисел вплоть до квадратного корня (действительно, нечетных). Это огромное улучшение, особенно если учесть большие цифры.

===  Повторения

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

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

, Предположим, что каждое целое число, большее или равное 2, простое.

, Начните с начала списка, если число простое, вычеркните

каждый кратный этого числа из списка. Они не простые.

, Переходите к следующему номеру, если он вычеркнут, пропустите его - это не

премьер. Если оно не вычеркнуто, оно должно быть простым, вычеркните его кратные

, Повторение

Посмотрим, что это значит. Рассмотрим список:

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

[line-through]** 18**  19[line-through]** 20**  ...**

Вы можете понять, почему 2 - единственное простое число. Делая это с 3, мы вычеркиваем 6 (уже вычеркнуто), 9, 12 (уже вычеркнуто), 15 и т. Д.

В конце концов, ваш список будет выглядеть так:
**  2 3 4 5[сквозной канал]**  6 **  7[сквозной канал]**  8 ** [сквозной канал]**  9 ** [сквозной канал]**  10 **  11[сквозной канал]**  12 **  13[сквозной канал]**  14 **

[line-through]** 15** [line-through]** 16**  17[line-through]** 18**  19

[line-through]** 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. 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<primes.length;i) { //if the number is prime, //then go through all its multiples and make their values false. if(primes[i]) { for (int j=2;i** j<primes.length;j) { primes[i** j]=false; } } } }

public boolean isPrime(int n) { return primes[n];//simple, huh? }

ссылка://тег/java/[java]ссылка://тег/простое число/[простое число]