powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Генератор простых чисел (до 10^9 за 5 сек)
25 сообщений из 402, страница 11 из 17
Генератор простых чисел (до 10^9 за 5 сек)
    #38927548
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нарисовал картинку. Слева направо сверху вниз - простые числа обозначенные черными точками.

Интервалы в 60 по оси Х обозначены чередующимися бело-жёлтыми полосами.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927573
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
База данных простых чисел http://habrahabr.ru/post/246789/
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927587
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не первая статья на Хабре про prime generation. К сожалению авторы не продвинулись
дальше генерации решета в оперативке.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927590
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonК сожалению авторы не продвинулись
дальше генерации решета в оперативке.На Хабре зачастую комменты бывают очень интересными.

... Я бы порекомендовал автору всесторонне изучить сайт Kim Walisch — http://primesieve.org/
Fast C/C++ prime number generator — и код самой primesieve; реализация шикарная, полированная, ибо человек лет 15 серьезно этим вопросом занимается. Работает primesieve с сумасшедшей производительностью даже на настольном скромном тазике, а подробности реализации сегментированного решета и wheel факторизации полностью документированы. Однако, он явным образом пишет, что «primesieve can generate primes and prime k-tuplets up to 2^64» и всё, край географии. Интересно, почему. Наверное он просто такой задачи себе не ставил, сделать больше.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927595
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012, ОК. Спасибо за ссылку. Топик и так даёт пищу для размышлений на несколько лет вперёд.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927624
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Однако, он явным образом пишет, что «primesieve can generate primes and prime k-tuplets up to 2^64» и всё, край географии. Интересно, почему. Наверное он просто такой задачи себе не ставил, сделать больше.
Надо просто категоризировать задачи которые ставят перед собой энтузиасты и исследователи
и прочие фрики.

Думаю что задачи такие:

1) Собственно решето . Добавить нечего. Перформанс и скорость. Но на выходе - неизвестно что.
Просто отрезок простых чисел. И притом весьма ограниченный.

2) Поиск максимально большого простого. Обычно из подмножества чисел Мерсена. Тема достаточно
узкая и кроме того кластерные вычисления уже достаточно далеко зашли. Вики пишет о рекордах
отдельно.

3) Доказательство гипотез. (Одна из 23х проблем Гильберта). Тут мне добавить нечего. Я не силён в
математике и мне кажется этот вопрос явно не в форум С++.

4) Собственно факторизация. Это то что мне интересно. Особенно для чисел разрядности во много
раз превышающей QWORD (64bit).

5) Проверка простоты. Как частный случай варианта 4. Мне также интересна. Но интересно разобрать
варианты ложных срабатываний Рабина-Миллера и проанализировать что можно улучшить. Интересно также
разобрать AKS.

6) Задачи криптографии. Тут добавить пока нечего. Мало информации. И мало специалистов
которые могут внятно дать постановку хотя-бы чего-то полезного.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927631
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012... Я бы порекомендовал автору всесторонне изучить сайт Kim Walisch ... и дальше по тексту это все не мое, а выдержка из комментов к статье.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927633
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного цифр.

По поводу хранения результатов расчёта 64-х битного решета.

2^64 bit = 2^64 / 8 байт = 2^64 / 2 ^ 3 = 2^61 байт = 2^21 Тбайт.

В сыром виде эта матрица должна храниться на более чем 2 млн
дисковых устройствах типа (HDD 2Тб).

При массе 1 устройства 600 г. Весь сторедж будет весить примерно
1 мега-тонну без учота всего остального веса датацентра.

Энерго-потребление будет порядка 20 мегаватт при среднем
потреблении 1 устройства в 10 ватт. (здесь учтена стационарная
работа без процедуры пуска в момент которой ХДД потребляет
1 до ампера) и без обвязки корзинок и RAID агрегаторов и сетевого
оборудования.

Для питания этого стореджа нехило подошла-бы российская АЭС
"Ломоносов" которую производит Росатом и которая даёт с запасиком
35 мегаватт.

Надеюсь я если и ошибся то несильно.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927656
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, ну надо уже к факторизации переходить. Вот только метод решета числового поля я никак понять не могу. Читал не только на википедии, все равно нифига не понимаю. Про квадратичное решето понятно, про эллиптические кривые понятно, а с этим затык. Может, тут есть математики, которые понимают?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927667
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_an_ruСравните контрольные суммы, а не сами результаты.
Хорошая идея. Думаю достаточно просто XOR всей последовательности и сравнивать количество чисел и XOR.
Расчет доКол-воXOR1000012290x25A010000095920xD14B1000000784980x27893100000006645790x274A2610000000057614550x109D7521000000000508475340x5ECF97
сделал микро API для отладки https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/header.h
Использовать так:
Код: plaintext
1.
2.
3.
4.
5.
#include "header.h"

