2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Вопрос по тесту Миллера Рабина
Сообщение08.06.2013, 20:52 


02/03/10
73
Здравствуйте уважаемые участники форума
Недавно написал программу , основанную на псевдокоде в википедии
http://ru.wikipedia.org/wiki/Тест_Миллера_—_Рабина
Столкнулся с некоторыми сложностями. После 45000 программа начинает многие Простые числа считать составными.
Сначала я думал, что не правильно написал код программы, но потом решил взять в руки ручку выполнить все операции вручную на бумаге, для одного из простых чисел , которые программа считает составным. Самая большая странность заключается в том, что исходя из псевдокода, написанного в википедии , это простое число должно быть составным.
Вот что у меня получилось .
Число 47057 m-1 равно 47056 s равно 4 t равно 2941
Так если взять случайное число А равное 3 то программа завалит тест на простоту
3 в степени 2941 мод 47057 равно 46552
Возводя последнее число в квадрат и взяв остаток от деления даже НАМНОГО больше чем 3 раза(s-1) , я никак не получал число 47056.
Либо я неправильно понял псевдокод, либо он неправильно написан. Может кто-то сталкивался с подобной проблемой. Дело в том, что если взять число больше 100000 то очень большое колличество простых у меня отсеивается.
Заранее благодарен за ответ.

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение08.06.2013, 21:00 
Заслуженный участник
Аватара пользователя


06/10/08
6422
wcl.AleX в сообщении #734465 писал(а):
Возводя последнее число в квадрат и взяв остаток от деления даже НАМНОГО больше чем 3 раза(s-1) , я никак не получал число 47056.
У меня получилось как раз на третий раз.
Код:
Prelude> 3^2941 `mod` 47057
46552
Prelude> it^2 `mod` 47057
19740
Prelude> it^2 `mod` 47057
35640
Prelude> it^2 `mod` 47057
47056

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение09.06.2013, 01:17 
Заслуженный участник


04/05/09
4582
У вас переполнение int. Максимальное возможное значение - $2^{31}-1$, корень из него - $46340$. Большие числа надо считать в 64 битах или больше.

 Профиль  
                  
 
 Posted automatically
Сообщение09.06.2013, 07:48 
Супермодератор
Аватара пользователя


20/11/12
5728
 i  Тема перемещена из форума «Дискуссионные темы (М)» в форум «Программирование»
Перенёс в более соответствующий раздел

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение10.06.2013, 22:44 


02/03/10
73
У меня есть программа, нужно улучшить, можете помочь?
http://rghost.ru/46663071

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение11.06.2013, 23:06 
Заслуженный участник


27/04/09
28128
Главное же вот в чём:
venco в сообщении #734529 писал(а):
Большие числа надо считать в 64 битах или больше.

Используйте long, или как там 64-разрядный тип называется в C++. Для чисел больше и больше вам нужна будет арифметика многократной точности. Впрочем, о ней вам, кажется, уже писали.

Небольшое ускорение может дать замена x % 2 на x & 1.

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение11.06.2013, 23:44 


02/03/10
73
Используйте long, или как там 64-разрядный тип называется в C++. Для чисел больше и больше вам нужна будет арифметика многократной точности. Впрочем, о ней вам, кажется, уже писали.
можно об этом поподробнее, хоть небольшой примерчик
Небольшое ускорение может дать замена x % 2 на x & 1.
это только на %2 или можно как-то на другие числа тоже? Например, как будет выглядеть x%y?

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение11.06.2013, 23:58 
Заслуженный участник


27/04/09
28128
wcl.AleX в сообщении #735603 писал(а):
это только на %2 или можно как-то на другие числа тоже? Например, как будет выглядеть x%y?
Посмотрите на двоичные записи чисел, дающих одинаковые остатки по конкретному модулю и решите сами, как изменится производительность.

wcl.AleX в сообщении #735603 писал(а):
можно об этом поподробнее, хоть небольшой примерчик
О чём конкретно подробнее?

Вообще, есть много прекрасных книг. Правда, я не специалист по библиографии.

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение12.06.2013, 08:11 


26/01/10
959
arseniiv в сообщении #735585 писал(а):
Небольшое ускорение может дать замена x % 2 на x & 1.

Мне кажется, что современные компиляторы уже стали чуть-чуть умнее тех, что были 15 лет назад. Не должно это ничего ускорить.

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение12.06.2013, 14:49 
Заслуженный участник


27/04/09
28128
Так потому я и написал «может дать», а не «даст».

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение12.06.2013, 21:10 


26/01/10
959
Так в том-то и дело, что скорее всего не может. Вы только дали человеку надежду, что можно любой остаток заменить таким универсальным хитрым трюком. Так рождаются мифы : )

Разговаривать про оптимизацию нужно с тем человеком, который хоть примерно представляет себе работу компьютера. В противном случае ваши советы для него будут как библейская догма. Единственный совет, который тут уместно дать wcl.AleX - пойти учиться программировать, решить пару сотен классических упражнений и только после этого начинать разговоры про сложные вещи. Всё остальное я считаю, будет во вред его целям.

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение12.06.2013, 21:27 
Заслуженный участник


27/04/09
28128
Zealint в сообщении #736048 писал(а):
Вы только дали человеку надежду, что можно любой остаток заменить таким универсальным хитрым трюком.
Нет, надежду он дал себе сам. :-) Никто ж не мешает захотеть разобраться (в том, что можно сделать с остатками) и разобраться.

Zealint в сообщении #736048 писал(а):
В противном случае ваши советы для него будут как библейская догма.
Если бы я собирался советовать что-то посерьёзнее насчёт программы в архиве с названием «Лучший алгоритм миллера рабина»! :lol: Можете не опасаться за wcl.AleX.

 Профиль  
                  
 
 Re: Вопрос по тесту Миллера Рабина
Сообщение14.06.2013, 06:51 


26/01/10
959

(Я понял, что происходит.)

arseniiv в сообщении #736055 писал(а):
Если бы я собирался советовать что-то посерьёзнее насчёт программы в архиве с названием «Лучший алгоритм миллера рабина»! :lol: Можете не опасаться за wcl.AleX.

Я долго пытался вспомнить, что же мне напоминает наше общение с автором темы. И ваш ответ наконец помог это сделать. Вот что (первый пост). Нашёл через Лурк, когда пытался разобраться с тем, кто такие программисты, но попал немного не на ту страничку.
По ссылке писал(а):
привет я чайник. я на бейсике програмировать начал давайте зделаем игру все вместе
чтоб она была онлайн наподобе варкрафта. Только круче. Я такие игру програмировать не умею поэтому прошу вашей помощи мы обеденим усилия и сделаем игру под моим руководством.Это круто будет. когда игра будет распространена по свету там будут ваши имена и мое имя руководителя. а еще можно зделать крутую гонку но это уже потом или типа контер страйка вобще можно тысячу игр вместе зделать

Теперь я понял, что меня смущало все эти три года... По ссылке, конечно, не он, но просит нас очень похожим образом.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Geen


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group