3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
||||||
1 | ||||||
Тест Миллера-Рабина18.02.2014, 18:31. Показов 17061. Ответов 16
Метки нет (Все метки)
Добрый день всем. Алгоритм для теста взял с википедии. Вот он:
Кликните здесь для просмотра всего текста
Ввод: m > 2, нечётное натуральное число, которое необходимо проверить на простоту; r — количество раундов. Вывод: составное, означает, что m является составным числом; вероятно простое, означает, что m с высокой вероятностью является простым числом. Представить m − 1 в виде 2s·t, где t нечётно, можно сделать последовательным делением m - 1 на 2. цикл А: повторить r раз: Выбрать случайное целое число a в отрезке [2, m − 2] x ← at mod m, вычисляется с помощью алгоритма возведения в степень по модулю (англ.) если x = 1 или x = m − 1, то перейти на следующую итерацию цикла А цикл B: повторить s − 1 раз x ← x2 mod m если x = 1, то вернуть составное если x = m − 1, то перейти на следующую итерацию цикла A вернуть составное вернуть вероятно простое Набросал простенькую программку, но она возвращает неправильные ответы! Если есть идеи - подскажите, пожалуйста в чем ошибка. З.Ы. За код сильно не ругайте, я учусь)
0
|
18.02.2014, 18:31 | |
Ответы с готовыми решениями:
16
тест миллера-рабина, pascal -> c++ Тест Миллера-Рабина. Как получить число t из формулы алгоритм Миллера-Рабина проверки простоты многоразрядных чисел. Реализация теста Рабина-Миллера для чисел порядка 2^512 |
3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
|||||||||||
19.02.2014, 12:26 [ТС] | 3 | ||||||||||
Это примитивный метод проверки чисел на простоту
0
|
Master of Orion
|
||||||
19.02.2014, 12:54 | 4 | |||||
OdessaTV, а смысл тогда в этом методе, если он использует примитивный перебор?
Добавлено через 53 секунды Тогда уж сразу:
0
|
3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
|
19.02.2014, 12:59 [ТС] | 5 |
Мне нужно разложить число m -1 в виде 2^s*t (это написано в алгоритме на Вики) я не придумал лучшего способа. А проверку на простоту мне нужно сделать именно рандомизированным тестом Миллера-Рабина. Такие вот дела..
0
|
Master of Orion
|
||||||
19.02.2014, 14:13 | 6 | |||||
OdessaTV, я пытаюсь вам объяснить, что вы написали неправильно. В википедии не написано "делить, пока число не станет простым", иначе я уже говорил, смысл писать такой большой алгоритм когда можно обойтись одной строчкой...
Добавлено через 21 минуту OdessaTV, вот, набросал примерный правильный вариант, брал с английской вики, т.к. в русской некоторые важные детали опущены почему-то (например, что алгоритм работает только для нечетных чисел, поэтому нужно дописать третье условие в 7 строчке). Так что держите описание на английском и практически дословную реализацию на шарпе: http://en.wikipedia.org/wiki/M... nning_time
Добавлено через 1 минуту OdessaTV, BigInteger живет в нейспейсе System.Numerics, так что добавьте ссылочку. Ну или напишите свой алгоритм факторизации.
2
|
3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
|
19.02.2014, 14:47 [ТС] | 7 |
Psilon, спасибо Вам огромное, с алгоритмом разобрался, все понятно как день, попытаюсь найти в чем же была у меня ошибка, в нескольких случаях просто изобретал велосипед... Спасибо большое еще раз.
Проверял для чисел 767761, 1650353, 1173521 - говорит, что составные... Наверное изъян самого алгоритма, а не реализации...
0
|
3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
|
20.02.2014, 13:38 [ТС] | 9 |
0
|
3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
|
20.02.2014, 18:44 [ТС] | 11 |
turbanoff, именно этот алгоритм написан на википедии, Psilon, написал все буквально слово в слово по алгоритму, выходит, что вики врет? К тому же это рандомизированный тест на простоту, по идее, на большом количестве раундов оно таки должно дать правильный ответ. Поправьте, если не прав.
0
|
20.02.2014, 20:10 | 12 |
Вики не врёт. Врёт конкретная реализация. В коде Psilon есть баг с переполнением переменой x(при возведении в квадрат). Если объявить её как long - то всё будет работать, по крайней мере на приведённых вами числах.
Вы не правы. Тест Рабина-Миллера НЕ может сказать что число составное, если оно таковым не является.
2
|
3 / 3 / 0
Регистрация: 11.10.2012
Сообщений: 88
|
|
21.02.2014, 14:56 [ТС] | 13 |
Спасибо огромное за разъяснения. Мне это очень помогло.
0
|
28.12.2015, 05:09 | 14 |
Хоть уже больше года прошло, но всё же..
На простые числа тест Миллера-Рабина реагирует исправно. Но попробуйте разобрать числа 561, 1105. Сам по себе алгоритм М.-Р. скажет, что они простые,хотя на самом деле это не так (см. числа Кармайкла).
0
|
Master of Orion
|
||||||
03.01.2016, 20:17 | 15 | |||||
Matan!, ну не знаю, возвращает Composite как и должен:
0
|
nedel
|
03.01.2016, 20:43
#16
|
0
|
Storm23
|
03.01.2016, 22:59
Тест Миллера-Рабина
#17
|
0
|
03.01.2016, 22:59 | |
Индексы Миллера Кристаллография Генератор псевдослучайных чисел Парка-Миллера Алгоритм Миллера и Мюллера (Mueller-Muller) методы борьбы с эффектом Миллера на mosfet Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |