Как создать наиболее компактное отображение n → isprime (n) до предела N?
Естественно, для bool isprime(number)
была бы структура данных, которую я мог бы запросить.
Я определяю лучший алгоритм, чтобы он представлял собой алгоритм, который создает структуру данных с самым низким потреблением памяти для диапазона (1, N], где N - это константа.
Просто пример того, что я ищу: я мог бы представить каждое нечетное число одним битом, например, для данного диапазона чисел (1, 10] начинается с 3: 1110
Следующий словарь можно сжать больше, верно? Я мог бы устранить кратные пять с некоторой работой, но числа, которые заканчиваются на 1, 3, 7 или 9, должны быть там в массиве битов.
Как мне решить проблему?
Ответы
Ответ 1
Существует много способов выполнить тест на первичность.
На самом деле нет структуры данных для запроса. Если у вас есть много номеров для тестирования, вероятно, вы должны запустить вероятностный тест, поскольку они быстрее, а затем выполните его с помощью детерминированный тест, чтобы убедиться, что число является простым.
Вы должны знать, что математика за самыми быстрыми алгоритмами не для слабонервных.
Ответ 2
Самый быстрый алгоритм общего простого тестирования - AKS. Статья в Википедии описывает его подробно и ссылки на оригинальную бумагу.
Если вы хотите найти большие числа, посмотрите на простые числа, которые имеют специальные формы, такие как простые Мерсенны.
Алгоритм, который я обычно реализую (легко понять и кодировать), выглядит следующим образом (в Python):
def isprime(n):
"""Returns True if n is prime."""
if n == 2:
return True
if n == 3:
return True
if n % 2 == 0:
return False
if n % 3 == 0:
return False
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w
return True
Это вариант классического алгоритма O(sqrt(N))
. Он использует тот факт, что простой (кроме 2 и 3) имеет вид 6k - 1
или 6k + 1
и выглядит только на делителях этой формы.
Иногда, если мне действительно нужна скорость, и диапазон ограничен, я реализую псевдопробный тест, основанный на теореме Ферма. Если мне действительно нужна дополнительная скорость (т.е. Вообще избегайте алгоритма O (sqrt (N)), я предварительно компрометирую ложные срабатывания (см. Номера Carmichael) и выполняю двоичный поиск. Это, безусловно, самый быстрый тест, который я когда-либо реализовал, единственным недостатком является то, что диапазон ограничен.
Ответ 3
Лучший метод, на мой взгляд, - использовать то, что было раньше.
Есть списки первых N
простых чисел в Интернете с N
, простирающимися как минимум пятьдесят миллионов. Загрузите файлы и используйте их, вероятно, намного быстрее, чем любой другой метод, который вы придумаете.
Если вам нужен настоящий алгоритм для создания собственных простых чисел, в Википедии есть всевозможные хорошие вещи на простых словах здесь, включая ссылки на различные методы для этого и первичное тестирование здесь, как основанные на вероятности, так и методы быстрого детерминирования.
Должны быть предприняты согласованные усилия, чтобы найти первые миллиарды (или даже больше) простых чисел и опубликовать их в сети где-нибудь, чтобы люди могли перестать выполнять эту же работу снова и снова и снова и...: -)
Ответ 4
bool isPrime(int n)
{
// Corner cases
if (n <= 1) return false;
if (n <= 3) return true;
// This is checked so that we can skip
// middle five numbers in below loop
if (n%2 == 0 || n%3 == 0) return false;
for (int i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;
return true;
}
this is just c++ implementation of above AKS algorithm
https://en.wikipedia.org/wiki/AKS_primality_test
Ответ 5
Согласно wikipedia, Сито Эратосфена сложность O(n * (log n) * (log log n))
и требует O(n)
памяти - так что это очень хорошее место для начала, если вы не тестируете особенно большие числа.
Ответ 6
В Python 3:
def is_prime(a):
if a < 2:
return False
elif a!=2 and a % 2 == 0:
return False
else:
return all (a % i for i in range(3, int(a**0.5)+1))
Пояснение: Простое число - это число, которое делится только на себя и 1. Пример: 2,3,5,7...
1) если a <2: если "a" меньше 2, это не простое число.
2) elif a! = 2 и a% 2 == 0: если "a" делится на 2, то это определенно не простое число. Но если a = 2, мы не хотим оценивать это, поскольку это простое число. Отсюда условие а! = 2
3) вернуть все (% я для я в диапазоне (3, int (a 0,5) +1)): ** Сначала посмотрите, что команда all() делает в python. Начиная с 3 мы делим "а" до его квадратного корня (а ** 0,5). Если "а" делится, вывод будет ложным. Почему квадратный корень? Пусть скажет а = 16. Квадратный корень из 16 = 4. Нам не нужно оценивать до 15. Нам нужно только проверить до 4, чтобы сказать, что это не простое число.
Дополнительно: цикл для нахождения всех простых чисел в диапазоне.
for i in range(1,100):
if is_prime(i):
print("{} is a prime number".format(i))
Ответ 7
Я сравнил эффективность самых популярных предложений, чтобы определить, является ли число простым. Я использовал python 3.6
на ubuntu 17.10
; Я проверил с номерами до 100.000 (вы можете проверить с большими числами, используя мой код ниже).
На этом первом графике сравниваются функции (которые объясняются ниже в моем ответе), показывая, что последние функции растут не так быстро, как первая при увеличении чисел.
![plot1]()
И на втором графике мы видим, что в случае простых чисел время неуклонно растет, но не простые числа растут не так быстро во времени (поскольку большинство из них можно устранить на ранней стадии).
![plot2]()
Вот функции, которые я использовал:
этот ответ и этот ответ предложили конструкцию с использованием all()
:
def is_prime_1(n):
return n > 1 and all(n % i for i in range(2, int(math.sqrt(n)) + 1))
Этот ответ использовал какой-то цикл while:
def is_prime_2(n):
if n <= 1:
return False
if n == 2:
return True
if n == 3:
return True
if n % 2 == 0:
return False
if n % 3 == 0:
return False
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w
return True
Этот ответ включал версию с циклом for
:
def is_prime_3(n):
if n <= 1:
return False
if n % 2 == 0 and n > 2:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
И я смешал несколько идей из других ответов в новый:
def is_prime_4(n):
if n <= 1: # negative numbers, 0 or 1
return False
if n <= 3: # 2 and 3
return True
if n % 2 == 0 or n % 3 == 0:
return False
for i in range(5, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
Вот мой скрипт для сравнения вариантов:
import math
import pandas as pd
import seaborn as sns
import time
from matplotlib import pyplot as plt
def is_prime_1(n):
...
def is_prime_2(n):
...
def is_prime_3(n):
...
def is_prime_4(n):
...
default_func_list = (is_prime_1, is_prime_2, is_prime_3, is_prime_4)
def assert_equal_results(func_list=default_func_list, n):
for i in range(-2, n):
r_list = [f(i) for f in func_list]
if not all(r == r_list[0] for r in r_list):
print(i, r_list)
raise ValueError
print('all functions return the same results for integers up to {}'.format(n))
def compare_functions(func_list=default_func_list, n):
result_list = []
n_measurements = 3
for f in func_list:
for i in range(1, n + 1):
ret_list = []
t_sum = 0
for _ in range(n_measurements):
t_start = time.perf_counter()
is_prime = f(i)
t_end = time.perf_counter()
ret_list.append(is_prime)
t_sum += (t_end - t_start)
is_prime = ret_list[0]
assert all(ret == is_prime for ret in ret_list)
result_list.append((f.__name__, i, is_prime, t_sum / n_measurements))
df = pd.DataFrame(
data=result_list,
columns=['f', 'number', 'is_prime', 't_seconds'])
df['t_micro_seconds'] = df['t_seconds'].map(lambda x: round(x * 10**6, 2))
print('df.shape:', df.shape)
print()
print('', '-' * 41)
print('| {:11s} | {:11s} | {:11s} |'.format(
'is_prime', 'count', 'percent'))
df_sub1 = df[df['f'] == 'is_prime_1']
print('| {:11s} | {:11,d} | {:9.1f} % |'.format(
'all', df_sub1.shape[0], 100))
for (is_prime, count) in df_sub1['is_prime'].value_counts().iteritems():
print('| {:11s} | {:11,d} | {:9.1f} % |'.format(
str(is_prime), count, count * 100 / df_sub1.shape[0]))
print('', '-' * 41)
print()
print('', '-' * 69)
print('| {:11s} | {:11s} | {:11s} | {:11s} | {:11s} |'.format(
'f', 'is_prime', 't min (us)', 't mean (us)', 't max (us)'))
for f, df_sub1 in df.groupby(['f', ]):
col = df_sub1['t_micro_seconds']
print('|{0}|{0}|{0}|{0}|{0}|'.format('-' * 13))
print('| {:11s} | {:11s} | {:11.2f} | {:11.2f} | {:11.2f} |'.format(
f, 'all', col.min(), col.mean(), col.max()))
for is_prime, df_sub2 in df_sub1.groupby(['is_prime', ]):
col = df_sub2['t_micro_seconds']
print('| {:11s} | {:11s} | {:11.2f} | {:11.2f} | {:11.2f} |'.format(
f, str(is_prime), col.min(), col.mean(), col.max()))
print('', '-' * 69)
return df
Запуск функции compare_functions(n=10**5)
(числа до 100.000) Я получаю такой вывод:
df.shape: (400000, 5)
-----------------------------------------
| is_prime | count | percent |
| all | 100,000 | 100.0 % |
| False | 90,408 | 90.4 % |
| True | 9,592 | 9.6 % |
-----------------------------------------
---------------------------------------------------------------------
| f | is_prime | t min (us) | t mean (us) | t max (us) |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_1 | all | 0.57 | 2.50 | 154.35 |
| is_prime_1 | False | 0.57 | 1.52 | 154.35 |
| is_prime_1 | True | 0.89 | 11.66 | 55.54 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_2 | all | 0.24 | 1.14 | 304.82 |
| is_prime_2 | False | 0.24 | 0.56 | 304.82 |
| is_prime_2 | True | 0.25 | 6.67 | 48.49 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_3 | all | 0.20 | 0.95 | 50.99 |
| is_prime_3 | False | 0.20 | 0.60 | 40.62 |
| is_prime_3 | True | 0.58 | 4.22 | 50.99 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_4 | all | 0.20 | 0.89 | 20.09 |
| is_prime_4 | False | 0.21 | 0.53 | 14.63 |
| is_prime_4 | True | 0.20 | 4.27 | 20.09 |
---------------------------------------------------------------------
Затем, запустив функцию compare_functions(n=10**6)
(числа до 1.000.000), я получаю следующий вывод:
df.shape: (4000000, 5)
-----------------------------------------
| is_prime | count | percent |
| all | 1,000,000 | 100.0 % |
| False | 921,502 | 92.2 % |
| True | 78,498 | 7.8 % |
-----------------------------------------
---------------------------------------------------------------------
| f | is_prime | t min (us) | t mean (us) | t max (us) |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_1 | all | 0.51 | 5.39 | 1414.87 |
| is_prime_1 | False | 0.51 | 2.19 | 413.42 |
| is_prime_1 | True | 0.87 | 42.98 | 1414.87 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_2 | all | 0.24 | 2.65 | 612.69 |
| is_prime_2 | False | 0.24 | 0.89 | 322.81 |
| is_prime_2 | True | 0.24 | 23.27 | 612.69 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_3 | all | 0.20 | 1.93 | 67.40 |
| is_prime_3 | False | 0.20 | 0.82 | 61.39 |
| is_prime_3 | True | 0.59 | 14.97 | 67.40 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_4 | all | 0.18 | 1.88 | 332.13 |
| is_prime_4 | False | 0.20 | 0.74 | 311.94 |
| is_prime_4 | True | 0.18 | 15.23 | 332.13 |
---------------------------------------------------------------------
Для построения результатов я использовал следующий скрипт:
def plot_1(func_list=default_func_list, n):
df_orig = compare_functions(func_list=func_list, n=n)
df_filtered = df_orig[df_orig['t_micro_seconds'] <= 20]
sns.lmplot(
data=df_filtered, x='number', y='t_micro_seconds',
col='f',
# row='is_prime',
markers='.',
ci=None)
plt.ticklabel_format(style='sci', axis='x', scilimits=(3, 3))
plt.show()
Ответ 8
Можно использовать sympy.
import sympy
sympy.ntheory.primetest.isprime(33393939393929292929292911111111)
True
Из симплексных документов. Первый шаг - поиск тривиальных факторов, которые, если их обнаруживают, позволяют быстро вернуться. Затем, если сито достаточно большое, используйте поиск по бисекции на сите. Для небольших чисел набор детерминированных тестов Миллера-Рабина выполняется с базами, которые, как известно, не имеют контрпримеров в своем диапазоне. Наконец, если число больше 2 ^ 64, выполняется сильный тест BPSW. Хотя это вероятный первичный тест, и мы считаем, что существуют контрпримеры, нет известных контрпримеров
Ответ 9
Для больших чисел вы не можете просто наивно проверить, делится ли число кандидатов N на одно из чисел, меньших, чем sqrt (N). Доступны гораздо более масштабируемые тесты, такие как тест первичности Миллера-Рабина. Ниже у вас есть реализация в Python:
def is_prime(x):
"""Fast implementation fo Miller-Rabin primality test, guaranteed to be correct."""
import math
def get_sd(x):
"""Returns (s: int, d: int) for which x = d*2^s """
if not x: return 0, 0
s = 0
while 1:
if x % 2 == 0:
x /= 2
s += 1
else:
return s, x
if x <= 2:
return x == 2
# x - 1 = d*2^s
s, d = get_sd(x - 1)
if not s:
return False # divisible by 2!
log2x = int(math.log(x) / math.log(2)) + 1
# As long as Riemann hypothesis holds true, it is impossible
# that all the numbers below this threshold are strong liars.
# Hence the number is guaranteed to be a prime if no contradiction is found.
threshold = min(x, 2*log2x*log2x+1)
for a in range(2, threshold):
# From Fermat little theorem if x is a prime then a^(x-1) % x == 1
# Hence the below must hold true if x is indeed a prime:
if pow(a, d, x) != 1:
for r in range(0, s):
if -pow(a, d*2**r, x) % x == 1:
break
else:
# Contradicts Fermat little theorem, hence not a prime.
return False
# No contradiction found, hence x must be a prime.
return True
Вы можете использовать его, чтобы найти огромные простые числа:
x = 10000000000000000000000000000000000000000000000000000000000000000000000000000
for e in range(1000):
if is_prime(x + e):
print('%d is a prime!' % (x + e))
break
# 10000000000000000000000000000000000000000000000000000000000000000000000000133 is a prime!
Если вы тестируете случайные целые числа, возможно, вы хотите сначала проверить, делится ли число кандидатов на любое из простых чисел, меньших, например, 1000, прежде чем позвонить Миллеру-Рабину. Это поможет вам отфильтровать очевидные не простые числа, такие как 10444344345.
Ответ 10
Python 3:
def is_prime(a):
return a > 1 and all(a % i for i in range(2, int(a**0.5) + 1))
Ответ 11
Слишком поздно для вечеринки, но надеюсь, что это поможет. Это актуально, если вы ищете большие простые числа:
Чтобы проверить большие нечетные числа, вам нужно использовать тест Fermat-test и/или Miller-Rabin.
Эти тесты используют модульное возведение в степень, которое довольно дорогое, для экспоненции n
бит вам нужно как минимум n
большого умножения int и n
большого int divison. Это означает, что сложность модульного возведения в степень - O (n³).
Поэтому, прежде чем использовать большие пушки, вам нужно сделать несколько пробных подразделений. Но не делайте это наивно, есть способ быстро их сделать. Сначала умножьте столько простых чисел вместе, сколько вписывается в слова, которые вы используете для больших целых чисел. Если вы используете 32-битные слова, умножьте 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 = 3234846615 и вычислите наибольший общий делитель с номером, который вы проверите, используя алгоритм Евклида. После первого шага число уменьшается ниже размера слова и продолжает алгоритм без выполнения полных больших целых делений. Если GCD! = 1, это означает, что один из простых чисел, которые вы умножили, делит число, поэтому у вас есть доказательство, что оно не простое. Затем продолжайте с 31 * 37 * 41 * 43 * 47 = 95041567 и так далее.
После того, как вы проверили несколько сотен (или тысяч) простых чисел таким образом, вы можете выполнить 40 раундов теста Миллера-Рабина, чтобы подтвердить, что число является простым, после 40 раундов вы можете быть уверены, что число является простым, есть только вероятность 2 ^ -80 это не (скорее, ваши аппаратные сбои...).
Ответ 12
У меня есть основная функция, которая работает до (2 ^ 61) -1 Здесь:
from math import sqrt
def isprime(num): num > 1 and return all(num % x for x in range(2, int(sqrt(num)+1)))
Объяснение:
Функция all()
может быть переопределена следующим образом:
def all(variables):
for element in variables:
if not element: return False
return True
Функция all()
просто проходит через ряд bools/numbers и возвращает False
если она видит 0 или False
.
Функция sqrt()
просто выполняет квадратный корень из числа.
Например:
>>> from math import sqrt
>>> sqrt(9)
>>> 3
>>> sqrt(100)
>>> 10
Часть num % x
возвращает оставшуюся часть num/x.
Наконец, range(2, int(sqrt(num)))
означает, что он создаст список, начинающийся с 2 и заканчивающийся на int(sqrt(num)+1)
Для получения дополнительной информации о диапазоне, посмотрите на этом сайте !
Параметр num > 1
просто проверяет, превышает ли переменная num
более 1, потому что 1 и 0 не считаются простыми числами.
Надеюсь, это помогло :)
Ответ 13
В Python:
def is_prime(n):
return not any(n % p == 0 for p in range(2, int(math.sqrt(n)) + 1))
Более прямое преобразование из математического формализма в Python будет использовать все (n% p! = 0...), но это требует строгой оценки всех значений p. Не любая версия может заканчиваться раньше, если найдено Истинное значение.
Ответ 14
лучший алгоритм для числа Primes javascript
function isPrime(num) {
if (num <= 1) return false;
else if (num <= 3) return true;
else if (num % 2 == 0 || num % 3 == 0) return false;
var i = 5;
while (i * i <= num) {
if (num % i == 0 || num % (i + 2) == 0) return false;
i += 6;
}
return true
}
Ответ 15
import math
import time
def check_prime(n):
if n == 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
from_i = 3
to_i = math.sqrt(n) + 1
for i in range(from_i, int(to_i), 2):
if n % i == 0:
return False
return True
Ответ 16
Аналогичная идея с алгоритмом AKS, о котором говорилось
public static boolean isPrime(int n) {
if(n == 2 || n == 3) return true;
if((n & 1 ) == 0 || n % 3 == 0) return false;
int limit = (int)Math.sqrt(n) + 1;
for(int i = 5, w = 2; i <= limit; i += w, w = 6 - w) {
if(n % i == 0) return false;
numChecks++;
}
return true;
}
Ответ 17
Чтобы узнать, является ли число или числа в диапазоне/основными.
#!usr/bin/python3
def prime_check(*args):
for arg in args:
if arg > 1: # prime numbers are greater than 1
for i in range(2,arg): # check for factors
if(arg % i) == 0:
print(arg,"is not Prime")
print(i,"times",arg//i,"is",arg)
break
else:
print(arg,"is Prime")
# if input number is less than
# or equal to 1, it is not prime
else:
print(arg,"is not Prime")
return
# Calling Now
prime_check(*list(range(101))) # This will check all the numbers in range 0 to 100
prime_check(#anynumber) # Put any number while calling it will check.
Ответ 18
myInp=int(input("Enter a number: "))
if myInp==1:
print("The number {} is neither a prime not composite no".format(myInp))
elif myInp>1:
for i in range(2,myInp//2+1):
if myInp%i==0:
print("The Number {} is not a prime no".format(myInp))
print("Because",i,"times",myInp//i,"is",myInp)
break
else:
print("The Number {} is a prime no".format(myInp))
else:
print("Alas the no {} is a not a prime no".format(myInp))
Ответ 19
Вы могли бы попробовать что-то вроде этого.
def main():
try:
user_in = int(input("Enter a number to determine whether the number is prime or not: "))
except ValueError:
print()
print("You must enter a number!")
print()
return
list_range = list(range(2,user_in+1))
divisor_list = []
for number in list_range:
if user_in%number==0:
divisor_list.append(number)
if len(divisor_list) < 2:
print(user_in, "is a prime number!")
return
else:
print(user_in, "is not a prime number!")
return
main()
Ответ 20
Большинство предыдущих ответов верны, но вот еще один способ проверить, является ли число простым числом. В качестве повторного обновления простые числа целые числа больше 1, единственными факторами которых являются 1 и сам (источник)
Решение:
Как правило, вы можете построить цикл и начать тестирование своего номера, чтобы узнать, делится ли он на 1,2,3... до числа, которое вы тестируете... и т.д., Но чтобы сократить время проверки, вы можете разделить свой номер на половину значения вашего номера, потому что число не может быть точно делит на что-либо выше половины его значения. Например, если вы хотите видеть 100, это простое число, которое вы можете прокрутить до 50.
Фактический код:
def find_prime(number):
if(number ==1):
return False
# we are dividiing and rounding and then adding the remainder to increment !
# to cover not fully divisible value to go up forexample 23 becomes 11
stop=number//2+number%2
#loop through up to the half of the values
for item in range(2,stop):
if number%item==0:
return False
print(number)
return True
if(find_prime(3)):
print("it a prime number !!")
else:
print("it not a prime")
Ответ 21
Мы можем использовать потоки java для реализации этого в O (sqrt (n)); Учтите, что noneMatch - это метод shortCircuiting, который останавливает операцию, если для определения результата нет необходимости:
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(n == 2 ? "Prime" : IntStream.rangeClosed(2, ((int)(Math.sqrt(n)) + 1)).noneMatch(a -> n % a == 0) ? "Prime" : "Not Prime");
Ответ 22
С помощью потоков и лямбд Java-8 это может быть реализовано следующим образом:
public static boolean isPrime(int candidate){
int candidateRoot = (int) Math.sqrt( (double) candidate);
return IntStream.range(2,candidateRoot)
.boxed().noneMatch(x -> candidate % x == 0);
}
Производительность должна быть близка к O (sqrt (N)). Может быть, кто-то найдет это полезным.
Ответ 23
Вот мой взгляд на ответ:
def isprime(num):
return num <= 3 or (num + 1) % 6 == 0 or (num - 1) % 6 == 0
Функция вернет True, если какое-либо из приведенных ниже свойств имеет значение True. Эти свойства математически определяют, что такое простое число.
- Число меньше или равно 3
- Число + 1 делится на 6
- Число - 1 делится на 6
Ответ 24
Простое число - это любое число, которое делится только на 1 и на себя. Все остальные числа называются составными.
Самый простой способ найти простое число - проверить, является ли введенное число составным числом:
function isPrime(number) {
// Check if a number is composite
for (let i = 2; i < number; i++) {
if (number % i === 0) {
return false;
}
}
// Return true for prime numbers
return true;
}
Программа должна делить значение number
на все целые числа от 1 и до его значения. Если это число можно разделить поровну не только на одно, а на самом деле, это составное число.
Начальное значение переменной i
должно быть 2, потому что как простые, так и составные числа могут быть равномерно разделены на 1.
for (let i = 2; i < number; i++)
Тогда i
меньше, чем number
по той же причине. Простые и составные числа могут быть равномерно разделены между собой. Поэтому нет причин проверять это.
Затем мы проверяем, можно ли разделить переменную равномерно, используя оператор остатка.
if (number % i === 0) {
return false;
}
Если остаток равен нулю, это означает, что number
можно разделить равномерно, следовательно, составное число и возвращение false.
Если введенный номер не удовлетворяет условию, это означает, что это простое число, и функция возвращает true.
Ответ 25
Малая память? Это не самый маленький, но это шаг в правильном направлении.
class PrimeDictionary {
BitArray bits;
public PrimeDictionary(int n) {
bits = new BitArray(n + 1);
for (int i = 0; 2 * i + 3 <= n; i++) {
bits.Set(i, CheckPrimality(2 * i + 3));
}
}
public PrimeDictionary(IEnumerable<int> primes) {
bits = new BitArray(primes.Max());
foreach(var prime in primes.Where(p => p != 2)) {
bits.Set((prime - 3) / 2, true);
}
}
public bool IsPrime(int k) {
if (k == 2) {
return true;
}
if (k % 2 == 0) {
return false;
}
return bits[(k - 3) / 2];
}
}
Конечно, вы должны указать определение CheckPrimality
.
Ответ 26
Я думаю, что одним из самых быстрых является мой метод, который я сделал.
void prime(long long int number) {
// Establishing Variables
long long int i = 5;
int w = 2;
const long long int lim = sqrt(number);
// Gets 2 and 3 out of the way
if (number == 1) { cout << number << " is hard to classify. \n"; return; }
if (number == 2) { cout << number << " is Prime. \n"; return; }
if (number == 3) { cout << number << " is Prime. \n"; return; }
// Tests Odd Ball Factors
if (number % 2 == 0) { cout << number << " is not Prime. \n"; return; }
if (number % 3 == 0) { cout << number << " is not Prime. \n"; return; }
while (i <= lim) {
if (number % i == 0) { cout << number << " is not Prime. \n"; return; }
// Tests Number
i = i + w; // Increments number
w = 6 - i; // We already tested 2 and 3
// So this removes testing multepules of this
}
cout << number << " is Prime. \n"; return;
}
Ответ 27
Вы можете попробовать этот код:
def isprime(n):
if n == 1:
return False
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
Чтобы использовать его, просто введите isprime(NUMBER)
Используя этот код, вы можете спросить пользователя о номере и проверить, является ли он основным:
def isprime(n):
if n == 1:
return False
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
while True:
number = input('Please Enter A Number: ')
if isprime(int(number)):
print('The Number You Entered Is A Prime Number', end='\n\n')
else:
print('The Number You Entered Is Not A Prime Number', end='\n\n')
Ответ 28
public class PrimeNumberOrNot {
public static void main(String[] args) {
System.out.println(isPrimeOrNot(12345673));
}
public static String isPrimeOrNot(int num) {
if (num < 0) {
return "not valid";
}
if (num == 0 || num == 1) {
return "not prime";
}
if (num == 2 || num == 3) {
return "prime number";
}
if ((num * num - 1) % 24 == 0) {
return "prime";
} else {
return "not prime";
}
}
}
Ответ 29
public static boolean isPrime(int number) {
if(number < 2)
return false;
else if(number == 2 || number == 3)
return true;
else {
for(int i=2;i<=number/2;i++)
if(number%i == 0)
return false;
else if(i==number/2)
return true;
}
return false;
}
Ответ 30
Первое правило простого числа: если разделить на 2, это будет целое число или целое число Нет, это не простое число.
Самый быстрый способ узнать, используя любой компьютерный язык - это сопоставление типов с использованием строк, а не математики. Сопоставьте ТОЧКУ в струнном поплавке.
- Разделите это на 2 ,, n = n/2
- Преобразовать это в строку ,, n = string (n)
- если "." в п: {printf "Да, я премьер!"
} }