test_start("my test", from, to); // from, to - обсчитываемый диапазон
... считаем, вызываем store_count(X) для каждого найденного
test_end(); // вывод результатов в консоль



Можно просто скопировать функцию test_check(), забил туда эту табличку. Буду дополнять по мере появления результатов.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927675
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНадо просто категоризировать задачи которые ставят перед собой энтузиасты и исследователи
и прочие фрики.
...
Интереснее просто конкретное применение результатов этого творчества. Из широкоизвестного - криптография, но как понимаю, вся криптография строится на том что задача перебора больших простых нерешаема нынешними тех.средствами. Пример попыток порешать - расчеты биткоинов, по сути тоже криптография и переборы, просто людям дали реальный стимул в это вкладываться в надежде на легкие деньги.

Лично мне последний раз понадобился x32 аналог GUID для генерации ID сообщения. Чтобы он был уникален в короткий промежуток времени (пока сообщение в процессе доставки). Сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// инициализация
counter = rand();
counter_step = rand() % 9000 + 1000;

// Получение следующего значения
msg_id = counter;
counter += counter_step;


Т.к. не идеально - просто предусмотрел контроль и ошибку на случай если у получателя приходит второе сообщение с уже имеющимся ID. По ошибке отправитель переинициализирует свой счетчик.
По хорошему надо простые числа использовать для максимального уменьшения вероятности повтора. Но было лень качать таблицы и превращать их в массив до 10000. По хорошему так надо инициализировать:
Код: plaintext
1.
2.
counter_step = next_prime(rand() % 9000 + 1000);
counter = counter_step * next_prime(rand() % 9000 + 1000);



Больше и придумать нечего. Получается что для общего развития и развлечения. Лично мне охота Аткина обогнать, посчитать за <0,5 сек диапазон до 10^9.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927692
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TБольше и придумать нечего. Получается что для общего развития и развлечения. Ну как сказать, для продвинутых методов факторизации, факторные базы нужны для поиска гладких чисел. Так что там таблица простых пригодится.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928006
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал генератор таблиц шага, затестил на Эратосфене.
РезультатыTest(0M...1000M): eratosfen3_1() skip 2,3
eratosfen3_1() 905M(333M) steps
count 50847534 primes. time 4186 msec speed 12147K/sec OK

Test(0M...1000M): eratosfen5_1() skip 2,3,5
eratosfen5_1() 772M(266M) steps
count 50847534 primes. time 3875 msec speed 13121K/sec OK

Test(0M...1000M): eratosfen7() skip 2,3,5,7
eratosfen7() 686M(228M) steps
count 50847534 primes. time 3866 msec speed 13152K/sec OK

Test(0M...1000M): eratosfen11() skip 2,3,5,7,11
eratosfen11() 635M(207M) steps
count 50847534 primes. time 3665 msec speed 13873K/sec OK

Test(0M...1000M): eratosfen13() skip 2,3,5,7,11,13
eratosfen13() 593M(191M) steps
count 50847534 primes. time 3555 msec speed 14303K/sec OK
Лишние итерации уменьшаются, скорость растет, но и вспомогательные таблицы тоже. Для последней надо уже ~140 Кб. Для 17-ти потребуется ~2 Мб. Решил на 13 остановиться.

Генератор не буду выкладывать, немного корявый получился, руками надо подправлять таблицу под некоторые случаи (из конца в начало переносить, смещение не точно получилось). Кому готовые таблицы надо - они тут

Затестил на mayton\pbfa64.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	primesCache.push_back(5);
	primesCache.push_back(7);
	primesCache.push_back(13);
	uint64_t min_prime = 17;
	uint64_t primes = 5;
