|  | eXeL@B —› Программирование —› Задачка о простоте чисел | 
| Посл.ответ | Сообщение | 
|  | Создано: 21 июня 2012 12:21 · Поправил: ARCHANGEL · Личное сообщение · #1 Всем добрый день. Реализую вероятностный метод проверки чисел на простоту (Миллера-Рабина). В общем и целом не возникает особых проблем, ибо тема распиана во многих монографиях и мануалах, например, . Вот только везде, где мне удавалось нагуглить что-то стоящее внимания, не описывается момент, как n-1 раскладывают на два множителя так, чтоб один был результатом возведения двойки в некую степень s, а другой - как можно меньшим нечётным числом. Студенческие реализации полны фольклора, но тупой перебор здесь не годится. Поясню более подробно. Допустим, имеем достаточно большое число, которое нужно проверить на простоту. Если рассматривать функцию степени двойки, то она асимптотически растёт, т.е. у нас есть два дискретных значения (т.к. для целых чисел) этой функции, к примеру, 64 (2^6) и 128 (2^7). Нужно проверить на простоту число 127. Ближайшее целое (ну, а какое ещё), принадлежащее отображению этой степенной функции, это 64. Т.е. если тупо в цикле, отнимая от 127 единицу на каждой итерации, проверять числа делением на 2 (типа, делим 127 на два, если разделилось нацело, полученный результат делим опять на два, если нет - переходим к следующему, и так, пока не найдём число, являющееся степенью двойки), то это будет очень неэффективно. Ведь если ближайшее меньшее число степени двойки положим равным n, а ближайшее большее тогда будет 2*n, то нужно в худшем случае проверить n-1 вариантов. Да и сами числа могут быть составными, но по-разному составными. Т.е. двойка может входить в разложение такого числа не единожды (далеко не единожды). Битовые операции (сдвиги и тесты старшего бита) тоже нельзя использовать, поскольку с вещественными числами их нельзя применять по причине упакованности последних. И как же быть? ----- Stuck to the plan, always think that we would stand up, never ran.  | 
|  | Создано: 21 июня 2012 13:35 · Личное сообщение · #2 | 
|  | Создано: 21 июня 2012 14:41 · Поправил: VodoleY · Личное сообщение · #3 ARCHANGEL может я чет не понял, но признак делимости число на 2 это его окончание хххх10 в бинарном виде, а недилимость это хххххх1, кагбы все ничетные числа заканчиваюца на 1 в бинарном видел. я когдато курил тему про простые числа.. и самый быстрый контроль при бруте это если число в десятчиной заканчиваеца на 1 3 7 9 , типа все простые числа имеют такое окончание   ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....  | 
|  | Создано: 21 июня 2012 15:07 · Поправил: ARCHANGEL · Личное сообщение · #4 VodoleY пишет: но признак делимости число на 2 это его окончание хххх10 в бинарном виде Да, так и есть. Для переменных целого типа. А когда мы имеем дело с вещественными числами, то в памяти оно хранится как BCD упакованное, т.е. нельзя просто проверить его младший разряд, или считать старший, чтоб узнать наиболее близкое меньшее число, являющееся степенью двойки. и самый быстрый контроль при бруте это если число в десятчиной заканчиваеца на 1 3 7 9 Но это же ещё не вся проверка. 33 ведь не простое число. З.Ы. Хотя от упакованных чисел, видимо, придётся отказаться. ----- Stuck to the plan, always think that we would stand up, never ran.  | 
|  | Создано: 21 июня 2012 19:11 · Личное сообщение · #5 ARCHANGEL я собственно о чем пытался сказать.. что есть варианты, когда проверка числа на псевдо простое(с достаточной глубиной), может занять больше времени чем просчет итерации брута с этим числом. НО минимальный тест который пролетает мнгновенно это признак 1 3 7 9 ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....  | Сообщение посчитали полезным: ajax | 
|  | Создано: 25 июня 2012 20:28 · Личное сообщение · #6 | 
|  | Создано: 25 июня 2012 21:36 · Личное сообщение · #7 | 
|  | Создано: 25 июня 2012 21:42 · Личное сообщение · #8 Promix_17 В самом алгоритме - ниоткуда, т.к. алгоритм применим на кольце вычетов, которое образовано элементами целых чисел. Но тут есть одно но. По логике 8-байтовый double должен вмещать бОльшие целые значения, нежели 4-байтовый DWORD. ----- Stuck to the plan, always think that we would stand up, never ran.  | 
|  | Создано: 25 июня 2012 22:12 · Личное сообщение · #9 Лучше б __int64 заюзал, он целый и вопросов не создаст. Ну или его же unsigned. И тоже 8 байтов. И никаких проблем с корявым представлением, типа что упакованный. Накой там дабл, непонятно.  | Сообщение посчитали полезным: ARCHANGEL | 
|  | Создано: 25 июня 2012 22:14 · Личное сообщение · #10 | 
|  | Создано: 25 июня 2012 22:20 · Поправил: Promix_17 · Личное сообщение · #11 VodoleY пишет: Promix_17 ты 4дня думал чтоб процитировать сообщение? - я только зашёл ARCHANGEL пишет: 8-байтовый double должен вмещать бОльшие целые значения, нежели 4-байтовый DWORD 8-байт = 64 бита - как-то слабо... Т.е. если это что-то для RSA или т.п., то надо будет самому работу с большими числами пилить.  | Сообщение посчитали полезным: DimitarSerg | 
|  | Создано: 26 июня 2012 09:22 · Личное сообщение · #12 Promix_17 все реализации алгоритмов, работающих с большими числами, используют дополнительные библиотеки для работы с большими числами. Для делфи это FGInt(стабильная, но скудная) DFFLibV13 (малеха подглючивает, отписал афтору обещал исправить) для си это BigDigits-2.3.0(сам юзать не пробывал). Есть еще реализованные базовые функи на асме (сложение умножение деление и т.д) ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....  | Сообщение посчитали полезным: ARCHANGEL | 
|  | Создано: 26 июня 2012 10:21 · Поправил: F_a_u_s_t · Личное сообщение · #13 | 
|  | Создано: 26 июня 2012 11:16 · Личное сообщение · #14 | 
|  | eXeL@B —› Программирование —› Задачка о простоте чисел | 









 Для печати
 Для печати