Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2009, 16:12   #1
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию Программа тестирования произвольных чисел Мерсенна (2^p-1) метода Люка-Лемера

Я разработал на delphi программу тестирования простоты произвольных чисел Мерсенна (2^p-1) с использованием метода Люка-лемера. Числа представлены в виде массивов 32-х разрядных элементов типа cardinal, основные процедуры реализованы на ассемблере, реализация в windows xp. Не могу найти аналоги для оценки быстроты программы. Мой интерес
был в том,чтобы научиться работать со сверхбольшими числами (в частности возводить в квадрат или делить по модулю 2^p-1). К примеру число 2^216091-1 состоит из 6753-х 32-х разрядных элементов.
Временные характеристики для степеней p(CPU 2,6 Ггерц, ОЗУ 1 Гбайт):
1. 2^2-1 <1 сек
2. 2^3-1 <1 сек
3. 2^5-1 <1 сек
4. 2^7-1 <1 сек
5. 2^13-1 <1 сек
6. 2^17-1 <1 сек
7. 2^19-1 <1 сек
8. 2^31-1 <1 сек
9. 2^61-1 <1 сек
10. 2^89-1 <1 сек
11. 2^107-1 <1 сек
12. 2^127-1 <1 сек
13. 2^521-1 <1 сек
14. 2^607-1 <1 сек
15. 2^1279-1 <1 сек
16. 2^2203-1 <1 сек
17. 2^2281-1 <1 сек
18. 2^3217-1 <1 сек
19. 2^4253-1 <1 сек
20. 2^4423-1 <1 сек
21. 2^9689-1 5 сек
22. 2^9941-1 5 сек
23. 2^11213-1 8 сек
24. 2^19937-1 46 сек
25. 2^21701-1 59 сек
26. 2^23209-1 1 мин 12 сек
27. 2^44497-1 8 мин 28 сек
28. 2^86243-1 1 час 1 мин 6 сек
29. 2^110503-1 2 час 8 мин 51 сек
30. 2^132049-1 3 час 32 мин 26 сек
31. 2^216091-1 15 час 58 мин 0 сек
Виктор Смирнов вне форума Ответить с цитированием
Старый 29.04.2009, 20:29   #2
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию Программа тестирования чисел Мерсенна

Выставляю рабочую версию программы тестирования
чисел Мерсенна (для желающих проверить на своем ПК).
Чтобы не считать сутками, p (в этом варианте программы)
ограничено значением 132049, хотя проверялись начальные
вычеты для p=43112609 (по предварительным прикидкам
полный просчет для 46-го числа на моем ПК около 15000 лет).
Программа имеет 3 режима задания p:
- выбор из списка (простых чисел) пользователем вручную одного числа ;
- выбор из списка программой автоматически подряд диапазона чисел
с сохранением результата тестирования;
- ввод пользователем вручную прозвольного числа.
Флаг "Контрольная точка" служит при тестировании чисел
(p>132049) с сохранением в контрольной точке промежуточных вычетов
(сверхбольших чисел) в файле на диске с возможностью
возбновления тестирования данного числа с этой точки.
О себе. Я в прошлом системный программист на мейнфремах,
рабочий язык Ассемблер. Delphi использовал достаточно примивно
для интерфейса и сервиса, рабочие процедуры на ассемблере
с учетом специфики команд Intel для 32-х разрядных регистров
целочисленной арифметики. Жду ваших данных по прогонам на ваших ПК.
Программа с файлом простых чисел во вложении svv7744510.rar
Вложения
Тип файла: rar svv7744510.rar (185.7 Кб, 208 просмотров)
Виктор Смирнов вне форума Ответить с цитированием
Старый 29.04.2009, 20:36   #3
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию Числа Мерсенна

