|
|
||||||||||||||||
Быстрая проверка натурального числа на простоту29.09.2012, 21:35. Показов 144768. Ответов 121
Метки нет (Все метки)
Часто возникает задача проверки натурального числа на простоту. При этом имеются вероятностные и детерминированные методы проверки. Здесь рассматриваются только детерминированные алгоритмы, дающие 100% ответ на вопрос о простоте.
Хорошо известно такое утверждение: если натуральное число n>1 не делится ни на одно простое число, не превосходящее
33
|
||||||||||||||||
| 29.09.2012, 21:35 | |
|
Ответы с готовыми решениями:
121
Проверка на простоту числа Проверка числа на простоту Проверка числа на простоту |
|
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
|
|
| 29.09.2012, 21:47 | |
|
интересно..
что лучше, код который краток и понятен или который быстрый, но в котором много буковок, переменных, и на первый взгляд вообще ужасающий?
0
|
|
|
|
||||||
| 29.09.2012, 21:52 [ТС] | ||||||
|
проверку на простоту можно в одну строчку написать (для a>=2)
2
|
||||||
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
| 29.09.2012, 22:12 | |
|
Мне кажется, ничего более быстрого не будет... Могу только предложить метод (возможно, очевидный) учета чисел, делимость на которые мы не проверяем:
Сделать массив из sqrt(n) элементов типа bool, инициализировать его нулями. Потом для каждого числа m, соответствующий элемент массива для которого равен 0, проверять делимость на него, а потом помечать все элементы вида m*k, где k -- целое, как не подлежащие проверке (единицой). Вроде должно работать, но кушает sqrt(n) бит памяти. Т.е., выигрыш по времени, проигрыш по памяти
1
|
|
|
|
|
| 29.09.2012, 22:22 [ТС] | |
|
Не по теме: Leomana, Вы как девушка, может напишите более красивый алгоритм:) Добавлено через 8 минут UFO94, вариант хороший и понятный использовать в совокупности решето Этатосфена с проверкой на простоту, но вопрос в память, действительно, упирается. Но, как вариант, попробуйте для сравнения
0
|
|
|
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
|
|
| 29.09.2012, 22:29 | |
|
[QUOTE=Thinker;3501837]
Не по теме: Leomana, Вы как девушка, может напишите более красивый алгоритм:) куда уж краше хм.. надо запомнить такую печальную вещь о массиве)) Мне вот еще интересно.. где же может появится необходимость узнать простое ли число?
0
|
|
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
| 29.09.2012, 22:50 | |
|
Thinker, а ты коварен) Хочешь быстро раскладывать на множители и заставить математиков придумывать в криптографии что-то кардинально новое?)
0
|
|
|
|
||
| 29.09.2012, 22:58 [ТС] | ||
|
Не по теме: вы о взломе шифров. нет, все это не подойдет, так как в реальных шифрах числа ОЧЕНЬ большие и все известные методы взлома шифров с открытым ключом имеют эспоненциальную сложность. тем более, в серьезных шифрах с открытым ключом и цифровых подписях используются эллиптические кривые, а там другие методы шифрования. так что мне просто интересны детерминированные алгоритмы проверки на простоту, не более. Тем более они меня сегодня заинтересовали, завтра другое заинтересует, наверное.
0
|
||
|
92 / 88 / 17
Регистрация: 13.11.2011
Сообщений: 193
|
|
| 29.09.2012, 23:19 | |
|
Если кому интересно почитать статью : http://habrahabr.ru/post/124605/ там последний алгоритм за три секунды находит простые числа из 10 000 000 натуральных чисел.
1
|
|
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||
| 30.09.2012, 20:07 | ||
|
Если нужно проверить натуральное число на простоту, то тут лучше подходит вариант Thinker (по времени). Если же нужно найти все простые числа в диапазоне от 1 до N или если нужно найти первые N простых числа, то здесь лучше подойдет упомянутое решето Эратосфена (по времени).
2
|
||
|
|
|
| 01.10.2012, 09:25 [ТС] | |
|
Замечу, что число лишних проверок с 74% можно увеличить, но для этого понадобится дополнительная память для хранения простых чисел из некоторого диапазона и хранения взаимно простых с заданным модулем чисел. Например, при m=2*3*5*7*11*13*17 понадобится до 100 мб дополнительной памяти, но алгоритм обещает быть быстрее третьего алгоритма. Если кого заинтересует такая реализация, пишите, будет время, реализую, там сложного ничего нет, просто надо аккуратно прописать все. А если все числа, которые требуется проверить на простоту, из наперед заданного диапазона, то, если память позволяет, в совокупности с решетом Эратосфена алгоритм совсем быстрым получается.
0
|
|
|
~ Эврика! ~
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
| 01.10.2012, 09:38 | |
|
Напомню, что размеры чисел, используемых в RSA (обычно не меньше 10308), исключают использование детерминированных алгоритмов ввиду их медленности. (Собсно, на этом RSA отчасти и держится.) Обычно довольствуются гарантией "99%, что это простое число", получаемой от всяких алгоритмов Миллера — Рабина.
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|||||||||
| 01.10.2012, 10:16 | |||||||||
![]() для каждого числа свой(2,3,5.....) т.е выбрасывая итерации из проверки мы добавляем служебный цикл и вся "проверка"
вся скорость будет зависеть от файловой системы
0
|
|||||||||
|
|
|
| 01.10.2012, 19:08 [ТС] | |
|
~OhMyGodSoLong~, про шифрование я уже писал, что там очень большие числа, поэтому эти алгоритмы не применимы там. Просто интересно написать быстрый детерминированный алгоритм для чисел, умещающихся в стандартные типы данных.
ValeryS, немного не то. если числа принадлежат некоторому диапазону (от 1 до R), то решето Эратосфена достаточно построить до корня из R, об этом речь, если для R памяти нет, а для корня из R есть. А иначе алгоритм проверки получится банальным. При этом никаких лишних циклов не надо, решето Эратосфена до корня из R строится заранее Добавлено через 7 часов 58 минут Интересно, но если модуль увеличить, скажем m = 2*3*5*7*11 = 2310, то из множества
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|||
| 01.10.2012, 19:32 | |||
|
просто UFO94, предлагает его строить каждый раз проверили не делится на двойку вычеркнули из доп массива все кратное 2 проверили на 3 вычеркнули все кратное тройке и при каждой проверки числа мы заново заполняем этот массив я же предлагаю табличный метод, самый быстрый но и памяти жрет много тут уж зависит от задачи одно дело проверить пару чисел за программу, другое каждую секунду проверять кучу чисел
0
|
|||
|
|
|
| 01.10.2012, 20:16 [ТС] | |
|
по поводу решета Эратосфена возможны вариации. Либо мы его строим один раз до начала всех проверок, а потом при проверке числа на простоту сначала проверяем делимость на 2, далее в нем ищем следующее простое число (ничего не вычеркивая, так как все ненужное уже вычеркнуто), проверяем делимость на него и так до корня из проверяемого числа. Либо сначала строится решето Эратосфена, а потом все простые числа из этого решета записываются в некоторый массив, а память из под решета освобождается. А массив из простых чисел будет для проверки на возможные делители. Безусловно, что такой алгоритм будет быстрее работать представленных выше, но все упирается в память. Пока вопрос стоит в написании функции для проверки на простоту чисел типа long long (алгоритмы выше легко для этого подходят при изменении типов переменных). А вот для решета Эратосфена для типа unigned long long нужно 4 Гб памяти, что не всегда подходит.
Поэтому задача состоит в том, чтобы написать быстрый детерминированный алгоритм для проверки одного-двух натуральных чисел, поэтому без решета Эратосфена
1
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|||||||
| 01.10.2012, 21:23 | |||||||
|
4 Гб для unigned long (32 бита) можно 500 Мб (используя битовые маски) а unigned long long 64 бита 16 *10^18 даже не знаю приставки(экза?) бит разумеется я говорю о 32 разрядных ОС и о табличном методе я даже не могу представить прикладную задачу для таких чисел, если это не чисто математическая проблема Добавлено через 4 минуты я правильно понял твой алгоритм в массиве решето(массив простых чисел)
0
|
|||||||
|
|
|
| 01.10.2012, 21:26 [ТС] | |
|
4 Гб для типа unigned long long c учетом, что решето будет до корня из ULLONG_MAX. Алгоритм что-то типа этого, где k - такое значение, что arrEr[k-1]*arrEr[k-1] <= n
0
|
|
| 01.10.2012, 21:26 | |
|
Помогаю со студенческими работами здесь
20
Проверка числа на простоту Проверка числа на простоту Проверка числа на простоту
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|