|
|
||||||||||||||||
Быстрая проверка натурального числа на простоту29.09.2012, 21:35. Показов 146424. Ответов 121
Метки нет (Все метки)
Часто возникает задача проверки натурального числа на простоту. При этом имеются вероятностные и детерминированные методы проверки. Здесь рассматриваются только детерминированные алгоритмы, дающие 100% ответ на вопрос о простоте.
Хорошо известно такое утверждение: если натуральное число n>1 не делится ни на одно простое число, не превосходящее
33
|
||||||||||||||||
| 29.09.2012, 21:35 | |
|
Ответы с готовыми решениями:
121
Проверка на простоту числа Проверка числа на простоту Проверка числа на простоту |
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||||||
| 30.10.2012, 23:21 | |||||||
должно получится 16 циклов вместо 64 между ними можно сдвигать еще на 4,2 можно начать сдвигать с 16 с 32 Добавлено через 2 минуты если первый цикл сделать сдвиг на 32 потом 16,8,4,2,1 то в самом пиковом случае 12 циклов(если я правильно подсчитал)
0
|
|||||||
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
||||||
| 31.10.2012, 11:13 | ||||||
|
ValeryS, попробуем
Добавлено через 21 минуту ValeryS, что то пример работает не верно. Наверно вы не проверяли результат. В общем вот так надо
- стандартный алгоритм - 44 битовых операции - усовершенствованный - 5 + 4 = 9 битовых операций А для больших чисел наверно можно и увеличить ширину сдвига. Но тогда чем больше ширина сдвига, тем больше нужно сделать сдвигов для маленьких чисел. Например для самого большого числа в 63 бит: - при сдвиге в 8 получаем 7 + 7 = 14 БО - при сдвиге в 16 получаем 3 + 15 = 18 БО - при сдвиге в 32 получаем 1 + 31 = 32 БО Думаю 8 это оптимально.
1
|
||||||
|
|
||||||||||||
| 31.10.2012, 12:03 [ТС] | ||||||||||||
|
можно использовать двоичный поиск. сложность алгоритма
Первый алгоритм максимум сделает 6 проверок, второй - 64 проверки. почувствуйте разницу. Добавлено через 14 минут
0
|
||||||||||||
|
Супер-модератор
|
|
| 31.10.2012, 12:30 | |
|
Вы будете смеяться... Но самый быстрый алгоритм проверки числа (до 10000) на простоту, на мой взгляд, таков:
Создать упорядоченный массив всех простых чисел от 2 до 9973, а проверяемое число искать двоичным поиском в этом массиве... Проверяться будет "пулей" !
0
|
|
|
|
|
| 31.10.2012, 12:35 [ТС] | |
|
Catstail, смеяться никто не будет. При любом модуле m именно это и происходит при проверке всех простых чисел, меньших числа m (именно двоичный поиск). Это все понятно и просто. самое интересное начинается, когда простые числа в массиве заканчиваются, а проверка на делители продолжается)))
1
|
|
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
|
| 31.10.2012, 13:04 | |
|
Catstail, в этой теме рассматриваются числа уже больше чем 1000, а именно как минимум _int64, и для этих числе я решил задачу ( читайте выше) А щас надо попытаться сделать длинное деление по модулю
Добавлено через 5 минут Thinker, сложность то будет немного другая , я бы сказал O(ln n) * 2 так как вы в проверке еще сдвиги делаете и еще проверок в два раза больше - в цикле и для того чтобы суммировать.. в общем надо уже на практике заменять разные реализации и при прочих равных условиях посмотреть что получится) ок. Попробую
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
||||||||
| 31.10.2012, 13:39 | ||||||||
![]() поскольку цикл лишний раз крутится нужна компенсация в общем вот проверка четырех алгоритмов два моих и два твоих(все работает идентично)
0
|
||||||||
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
|
| 31.10.2012, 13:48 | |
|
Thinker, а как проводились тестирования?
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|||
| 31.10.2012, 13:49 | |||
|
если скрестить мой второй алгоритм (My1Algor) и твой (AEXksHiAlgor) то для _int64 можно наверное вообще без циклов обойтись, только проверки(if)
0
|
|||
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
|
| 31.10.2012, 14:15 | |
|
ValeryS, там выше есть уже этот алгоритм)
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
||||||||
| 31.10.2012, 14:19 | ||||||||
|
мои алгоритмы врут при 0
0
|
||||||||
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
|
| 31.10.2012, 14:24 | |
|
ValeryS, #43
0
|
|
|
Супер-модератор
|
||
| 31.10.2012, 14:48 | ||
|
0
|
||
|
|
|
| 31.10.2012, 14:59 [ТС] | |
|
Catstail, в криптографии нет ограничений. Там по принципу "чем сложнее, тем лучше". Поэтому ограничений на длину простых чисел тоже нет, чем длиннее, тем лучше. На этом базируется сложность вскрытия ассимметричных шифров, схем разделения секрета и т.д. Никакой массив не уместит столько простых чисел, чтобы перечислить все простые числа, которые могут быть использованы, например в RSA.
0
|
|
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
|
| 31.10.2012, 15:43 | |
|
Catstail, тем более чтение из огроменного массива будет занимать много времени, так как не все время же это будет находиться в ОЗУ. По этому это не вариант.
Добавлено через 1 минуту Catstail, а прикинуть не сложно. Например взять 100 000 000 чисел - 100 000 000* 8 / 1024 /1024 = 7,6 мб , соответственно 1млрд - около 7,6 * 100 = 7600 мб
0
|
|
|
24 / 3 / 0
Регистрация: 28.10.2012
Сообщений: 35
|
|
| 31.10.2012, 23:00 | |
|
Thinker, столкнулся с некоторыми проблемами при реализации длинного деления по модулю.
1) почему то битовые операции работают только с 32х разрядными числами и не хотят сдвигать на 32 33 и выше. 2) как делить по модулю на составное число (реализовал только массив на uint)
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
||||||||||||
| 01.11.2012, 08:39 | ||||||||||||
но все дело в
0хFF знаковый бит 1 сдвигаем 0xFF>>1 получаем 0x7F добавляем знаковый бит 0xFF от чего ушли к тому пришли
0
|
||||||||||||
| 01.11.2012, 08:39 | |
|
Проверка числа на простоту Проверка числа на простоту Проверка числа на простоту
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|