По результатам прогона формируются краткие отчеты
Виктор Смирнов вне форума Ответить с цитированием
Старый 15.01.2011, 18:45   #4
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Уважаемые коллеги!
Мною разработана программа на Ассемблере в Дельфи проверки делимости первых 105 000 000 чисел Мерсенна вида 2^p-1, где p - простое (Prime) ,
на простые делители d в интервале d= 2^1 ... 2^32-1. При этом делитель соответствует условию d=2*p*r+1, где r=1,2,3,...
Опытным путем было установлено, что отсутствуют делители для r=2*k , где k==1,3,5,7,...
На настоящий момент времени протестироано первые 4 000 000 чисел Мерсенна, из них делимых - 780435.
Скорость проверки - 50 000 чисел за 75 минут, Файл inform с результатами тестирования может быть выслан по e_Mail.
n-порядковый номер числа, p- степень, d- наименьший делитель числа.
Для примера начало файла inform
n p d
5. 11 23
9. 23 47
10. 29 233
12. 37 223
13. 41 13367
14. 43 431
15. 47 2351
16. 53 6361
17. 59 179951
19. 67 193707721
20. 71 228479
21. 73 439
22. 79 2687
23. 83 167
25. 97 11447
27. 103 2550183799
29. 109 745988807
30. 113 3391
32. 131 263
36. 151 18121
37. 157 852133201
38. 163 150287
39. 167 2349023
40. 173 730753
41. 179 359
42. 181 43441
43. 191 383
44. 193 13821503
45. 197 7487
47. 211 15193
48. 223 18287
50. 229 1504073


ВИКТОР СМИРНОВ, ТВЕРЬ
Вложения
Тип файла: rar inform.rar (8.05 Мб, 58 просмотров)

Последний раз редактировалось Виктор Смирнов; 15.01.2011 в 20:01. Причина: дополнить
Виктор Смирнов вне форума Ответить с цитированием
Старый 20.02.2011, 19:13   #5
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Уважаемые коллеги!
Предлагаю исходный текст рабочей программы (встраиваемой процедуры Дельфи) на Ассемблере,
реализующей алгоритм теста Люка-Лемера для определения простоты произвольных чисел Мерсенна.
Напомню суть теста: число Мерсенна M=2^p-1, где р-простое, будет простым, если построив последовательность
вычетов Vn (n=1...p-1) следущего вида: V1=4; Vn = (Vn-1*Vn-1 mod 2^p-1) -2 (n=2...p-1) получим Vp-1=0.
Для p<32 данный алгоритм реализуется тривиально, для p>32 есть определенные трудности.
В моей программе числа представлены в виде массивов 32-х разрядных элементов типа cardinal.
В приложении представлен текст рабочей версии функции test_lucas_lemer, результат работы которой булевское
значение. True - тестируемое число простое, false - составное. Маскимальное значение степени p (в программе
sp) определяется размерами массивов V (вычет) и W (квадрат вычета). Размер массива n расчитывается по
формуле n=p/32+1. Следующий этап написания более производительного варианта программы - программа
для многопроцессорной модели для паралльного вычисления разрядов массива W (в т.ч. для 64 - разр. процессоров).
Но не имею самого железа, а также ассемблер для него. Что мы хуже GIMS?
Извиняюсь за скудное комментирование в исходнике.
p.s. Пробовал вариант программы на чистом ассемблере. К удивлению работает на 20% медленнее, чем ассемблер в Дельфи.
Вложения
Тип файла: txt test_lucas_lemer.txt (11.9 Кб, 197 просмотров)

Последний раз редактировалось Виктор Смирнов; 20.02.2011 в 19:16. Причина: не прицепился файл
Виктор Смирнов вне форума Ответить с цитированием
Старый 29.03.2011, 19:39   #6
Demon_12
 
Регистрация: 29.03.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Виктор Смирнов Посмотреть сообщение
Чтобы не считать сутками, p (в этом варианте программы)
ограничено значением 132049, хотя проверялись начальные
вычеты для p=43112609 (по предварительным прикидкам
полный просчет для 46-го числа на моем ПК около 15000 лет).
Все дело в умножении (возведении в квадрат, в данном случае). Классическое умножение растет пропорционально квадрату размера множителей. Если реализовать умножение при помощи Быстрого Преобразования Фурье, то там рост будет иметь линейную зависимость.
В моей реализации на Delphi, Фурье начинает обгон при размере в 512-1024 32битных слов, а при размере массива 1048576 двойных слов классика выполняется 18514 с (5 ч 8 м 34с), БФП 23,77 с!!! (P4 E5300 при загрузке 1 ядра) Как вам разница? Так что для 46-го понадобится пару месяцев.
Demon_12 вне форума Ответить с цитированием
Старый 10.05.2011, 08:37   #7
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Demon_12 Посмотреть сообщение
В моей реализации на Delphi, Фурье начинает обгон при размере в 512-1024 32битных слов, а при размере массива 1048576 двойных слов классика выполняется 18514 с (5 ч 8 м 34с), БФП 23,77 с!!! (P4 E5300 при загрузке 1 ядра) Как вам разница? Так что для 46-го понадобится пару месяцев.
Уважаемый коллега. Вы могли бы поделиться исходным текстом вашей программы на Delphi? Заранее признателен Виктор Смирнов
Виктор Смирнов вне форума Ответить с цитированием
Старый 09.08.2011, 19:48   #8
Rasheet
Новичок
Джуниор
 