...
	static uint32_t step13[] = {16,2,4,6,2,6,4, ...
	uint32_t step_id = 0;
	for (uint64_t c1 = min_prime; c1 < max_prime; c1 += step13[step_id]) {
		step_id++;
		if(step_id == sizeof(step13)/sizeof(uint32_t)) step_id = 0;
	...
	}



Стало быстрее на 15-20%
mayton, можешь потестить с таблицей на 13.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928226
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого. Ну ладно сегодня вечером затестю.

P.S. Понедельник - день тяжкий. Навалилось на меня всё...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928232
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TГенератор не буду выкладывать, немного корявый получился, руками надо подправлять таблицу под некоторые случаи (из конца в начало переносить, смещение не точно получилось).Ну генератор же это элементарно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#include <stdio.h>
#include <stdlib.h>

unsigned prim[] = {2,3,5,7,11,13};
#define CNT(n) (sizeof(n)/sizeof(*n))

main() {
 unsigned i,j;
 unsigned char *tbl;
 unsigned p = 1;

 for (i=0; i<CNT(prim); ++i) p*=prim[i];
 tbl = calloc(p,1); 
 for (i=0; i<CNT(prim); ++i) {
   for (j=0; j<p; ++j)
   {
     if (j % prim[i] == 0) tbl[j] = 1;
   }
 }
 j = 1;
 for (i=2; i<p; ++i) 
 {
   if (tbl[i] == 0) 
   {
      printf("%u ",i-j);
      j=i;
   }
 }
 printf("2\n");
}
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928296
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу генератор же это элементарно
Код: plaintext
1.
2.
3.
4.
...
 for (i=2; i<p; ++i) 
...
 printf("2\n");


Спасибо. На этом споткнулся, запутался как смещение правильно выставить. Эта двойка иногда на первое место вставала. Причешу, выложу. У меня готовый код цикла генерится. Может кому пригодится.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928300
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мета-программинг достиг своих высот.

Эратосфен внезапно(!) сгенерил эратосфена...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928359
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМета-программинг достиг своих высот.

Эратосфен внезапно(!) сгенерил эратосфена...Да, чтобы не вычеркивать повторно уже вычеркнутые числа, нужен просеиватель вычеркиваемого...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928408
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМета-программинг достиг своих высот.

Эратосфен внезапно(!) сгенерил эратосфена...
Не, это от лени, лень писать быстрый генератор чтобы просто вставить его в код :)
По хорошему надо впилить Эратосфена в инициализацию Эратосфена. Вот думаю может все-таки допилить пример Barlone, а не выкладывать мета-генераторы, тем более таблицы не маленькие получаются.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928474
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати слабо третью награду получить? :-)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38928583
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима sorry. Еще нечитал.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929555
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну когда уже факторизацией по серьезному займемся?
Есть такой P-1 метод Полларда . И есть Алгоритм Ленстры . У них похожая идея - если порядок некой группы (для P-1 метода - мультипликативная группа кольца вычетов, для алгоритма Ленстры - группа точек эллиптической кривой) по модулю одного из сомножителей - гладкое число, мы можем найти этот сомножитель.
Для мультипликативной группы по простому модулю P порядок всегда равен P-1. Для группы точек эллиптической кривой порядок может быть разным, но близким к P - Теорема Хассе .
А нельзя ли найти какую-нибудь другую группу, у которой порядок был бы много меньше P?

Вот например можно взять решения уравнения Пелля - они тоже образуют группу. Но вот если рассматривать решения по простому модулю P, то порядок группы будет P-1 или P+1. Так что практического интереса не представляет. Однако я некоторое время назад чисто для проверки концепции программку накидал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
#include <stdio.h>
#include <limits.h>

// http://mpir.org/ 

#include "mpirxx.h"


unsigned primes[] = { 
  3,5,7, // up to 2^32, skiped...
};

size_t primesSize = sizeof(primes)/sizeof(*primes);

struct pellSolution { int n, y, x; }; //solution of x^2-n*y^2=1
pellSolution pellSolutions[] = {
 {2,2,3},
 {3,1,2},
 {5,4,9},
 {6,2,5},
 {7,3,8},
 {8,1,3},
};

size_t pellSolutionsSize = sizeof(pellSolutions)/sizeof(pellSolution);

// вход - решение ax^2 - n * ay^2  == 1 по модулю mod, "возводится в степень" mul,
// выход - новое решение bx^2 - n * by == 1 по модулю mod.
void pair_mul(mpz_class &bx, mpz_class &by, mpz_class ax, mpz_class ay, 
   unsigned long long n, unsigned long long mul, const mpz_class & mod)
{
  mpz_class t;
  bx = 1;
  by = 0;

  for(;;) 
  {
    if (mul & 1)
    {
      t = (ax*bx + ay*by*n) % mod;
      by = (ax*by + ay*bx) % mod;
      bx = t;
    }
    if (0 == (mul >>= 1)) break;
    t = (ax*ax + ay*ay*n) % mod;
    ay = ax*ay*2 % mod;
    ax = t;
  }
}


