|
|
||||||||||||||||
Быстрая проверка натурального числа на простоту29.09.2012, 21:35. Показов 145273. Ответов 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
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,869
|
|||||||||
| 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
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,869
|
|||
| 01.10.2012, 19:32 | |||
|
просто UFO94, предлагает его строить каждый раз проверили не делится на двойку вычеркнули из доп массива все кратное 2 проверили на 3 вычеркнули все кратное тройке и при каждой проверки числа мы заново заполняем этот массив я же предлагаю табличный метод, самый быстрый но и памяти жрет много тут уж зависит от задачи одно дело проверить пару чисел за программу, другое каждую секунду проверять кучу чисел
0
|
|||
|
|
|
| 01.10.2012, 20:16 [ТС] | |
|
по поводу решета Эратосфена возможны вариации. Либо мы его строим один раз до начала всех проверок, а потом при проверке числа на простоту сначала проверяем делимость на 2, далее в нем ищем следующее простое число (ничего не вычеркивая, так как все ненужное уже вычеркнуто), проверяем делимость на него и так до корня из проверяемого числа. Либо сначала строится решето Эратосфена, а потом все простые числа из этого решета записываются в некоторый массив, а память из под решета освобождается. А массив из простых чисел будет для проверки на возможные делители. Безусловно, что такой алгоритм будет быстрее работать представленных выше, но все упирается в память. Пока вопрос стоит в написании функции для проверки на простоту чисел типа long long (алгоритмы выше легко для этого подходят при изменении типов переменных). А вот для решета Эратосфена для типа unigned long long нужно 4 Гб памяти, что не всегда подходит.
Поэтому задача состоит в том, чтобы написать быстрый детерминированный алгоритм для проверки одного-двух натуральных чисел, поэтому без решета Эратосфена
1
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,869
|
|||||||
| 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
Проверка числа на простоту Проверка числа на простоту Проверка числа на простоту
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|