Регистрация: 06.08.2011
Сообщений: 1
Подмигивание Программа тестирования чисел Мерсенна

>На настоящий момент времени протестироано первые 4 000 000 чисел >Мерсенна, из них делимых - 780435.
>Скорость проверки - 50 000 чисел за 75 минут, Файл inform с >результатами тестирования может быть выслан по e_Mail.
>n-порядковый номер числа, p- степень, d- наименьший делитель числа.
>Для примера начало файла inform

. . . .
>20. 71 228479
>21. 73 439
>22. 79 2687
>23. 83 167
>25. 97 11447

- А где делитель на №26 не простое число 101?

>27. 103 2550183799
>29. 109 745988807
>30. 113 3391
>32. 131 263
. . . .
>ВИКТОР СМИРНОВ, ТВЕРЬ[/QUOTE]

- А где делители на №№33-35 не простые числа Мерсенна
137, 139, 149?... Также нет делителей на другие непростые числа...

. . .
>Скорость проверки - 50 000 чисел за 75 минут, Файл inform
. . .

....)))) Хотя я понимаю, что инф. указанна не верно, например, чтобы найти делитель только лишь для №26 числа М101 для этой "быстрой 32 разрядной" ассемблерной программы может потребоваться всего то ничего 2-3 года. А на самом деле это всеголишь первое такое (немножко сложное) не простое число. А таких чисел (не простых чуть ли не каждое ~5....). Просто их делитель большеват.. А сколько времени может уйти например на поиск делителя числа М137, 139, 149 - у каждого такого числа время (на подсчеты) увеличивается в разы по мере размера числа Мерсенна...

Почему, бы, не попробовать оптимизировать (ускорить) погу вычисления с помощью новых технологий таких как использование параллельных регистров MMX, SSE? Кстати, можно использовать технологии CUDA.. Хотя все это уже используется и считается... - В интернете такие страсти по этому поводу описывают... (Используют большие ЭВМ)...

Рашит.
Rasheet вне форума Ответить с цитированием
Старый 19.08.2011, 10:25   #9
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Уважаемый коллега! В программе проверяется делимость на числа d в интервале d= 2^1,...,2^32-1 (т.е. размер делителя не более одного 32 разр. слова). Цель программы - первичный отсев составных чисел Мерсеенна, а это примерно 20%.
Виктор Смирнов вне форума Ответить с цитированием
Старый 05.04.2012, 17:09   #10
Виктор Смирнов
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Уважаемые коллеги!
На просьбу дать исходный текст теста Люка-Лемера, привязанный к Делфи,
я сформировал проект с простейшим варантом программы без всякого сервиса (в частности,
убрал работу с базой данных простых чисел, отсутствует возможность прерывания
вычислений и формирования файла "контрольной точки", и другое).
Исходные данные задаются в тексте программы.
Это - порядковый номер тестируемого числа Мерсенна (nPrime),
согласно нумерации их в базе простых чисел, и значение степени (sp).
Я меня база данных на 105 млн. первых простых чисел.
Эта программа может быть использована в учебных целях.
Виктор Смирнов.
Вложения
Тип файла: rar var1.rar (171.2 Кб, 44 просмотров)
Виктор Смирнов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите. Программа для тестирования. SergeyVS Помощь студентам 3 20.05.2010 17:50
Пусть вводится 10 произвольных имен... Mr_Frost Помощь студентам 1 10.03.2009 15:18
Программа Тестирования. Spiker01 Паскаль, Turbo Pascal, PascalABC.NET 3 06.01.2009 13:14
программа перестановки чисел натурального ряда от 1 до 10 Ольга 01 Общие вопросы C/C++ 1 28.07.2008 20:09
Отображение ряда рисунков в произвольных областях экрана tonight Общие вопросы Delphi 3 27.08.2007 10:11