int main(int argc, char* argv[])
{
 mpz_class p;
 mpz_class a, b, a1, b1, t;
 unsigned long long i, j, k, n;

 if (argc<3) 
 {
	 return 1;
	 //p = "59649589127497219";
	 //k = 3; //тест
 }
 else
 {
	 p = argv[1];
	 k = strtoul(argv[2],NULL,10);
 }

 for (j = 0; j < pellSolutionsSize; ++j)
 {
	if (pellSolutions[j].n == k)
	{
		a = pellSolutions[j].x;
		b = pellSolutions[j].y;
		break;
	}
 }
 if (j >= pellSolutionsSize) return 1;
 //first stage
 //2^64
 pair_mul(a1,b1,a,b,k,0x100000000ui64,p);
 pair_mul(a,b,a1,b1,k,0x100000000ui64,p);

 mpz_gcd(t.get_mpz_t(), b.get_mpz_t(), p.get_mpz_t());
 if (t != 1) {
	mpz_out_str (NULL, 10, t.get_mpz_t());
	getchar();
	return 0;
 }

 for (i=0; i<primesSize; ++i) {
	n = primes[i];
	j = ULLONG_MAX/primes[i];
	while (n < j) n *= primes[i];
	pair_mul(a1,b1,a,b,k,n,p);
	if (b1 == 0) { 
		for(;;)
		{
		   pair_mul(a1,b1,a,b,k,primes[i],p);
		   if (b1 == 0) { puts("Strange"); break; }
		   mpz_gcd(t.get_mpz_t(), b1.get_mpz_t(), p.get_mpz_t());
		   if (t != 1) {
			printf("On %u step\n", i);
			mpz_out_str (NULL, 10, t.get_mpz_t());
			getchar();
  			return 0;
		   }
		   a = a1;
		   b = b1;
		}
		break;
	}
	mpz_gcd(t.get_mpz_t(), b1.get_mpz_t(), p.get_mpz_t());
    if (t != 1) {
	  printf("On %u step\n", i);
	  mpz_out_str (NULL, 10, t.get_mpz_t());
      getchar();
  	  return 0;
    }
	a = a1;
	b = b1;
 }

   puts("Second stage...");
   b = b*b % p;
   n = 4*k;
   b1 = (n*b+4)*b%p;

   i = 0;
   j = 1;
   t = abs(b-b1);
   while (true)
   {
     if (i == j ){
       mpz_gcd(a.get_mpz_t(), t.get_mpz_t(), p.get_mpz_t());
       if (a != 1) {
         printf("On %u step\n",i);
         mpz_out_str (NULL, 10, a.get_mpz_t());
         break;
       }
       b = b1;
       j = j*2; 
     }
     b1 = (n*b1+4)*b1%p;
	 a = t*abs(b-b1)%p;
	 if (a==0) {
       mpz_gcd(a.get_mpz_t(), t.get_mpz_t(), p.get_mpz_t());
       if (a != 1) {
         printf("On %u step\n",i);
         mpz_out_str (NULL, 10, a.get_mpz_t());
         break;
       } else {
	     printf("Fail on %u step\n",i);
		 break;
	   }
	 }
	 t = a;
     i = i + 1;
   }
 
   getchar();
} 

...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929663
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Барлон. Я выпал в осадок. Ты мне сначала лекции прочитай по кольцам вычетов а потом
уж факторизация....
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929712
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И возможно у тебя есть желание присоединиться к нашей группе разработки? PrimeGen.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929769
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу когда уже факторизацией по серьезному займемся?
Есть такой P-1 метод Полларда ....
...
Реализация этого метода на C++
http://gforge.inria.fr/projects/ecm/
svn checkout svn://scm.gforge.inria.fr/svnroot/ecm/trunk

PS: То бишь в вашей группе скорее всего должна быть не "лебедь, рак и щука", а иметь
обоюдное согласие на апробирование тех или иных математических методов ...
Я рад за вас.
Если не секрет чего вы хотите достичь?
/вполне допускаю, что понимание этого придет во время работы/.
Однозначно вам нужен математик.
Как по мне, так то чем вы занялись из серии - "... а не замахнуться ли нам на Шекспира".
Dima T не обижайся.
То чего ты хочешь достичь - "Лично мне охота Аткина обогнать, посчитать за <0,5 сек диапазон до 10^9."
Как по мне, то лучше "ляг поспи и все пройдет" /хотя тебе виднее .../
...
Рейтинг: 0 / 0
25 сообщений из 402, страница 11 из 17
Форумы / C++ [игнор отключен] [закрыт для гостей] / Генератор простых чисел (до 10^9 за 5 сек)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]