Сейчас на форуме: _MBK_, tyns777, UniSoft (+11 невидимых)

 eXeL@B —› Программирование —› Задачка о простоте чисел
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 21 июня 2012 13:35
· Личное сообщение · #2

Блин, вот я дурик. Можно ж просто делить это число на 2, пока делится. А когда дойдём до момента, при котором деление нацело невозможно, то эту неделящуюся часть примем за d, а количество удачных делений - за s.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 21 июня 2012 14:41 · Поправил: VodoleY
· Личное сообщение · #3

ARCHANGEL может я чет не понял, но признак делимости число на 2 это его окончание хххх10 в бинарном виде, а недилимость это хххххх1, кагбы все ничетные числа заканчиваюца на 1 в бинарном видел. я когдато курил тему про простые числа.. и самый быстрый контроль при бруте это если число в десятчиной заканчиваеца на 1 3 7 9 , типа все простые числа имеют такое окончание

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 21 июня 2012 19:11
· Личное сообщение · #5

ARCHANGEL я собственно о чем пытался сказать.. что есть варианты, когда проверка числа на псевдо простое(с достаточной глубиной), может занять больше времени чем просчет итерации брута с этим числом. НО минимальный тест который пролетает мнгновенно это признак 1 3 7 9

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: ajax

Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 25 июня 2012 20:28
· Личное сообщение · #6

ARCHANGEL пишет:
А когда мы имеем дело с вещественными числами
- откуда это вдруг взялись вещественные числа в алгоритме Миллера-Рабина?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 25 июня 2012 21:36
· Личное сообщение · #7

Promix_17 ты 4дня думал чтоб процитировать сообщение?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 25 июня 2012 21:42
· Личное сообщение · #8

Promix_17
В самом алгоритме - ниоткуда, т.к. алгоритм применим на кольце вычетов, которое образовано элементами целых чисел. Но тут есть одно но. По логике 8-байтовый double должен вмещать бОльшие целые значения, нежели 4-байтовый DWORD.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 25 июня 2012 22:12
· Личное сообщение · #9

Лучше б __int64 заюзал, он целый и вопросов не создаст. Ну или его же unsigned. И тоже 8 байтов. И никаких проблем с корявым представлением, типа что упакованный. Накой там дабл, непонятно.

| Сообщение посчитали полезным: ARCHANGEL


Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 25 июня 2012 22:14
· Личное сообщение · #10

Не совсем понятна логика использования double для целых, ведь страдает точность и если даже можно будет представить целое, превосходящее DWORD, зачем? Можно и __int64 использовать.

-----
Следуй за белым кроликом




Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 25 июня 2012 22:20 · Поправил: Promix_17
· Личное сообщение · #11

VodoleY пишет:
Promix_17 ты 4дня думал чтоб процитировать сообщение?
- я только зашёл

ARCHANGEL пишет:
8-байтовый double должен вмещать бОльшие целые значения, нежели 4-байтовый DWORD


8-байт = 64 бита - как-то слабо...

Т.е. если это что-то для RSA или т.п., то надо будет самому работу с большими числами пилить.

| Сообщение посчитали полезным: DimitarSerg

Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 26 июня 2012 09:22
· Личное сообщение · #12

Promix_17 все реализации алгоритмов, работающих с большими числами, используют дополнительные библиотеки для работы с большими числами. Для делфи это FGInt(стабильная, но скудная) DFFLibV13 (малеха подглючивает, отписал афтору обещал исправить) для си это BigDigits-2.3.0(сам юзать не пробывал). Есть еще реализованные базовые функи на асме (сложение умножение деление и т.д)

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: ARCHANGEL

Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 26 июня 2012 10:21 · Поправил: F_a_u_s_t
· Личное сообщение · #13

VodoleY
Для С/С++ реализаций чуть меньше чем докуя, длинка даже в boost входит.

Add:
Может пригодится GMP.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 26 июня 2012 11:16
· Личное сообщение · #14

F_a_u_s_t я не утверждал, что на си их мало. я делфист, BigDigits попался постоку поскольку... но чЁто мы флудить начали... (boost интересная штука, почитал спс, чет раньше не встречалось)

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....



 eXeL@B —› Программирование —› Задачка о простоте чисел
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати