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

Чего бы где не писали, но у меня получилось что Эратосфен быстрее Аткина в 3 раза на первых 800 млн. (дальше Аткин не может, похоже разрядности unsigned int не хватает).

Победитель, использует 62 Мб для рачета до 10^9 (запостите в википедию кто может, вектор prime выкинуть, printf() разремить):
Код: 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.
std::vector<unsigned int> prime;

void eratosfen(unsigned int limit)
{
	unsigned int* bitmap = (unsigned int*) calloc(limit / 64 + ((limit & 63) ? 1 : 0), sizeof(unsigned int));
	//printf("2 3 ");
	prime.push_back(2);
	prime.push_back(3);
	unsigned int max_prime = 3;
	bool need_fill = true;
	while(need_fill) {
		unsigned int step = max_prime << 1;
		for(unsigned int i = max_prime * max_prime; i < limit; i += step) { // Вычеркиваем кратные max_pr
			bitmap[i >> 6] |= (1 << ((i >> 1) & 31));
		}
		if(max_prime * max_prime >= limit) need_fill = false; // дальше заполнять не надо
		// вычитываем следущую порцию
		for(unsigned int i = max_prime + 2; i < limit; i += 2) {
			if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
				prime.push_back(i);
				//printf("%u ", i);
				if(need_fill) {
					max_prime = i;
					break;
				}
			}
		}
	}
	free(bitmap);
}



Решето Аткина
Код: 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.
std::vector<unsigned int> prime;

void atkin(unsigned int limit)
{
	unsigned int* bitmap = (unsigned int*) calloc(limit / 32 + 1 + ((limit & 31) ? 1 : 0), sizeof(unsigned int));
	bitmap[0] = 12;
	unsigned int sqr_lim = (unsigned int)sqrt((long double)limit);
 
	// Предположительно простые - это целые с нечетным числом
	// представлений в данных квадратных формах.
	// x2 и y2 - это квадраты i и j (оптимизация).
	unsigned int x2 = 0;
	for (unsigned int i = 1; i <= sqr_lim; i++) {
		x2 += 2 * i - 1;
		unsigned int y2 = 0;
		for (unsigned int j = 1; j <= sqr_lim; j++) {
			y2 += 2 * j - 1;
	 
			unsigned int n = 4 * x2 + y2;
			if ((n <= limit) && (n % 12 == 1 || n % 12 == 5))
				bitmap[n >> 5] ^= (1 << (n & 31));
	 
			n -= x2; // Оптимизация n = 3 * x2 + y2; 
			if ((n <= limit) && (n % 12 == 7)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
	 
			n -= 2 * y2; // Оптимизация n = 3 * x2 - y2;
			if ((i > j) && (n <= limit) && (n % 12 == 11)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
		}
	}
	 
	// Отсеиваем кратные квадратам простых чисел в интервале [5, sqrt(limit)].
	// (основной этап не может их отсеять)
	for (unsigned int i = 5; i <= sqr_lim; i++) {
		if (bitmap[i >> 5] & (1 << (i & 31))) {
			unsigned int n = i * i;
			for (unsigned int j = n; j <= limit; j += n) {
				bitmap[j >> 5] &= ~(1 << (j & 31));
			}
		}
	}
	 
	// Вывод списка простых чисел в консоль.
	//printf("2, 3, 5"); 
	prime.push_back(2);
	prime.push_back(3);
	prime.push_back(5);
	for(unsigned int i = 7; i <= limit; i += 2) {  
		if ((bitmap[i >> 5] & (1 << (i & 31)))){
		  // printf(", %d", i);
		   prime.push_back(i);
		}
	}
	free(bitmap);
}



Обоих с википедии взял. Допилил сколько смог. Добавил биткарту. Правда в Эратосфене она в два раза меньше, т.к. четные пропустил. В Аткине так не получилось, т.к. второй цикл (по 5-кам попадает на четные). Но и с биткартой без четных он все равно медленнее (в 2,5 раза), поэтому не стал дальше разбираться. Если кто будет ускорять Аткина - постите сюда что получилось. Мое ИМХУ в Аткине слишком много получения остатка от деления, а память нынче достаточно быстрая, поэтому Эратосфен быстрее, т.к. там только битовые операции.
И потом Эратосфена проше досчитывать.
Асинхронный Эратосфен. Получение следующего простого после X
Код: 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.
unsigned int next_prime(unsigned int x)
{
	static std::vector<unsigned int> cache;
	static unsigned int max_prime = 0;
	if(max_prime == 0) {
		cache.push_back(2);
		cache.push_back(3);
		max_prime = 3;
	}
	if(x >= max_prime) { // нет в кэше
		unsigned int limit = (x < 1000) ? 1024 : x /4 * 5; // x+20%

		unsigned int start = max_prime + 2; // должно быть четное
		unsigned int* bitmap = (unsigned int*) calloc((limit - start) / 64 + 1, sizeof(unsigned int));
		limit -= start;

		if(max_prime > 3) { // инициализация предыдущим расчетом
			unsigned int* end = &cache[cache.size() - 1];
			for(unsigned int* cur = &cache[1];cur <= end; cur++) {
				unsigned int i = *cur * *cur; 
				if(i > limit + start) break;
				unsigned int step = *cur << 1;
				if(i < start) { // выравнивание под cur*cur+2N*cur
					i = start - (start - i) % step;
					if(i < start) i += step;
				}
				i -= start;
				//printf("start=%d i=%d max=%d\n", start, i, max_prime);
				for(; i < limit; i += step) { // Вычеркиваем кратные max_prime
					bitmap[i >> 6] |= (1 << ((i >> 1) & 31));
				}
			}
		}

		bool need_fill = true;
		while(need_fill) {
			if(max_prime >= 65536 || max_prime * max_prime >= limit + start) {
				need_fill = false; // дальше заполнять не надо
			} else {
				unsigned int step = max_prime << 1;
				for(unsigned int i = max_prime * max_prime - start; i < limit; i += step) { // Вычеркиваем кратные max_prime
					bitmap[i >> 6] |= (1 << ((i >> 1) & 31));
				}
			}
			// вычитываем следущую порцию
			for(unsigned int i = max_prime + 2 - start; i < limit; i += 2) {
				if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
					cache.push_back(i + start);
					if(need_fill) {
						break;
					}
				}
			}
			max_prime = cache.back();
		}
		free(bitmap);
	}

	static unsigned int prev_id = 0;
	static unsigned int prev_prime = 0;
	if(x < 2) {
		if(x == 0) { // освобождение памяти
			max_prime = 0;
			cache.clear();
		}
		prev_id = 0;
		prev_prime = 2;
	} else if(x == prev_prime) {
		prev_id++;
		prev_prime = cache[prev_id];
	} else { // поиск в кэше
		unsigned int* min = &cache[0];
		unsigned int* max = &cache[cache.size() - 1];
		while(max - min > 1) {
			unsigned int* mid = min + (max - min) / 2;
			if (*mid > x) {
				max = mid;
			} else {
				min = mid;
			}
		}
		prev_id = max - &cache[0];
		prev_prime = *max;
	}
	return prev_prime;
}

// Пример использования
int k = 1;
while(k < 1000) {
   k = next_prime(k);
   printf("%d ", k);
}



Действительно ли числа простые : сравнивал результаты разных алгоритмов между собой, до 100 млн. с 17438916 , до 800 млн. с Аткиным, до 2 млрд. синхронного и асинхронного Эратосфенов, дальше они считают, но памяти в x32 не хватает чтобы результаты обоих хранить, а так асинхронный до 3 млрд. за 15 сек считает. ИМХУ можно под x64 переточить, но это уже лишнее, надо больше - есть мат.либы.
Модератор: По просьбе автора ссылки изменены
next_prime32.h
next_prime64.h
Тесты и примеры использования
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920536
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу скажу что я еще нечитал эти сорцы. Но поверхностно... не вижу в них новой идеи.

Поэтомо воспроизведу свои старые мысли по сабж.

Поиск и исследование простых чисел это увлекательнейшая часть математики. Если ее копнуть
глубоко то ты зацепишь краем практически ВСЕ разделы математических наук.

По поводу "решета". Я считаю его неэффективным на больших числах. Потому-что плотность простых
чисел падает от величины. Чем больше ваше искомое prime-число
тем больше "холостых вычёркиваний" в биткарте вам нужно сделать. В конце-концов поиск
упирается в эффективность использования памяти. Для современной рабочей станции
(адресующей 16Гб) можно адресовать примерно.

16Гб = 17,179,869,184 байт = 137,438,953,472 бит = bitcartCap

Тоесть 137 млрд

Количество простых чисел на этом интервале (ЕМНИП) равно n/ln(n). Посчитаем приблизительно.

137,438,953,472 / ln (137,438,953,472) ~ 5 358 986 394

Тоесть 5 млрд простых чисел в биткарте. А какова эффективность? Примерно на 26 бит приходится 1
простое число. И с ростом числа эта самая эффективность хранения будет падать.

Надеюсь я не ошибся. Если что - прошу поправить.

Как считать дальше? - Неизвестно. Возможно по биткарте можно построить итератор
и извлекать из него биты но эффективность этого метода у меня под вопросом.
Так что после генерации биткарту следовало-бы уничтожить и данные сохранить
в обычный вектор. И положить в текстовый файл.

Можно мечтать и расчитывать что старик Мур еще подкинет нам сюрпризы типа
удвоения объёма памяти за ту-же цену. Но.... я-бы не особо на это надеялся.
Primes - коварны. И как-только мы выйдем из одной трудности - тут-же вступим
в другую. Хотя-бы рассмотреть неэффективность "арифметического деления
по модулю" для целых чисел длинной 64, 128, 256 бит.

Интересно также рассмотреть различные варианты сжатия биткарт. Использования деревьев
для хранения таких "разрежённых" объемов. И прочих нестандартных структур.

P.S. Жаль Базист сбежал. Он вобщем-то был неплохой оппонент и собеседник по структурам данных.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920543
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonне вижу в них новой идеи.
Ее не было. Я же написал тестил старые. Все пишут что что Аткин быстрее Эратосфена. У меня обратное получилось.

maytonДля современной рабочей станции (адресующей 16Гб) можно адресовать примерно.

16Гб = 17,179,869,184 байт = 137,438,953,472 бит = bitcartCap

Тоесть 137 млрд

еще на 2 умножь, четные выкинул, 1 байт = 16 чисел.

maytonТак что после генерации биткарту следовало-бы уничтожить и данные сохранить
в обычный вектор. И положить в текстовый файл.
Мой асинхронный вариант так и делает. Кэширует результаты и досчитывает небольшой биткаротой сверх предыдущего расчета.

Цели считать далеко не ставил. Эратосфеном можно посчитать простое X зная все простые до sqrt(X), т.е. с 16 Гб памяти можно рассчитать простое порядка 5*10^22. В принципе алгоритм параллелится.

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

Да это странно. Интересно профилировать метод Аткина чтобы понять что можно улучшить.

еще на 2 умножь, четные выкинул, 1 байт = 16 чисел.
Это плюс. А если-б ты еще и "тройки" виртуально выкинул? А?

Мой асинхронный вариант так и делает. Кэширует результаты и досчитывает небольшой биткаротой сверх предыдущего расчета.

Цели считать далеко не ставил. Эратосфеном можно посчитать простое X зная все простые до sqrt(X), т.е. с 16 Гб памяти можно рассчитать простое порядка 5*10^22. В принципе алгоритм параллелится.

Изначально цель была простая: не вставлять в код статические таблицы, заменить быстрым генератором.
Кстати MOD(x,12) по Уоррену заменяется на одно умножение
на магическое число и на один shift магическое число раз.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920591
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, если не ошибаюсь очень слабо растёт. Потому сложности алгоритмов должны быть сравнимы с константой, и разница должна быть заметна на очень больших объёмах, хоты бы 10^50 элементов. Может быть я путаю конечно, но по-моему так.

Мы сейчас уехжаем, потому сегодня не смогу сам написать код и проверить ((
Завтра займусь :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920611
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПримерно на 26 бит приходится 1 простое число.
Хорошая мысль, в векторе хранить невыгодно. Посчитал статистику. В диапазоне х32 в моей биткарте получается в среднем 11 бит на число. В векторе 32, т.е. биткарта в 3 раза меньше памяти расходует. Биткарта 256 Мб на все числа до 2^32. Чисел ~190 млн., т.е. массив будет 760 Мб. Я поэтому от int64 отказался.
Статистика расчета 4 млрд. по 100 млн.Расчет доКол-во простыхСреднее распределениеВремя расчета мс1000000005761456182602000000005317482192803000000005173388202414000000005084001203505000000005019541203316000000004968836211907000000004928228214418000000004893248213109000000004863036213101000000000483831921381110000000048149362130120000000047922352153113000000004773628215511400000000475714022301500000000474105522661160000000047253052278117000000004711186223018000000004699403221001190000000046855062230200000000046743592220210000000046642392210722200000000465359622202300000000464481822124224000000004633507223025000000004624924222026000000004618796221642270000000046080252230280000000046000662220290000000045937532216633000000000458552622303100000000457910422203200000000457216422303300000000456502422191234000000004559367223035000000004554137222036000000004547803223137000000004542381232183380000000045366772330390000000045304312330400000000045251872320

Время неравномерно, т.к. дорасчет идет порциями +12,5% (max_prime/8*9, в изначальном варианте было +20%, поправил чтоб за разрядность х32 не вылезти)
maytonКоличество простых чисел на этом интервале (ЕМНИП) равно n/ln(n)
Если так, то в биткарте всегда плотность хранения будет выше чем в массиве, т.к. ln(2^N) < N

maytonДа это странно. Интересно профилировать метод Аткина чтобы понять что можно улучшить.
...
Кстати MOD(x,12) по Уоррену заменяется на одно умножение
на магическое число и на один shift магическое число раз.
Надо поискать чудоформулу, это должно заметно ускорить Аткина.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920619
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, если не ошибаюсь очень слабо растёт. Потому сложности алгоритмов должны быть сравнимы с константой, и разница должна быть заметна на очень больших объёмах, хоты бы 10^50 элементов. Может быть я путаю конечно, но по-моему так.
Судя по моим замерам похоже что так: 1 млрд ~5 сек, 3 млрд ~15 сек. Тут проблема в другом, для больших чисел памяти надо много под биткарты. Хотя тоже решаемо: для поиска следующего простого после любого X можно сгенерить кусок биткарты в 5 Мб (70 млн. чисел если тут не ошибаются ) и последовательно инициализировать ее всеми простыми до sqrt(X + 70 млн). В общем чем больше диапазон покрывает биткарта, тем больше чисел находится за раз.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920625
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonКоличество простых чисел на этом интервале (ЕМНИП) равно n/ln(n)
Если так, то в биткарте всегда плотность хранения будет выше чем в массиве, т.к. ln(2^N) < N

maytonДа это странно. Интересно профилировать метод Аткина чтобы понять что можно улучшить.
...
Кстати MOD(x,12) по Уоррену заменяется на одно умножение
на магическое число и на один shift магическое число раз.
Надо поискать чудоформулу, это должно заметно ускорить Аткина.
Я не очень понял твою формулу ln(2^n) < N. Откуда она?

По поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления.

Вот из моих сорцов. К сожалению делители только до 10.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#define OPTDIV_2(num)  num >> 1
#define OPTDIV_3(num)  num * 683 >> 11
#define OPTDIV_4(num)  num >> 2
#define OPTDIV_5(num)  num * 205 >> 10
#define OPTDIV_6(num)  num * 683 >> 12
#define OPTDIV_7(num)  num * 1171 >> 13
#define OPTDIV_8(num)  num >> 3
#define OPTDIV_9(num)  num * 911 >> 13
#define OPTDIV_10(num) num * 205 >> 11



Но для расчёта остатков нетрудно дописать еще разность и умножение.

Код: plaintext
1.
#define OPTMOD_10(num) 10 * num - OPTDIV_10(num)



По поводу Аткина. Я обращаю внимание наwikiНиже представлена реализация упрощённой версии на языке программирования C++, иллюстрирующая основную идею алгоритма — использование квадратичных форм:
Что означает упрощённая ? Грубая? Без оптимизаций? Краткая?

Ну и ... стоить покурить ассемблер. Недавно с Сашиком обсуждали тему
получение и частного и остатка одним махом.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920673
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ не очень понял твою формулу ln(2^n) < N. Откуда она?
Из твоей вывел:
maytonКоличество простых чисел на этом интервале (ЕМНИП) равно n/ln(n)
Для обычного хранения числа размера 2^N надо N бит
хранение массивом N * 2^N / ln(2^N) бит
биткартой 2^N бит
делим, получаем 1 биткарта = N / ln(2^N) = 1/ln(2) = 1,4427 массива
т.е. плотность хранения в биткарте всегда будет выше в 1,4427.
Т.к. я четные выкинул, то моя биткарта всегда будет занимать меньше места в 2,885 раза по сравнению с массивом.

maytonПо поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления.

Вот из моих сорцов. К сожалению делители только до 10.
Направление понял. Можно попробовать подбором поискать. Может есть.
Остаток от деления на 5 тоже пригодится.
Тут только минус - запас разрядности надо. Если не путаю, на x32 сдвиги 32 битами ограничены. Надо на x64 тестить.

maytonПо поводу Аткина. Я обращаю внимание наwikiНиже представлена реализация упрощённой версии на языке программирования C++, иллюстрирующая основную идею алгоритма — использование квадратичных форм:
Что означает упрощённая ? Грубая? Без оптимизаций? Краткая?
Просто корявая какая-то, расчет квадратов оптимизирован, а при считывании результатов вместо того чтобы сделать циклу шаг 2 добавили проверку кратности 3 и 5. С забавным примечанием. Я немного причесал, но не уверен что алгоритм полностью соблюден.
Надо еще поискать реализации и в алгоритм посильнее вникнуть, я не понял зачем там инверсии битов.

maytonНу и ... стоить покурить ассемблер. Недавно с Сашиком обсуждали тему
получение и частного и остатка одним махом.
Я там c вами курил, есть команда div в асме, в си div(), только компилятор MS ее в функцию обернул и в тормоз превратил. Надо глянуть во что % компилируется.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920726
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНадо глянуть во что % компилируется.
Глянул, ничего лишнего:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	int s = 100;
00413E9D  mov         dword ptr [s],64h 
	int z = s%12;
00413EA4  mov         eax,dword ptr [s] 
00413EA7  cdq              
00413EA8  mov         ecx,0Ch 
00413EAD  idiv        eax,ecx 
00413EAF  mov         dword ptr [z],edx 


Значит тормоза внутри проца
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920736
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля обычного хранения числа размера 2^N надо N бит
хранение массивом N * 2^N / ln(2^N) бит
биткартой 2^N бит
делим, получаем 1 биткарта = N / ln(2^N) = 1/ln(2) = 1,4427 массива
т.е. плотность хранения в биткарте всегда будет выше в 1,4427.
Т.к. я четные выкинул, то моя биткарта всегда будет занимать меньше места в 2,885 раза по сравнению с массивом.

Я понял почему я тебя не понял. Я разрядность int не считал. Мои увлечения primes охладели с резкой нехваткой оперативки.
И я вобщем-то не планировал использовать массивы. Меня интересовали дисковые способы хранения расчитанных primes.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920740
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗначит тормоза внутри проца
Это краеугольный камень криптографии. Именно принципиальная невозможность
оптимизировать DIV/MOD (в частности факторизацию) обеспечивает безопасность нам всем сегодня.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38920751
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

Написал, подумал, затестил: кусками по 5 мб в два раза быстрее считает чем в один проход.
До 10^9 было 4,5 сек
Код: plaintext
1.
unsigned int limit = (x < 1000) ? 1024 : x /4 * 5; // x+20%


Стало 2,65 после замены на
Код: plaintext
1.
unsigned int limit = x + 5000000; // x+5Mb


Заменил на +1 Мб стало 2.53 сек.

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

P.S. Как будете решето в множ. числе?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921635
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асинхронный Эратосфен Версия 2.0
Код: 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.
unsigned int next_prime(unsigned int x)
{
	static unsigned int* bitmap = NULL; // биткарта
	static unsigned int bm_size = 0; // размер биткарты в байтах
	static unsigned int limit = 0; // до скольки заполнять решето

	unsigned int ret = 0;
	while(true) {
		if(x < 3) {
			if(x == 0) { // освобождение памяти
				limit = 0;
				bm_size = 0;
				if(bitmap) {
					free(bitmap);
					bitmap = NULL;
				}
			}
			ret = (x < 2) ? 2 : 3;
			break;
		}
		// поиск следующего после x
		for(unsigned int i = (x | 1) + 2; i < limit; i += 2) {
			if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
				ret = i;
				break;
			}
		}
		if(ret != 0) break;
		// нехватило биткарты, дорасчет
		unsigned int old_limit = limit;
		limit += 1048576; // 64Kb
		if(limit/16 >= bm_size) { // довыделение памяти
			unsigned int bm_size_new = bm_size / 4 * 5;
			if(limit/16 > bm_size_new) bm_size_new = limit/16;
			if((x + 1048576)/16 > bm_size_new) bm_size_new = ((x + 1048576)/16) + 4; 
			if(bm_size_new > 0x10000000) bm_size_new = 0x10000000; // 2^(sizeof(unsigned int)/16)
			unsigned int* p = (unsigned int*) realloc(bitmap, bm_size_new); 
			if(!p) {
				printf("No memory. New size %d byte\n", bm_size_new);
				ret = 0xFFFFFFFF;
				break;
			}
			bitmap = p;
			memset(bitmap + bm_size/4, 0, bm_size_new - bm_size);
			bm_size = bm_size_new;
		}
		unsigned int max_prime = 3; // максимальное простое
		while(true) {
			unsigned int i = max_prime * max_prime; 
			if(i >= limit) break; // дальше заполнять не надо
			unsigned int step = max_prime << 1;
			if(i < old_limit) { // выравнивание под max_prime*max_prime+2N*max_prime
				i = old_limit - (old_limit - i) % step;
				if(i < old_limit) i += step;
			}
			for(; i < limit; i += step) { // Вычеркиваем кратные max_prime
				bitmap[i >> 6] |= (1 << ((i >> 1) & 31));
			}
			// ищем следущее простое
			for(unsigned int i = max_prime + 2; i < limit; i += 2) {
				if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
					max_prime = i;
					break;
				}
			}
		}
	}
	return ret;
}


Учел все вышенайденное. Скорость возросла в 2 раза по сравнению с синхронным. До 4 млрд. за 8.7 сек.
Что поменялось:
1. За раз считается 1 млн. значений (64 Кб биткарты).
2. Экономнее расходуется память. Массив найденных не хранится. Только биткарта, она компактнее почти в 3 раза.

Особенность: почти половина времени уходит на чтение результатов:
Код: plaintext
1.
next_prime(4000000000); //считается 4,7 сек

после
Код: plaintext
1.
2.
unsigned int k = 1;
while(k < 4000000000) k = next_prime(k); // 3,7 сек.


Т.е. если надо много раз пройтись по расчитанному - лучше закэшировать в массив. В предыдущем варинте сразу писалось в массив, поэтому нельзя было съэкономить на ненужных сохранениях.
Если сразу второе запустить то будет 8,7 сек., т.е. на 0,3 сек медленнее. Плата за экономию памяти. В первом случае выделяется сразу столько, сколько нужно.
Проверка что до 4 млрд посчитано правильно прошла успешно
Код: plaintext
1.
2.
3.
4.
5.
6.
		unsigned int max = next_prime(4000000000);
		unsigned int xe = 2;
		while(xe < 4000000000) {
			if(max % xe == 0) {printf("\nerror max = %u xe=%u\n", max, xe); break;}
			xe = next_prime(xe);
		}


То же самое x64Не совсем x64, должно работать до 64 млрд., дальше realloc() не выделит более 4 Гб под биткарту. Сравнивал до 4 млрд. с версией х32 дальше чего нагенерит не проверял.
При компиляции под x64 работает так же быстро, под x32 в 1,5 раза медленнее.
Код: 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.
typedef unsigned long long uint64_t;

uint64_t next_prime_64(uint64_t x)
{
	static unsigned int* bitmap = NULL; // биткарта
	static unsigned int bm_size = 0; // размер биткарты в байтах
	static uint64_t limit = 0; // до скольки заполнять решето

	uint64_t ret = 0;
	while(true) {
		if(x < 3) {
			if(x == 0) { // освобождение памяти
				limit = 0;
				bm_size = 0;
				if(bitmap) {
					free(bitmap);
					bitmap = NULL;
				}
			}
			ret = (x < 2) ? 2 : 3;
			break;
		}
		// поиск следующего после x
		for(uint64_t i = (x | 1) + 2; i < limit; i += 2) {
			if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
				ret = i;
				break;
			}
		}
		if(ret != 0) break;
		// нехватило биткарты, дорасчет
		
		uint64_t old_limit = limit;
		limit += 1048576; // 64Kb
		if(limit/16 >= bm_size) { // довыделение памяти
			unsigned int bm_size_new = bm_size / 4 * 5;
			if((unsigned int)limit/16 > bm_size_new) bm_size_new = (unsigned int)limit/16;
			if((unsigned int)(x + 1048576)/16 > bm_size_new) bm_size_new = (unsigned int)((x + 1048576)/16) + 4; 
			if(bm_size_new < bm_size) bm_size_new = 0xFFFFFFFF; // превышение разрядности
			unsigned int* p = (unsigned int*) realloc(bitmap, bm_size_new); //calloc(limit / 64 + ((limit & 63) ? 1 : 0), sizeof(unsigned int));
			if(!p) {
				printf("No memory. New size %u byte\n", bm_size_new);
				ret = 0xFFFFFFFF;
				break;
			}
			//if(bitmap != p)	printf("Move %d bytes\n", old_limit/16);
			bitmap = p;
			memset(bitmap + bm_size/4, 0, bm_size_new - bm_size);
			bm_size = bm_size_new;
		}
		uint64_t max_prime = 3; // максимальное простое
		while(true) {
			uint64_t i = max_prime * max_prime; 
			if(i >= limit) break; // дальше заполнять не надо
			uint64_t step = max_prime << 1;
			if(i < old_limit) { // выравнивание под max_prime*max_prime+2N*max_prime
				i = old_limit - (old_limit - i) % step;
				if(i < old_limit) i += step;
			}
			for(; i < limit; i += step) { // Вычеркиваем кратные max_prime
				bitmap[i >> 6] |= (1 << ((i >> 1) & 31));
			}
			// ищем следущее простое
			for(uint64_t i = max_prime + 2; i < limit; i += 2) {
				if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
					max_prime = i;
					break;
				}
			}
		}
	}
	return ret;
}



По поводу Аткина:
1. Эмулятор %12 не взлетит на x32 даже если его найти. Т.к. битовые сдвиги 64-битных переменных в x32 реализованы программно.
2. Аткин медленнее в 5,6 раза этого варианта.
Вывод: заход далеко за область расчета не дает посчитать более чем до 800 млн. на x32. Возможно на x64 взлетит если переделать на расчет кусками, но я эти подвиги не буду совершать, оставим поле для творчества следующим поколениям :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921677
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круть. Поверхностный code-review даже ни к чему ни цепляется. Думаю что улучшать можно
только в направлении теории алгоритмов или спуска на уровни Ассемблеров.

Еще есть одно решето. Еще один алгоритм одного индуса.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921786
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, что со скоростью ? Можно показать таблицу для 10^7,10^8, 10^9 для двух методов, со значениями скорости и памяти, пожалуйста
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921787
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где бы запустить эти алгоритмы для 10^20 элементов
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921813
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, почему отсев Аткина завязан на числе 60 ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921847
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, так у тебя упрощенный вариант, я сначала не понял. Деление происходит на 12. В оригинальной работе , используется число 60. И как я понял, это число должно динамически менять в зависимость от мощности исследуемого множества
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921850
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь .... эээ думаю помогут мои исторические знания. 60 - это основание древней вавилонской
системы счисления. 60 уникально тем что имеет следующие делители 1,2,3,4,5,6. С шагом 1.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921862
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРебята, что со скоростью ? Можно показать таблицу для 10^7,10^8, 10^9 для двух методов, со значениями скорости и памяти, пожалуйста
Я-бы предложил для начала прогнать модульный тест на корректность.
Иначе мы в погоне за скоростью забудем самое главное.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921893
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил x32 версию - ищет все до 2^32.
Ошибок нет, только зацикливается после последнего.
чтобы возвращала 0 по окончании, после строчки
Код: plaintext
1.
		limit += 1048576; // 64Kb


добавить
Код: plaintext
1.
2.
3.
4.
		if(limit < old_limit) { // превышение разрядности
			printf("No more primes :(\n");
			break;
		}


SashaMercuryРебята, что со скоростью ? Можно показать таблицу для 10^7,10^8, 10^9 для двух методов, со значениями скорости и памяти, пожалуйста
Памяти надо 1 байт на каждые 16 чисел. Т.е. для расчета 10^9 надо ~62 Мб. Реально довыделяется +20% к имеющемуся, чтобы не сильно тормозило из-за realloc()
Скорость померь сам. Пример замера скорости
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	next_prime(0); // очистка памяти
	unsigned int x = next_prime(1); // выделение памяти
	clock_t t = clock();
	x = next_prime(10000000);
	printf("10^7=%u time %d msec\n", x, clock() - t);

	next_prime(0);
	x = next_prime(1);
	t = clock();
	x = next_prime(100000000);
	printf("10^8=%u time %d msec\n", x, clock() - t);

	next_prime(0);
	x = next_prime(1);
	t = clock();
	x = next_prime(1000000000);
	printf("10^9=%u time %d msec\n", x, clock() - t);

	next_prime(0);
	x = next_prime(1);
	t = clock();
	while(x < 1000000000) x = next_prime(x);
	printf("all to 10^9=%u time %d msec\n", x, clock() - t);


У меня такой результат10^7=10000019 time 20 msec
10^8=100000007 time 110 msec
10^9=1000000007 time 1101 msec
all to 10^9=1000000007 time 2143 msec

Для чистоты эксперимента последнего замера, чтобы исключить перевыделение памяти, задай в next_prime() сразу выделение максимума
Код: plaintext
1.
bm_size_new = 0x10000000; // 2^(sizeof(unsigned int)/16)


вместо if(bm_size_new > 0xB000000) ...
SashaMercuryГде бы запустить эти алгоритмы для 10^20 элементов
Если считать все до 10^20, то надо под хранение результата ~10^19 байт или 10^7 терабайт, думаю мало у кого столько есть. Задача отпадает.
Можно попробовать посчитать какой-нибудь диапазон, например 10^20...10^20 + 70 млн., для этого надо посчитать все до 10^10 (625 Мб памяти под хранение). Инициализировать ими решето только для этого диапазона и снять результат.
Только тут засада, 64 битная переменная до 1,8*10^19. Можешь порешать задачу: поиск максимально большого простого x64. Думаю за минуту должно посчитаться.
Дальше все резко усложняется из-за ограничения разрядности целых переменных.
maytonЕще есть одно решето. Еще один алгоритм одного индуса.
Решето Сундарама Оно (как и Аткин) заточено на поиск всех от 1 до N.
mayton, просьба, добавь в первый пост ссылку на окончательный вариант
В конец:
UPD Асинхронный Эратосфен. Версия 2.0 17451792
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921910
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ-бы предложил для начала прогнать модульный тест на корректность.
Иначе мы в погоне за скоростью забудем самое главное.
Это было с самого начала. Делал проверки:
Dima T Действительно ли числа простые : сравнивал результаты разных алгоритмов между собой, до 100 млн. с 17438916 , до 800 млн. с Аткиным, до 2 млрд. синхронного и асинхронного Эратосфенов.
Проверка от 4 млрд. до 2^32
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
		unsigned int x = next_prime(4000000000);
		while(x) {
			unsigned int y = 2;
			while(y < 65536) {
				if(x % y == 0) printf("error %u %u\n", x, y);
				y = next_prime(y);
			}
			x = next_prime(x);
		}


Так все можно, только ждать устанешь, эти 250 млн. проверялись с полчаса

По хорошему еще бы на пропуски проверить после 800 млн. До 800 совпало с Аткиным, а после алгоритмы одинаковые.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921960
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли считать все до 10^20, то надо под хранение результата ~10^19 байт или 10^7 терабайт, думаю мало у кого столько есть. Задача отпадает.
Можно попробовать посчитать какой-нибудь диапазон, например 10^20...10^20 + 70 млн., для этого надо посчитать все до 10^10 (625 Мб памяти под хранение). Инициализировать ими решето только для этого диапазона и снять результат.
Только тут засада, 64 битная переменная до 1,8*10^19. Можешь порешать задачу: поиск максимально большого простого x64. Думаю за минуту должно посчитаться.
Дальше все резко усложняется из-за ограничения разрядности целых переменных.

Яж говорил. Primes - коварны. Кажущаяся простота первых результатов - воодушевляет. Но как
только - только ты выходишь на очередной уровень размеров (256-2048 бит) - начинают
"стрелять" различные технические ограничения. То компиллятор не умеет то железка не тянет
то хард диск мал.

Ну ладно. Это лирика.

Давайте порассуждаем. Есть Эратосфен. Это - серебрянная пуля. Он - стреляет. Он пока эффективнее
всяких индусов и прочих Шматкинов-Рабиновичей. Он - реально эффективнее моего pbfa - который
я постил лет 4 - 5 назад.

И мы реально умеем посчитать все primes за 8 сек до 4 млрд. Но что делать дальше?

Нам надо придумать алгоритм репликации всех вычёркиваний на следующее решето от 4 до 8 млрд.
на основании того что уже расчитано. Вопрос - как?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38921981
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922018
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНам надо придумать алгоритм репликации всех вычёркиваний на следующее решето от 4 до 8 млрд.
на основании того что уже расчитано. Вопрос - как?
На самом деле просто, уже писал как (надо два решета 1...sqrt(X) и X...X+70 млн.), вопрос только как код оформить чтобы было универсально и пользоваться удобно.

Текущая реализация заточена на то чтобы быть готовой дать от 1 до X. Для больших Х не подходит.
Можно сделать поиск ближайшего больше Х, без кэширования результатов, но тогда несколько подряд медленно будут выбираться.
Можно запрашивать диапазон X1 ... X2, тогда как-то надо инициализировать этим диапазоном (верхняя граница нужна).

Классы не хочу, глобальных переменных тоже, а как при этом все красиво в одну функцию упихать не придумал. В идеале должно также остаться next_prime(X). Думаю пока
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922064
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМарк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован
Саш, займись. Даже если не взлетит, то хотя бы им проверим корректность Эратосфена. Для начала надо простейшую корректную реализацию, без оптимизаций, без биткарт (массив bool подойдет), главное чтобы работало, а дальше будем допиливать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922103
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryМарк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован
Саш, займись. Даже если не взлетит, то хотя бы им проверим корректность Эратосфена. Для начала надо простейшую корректную реализацию, без оптимизаций, без биткарт (массив bool подойдет), главное чтобы работало, а дальше будем допиливать.

Через полтора часа начну :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922120
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧерез полтора часа начну :)
Главное без оптимизаций, чтобы читаемо было. Для начала достаточно чтобы до 1000 считал.

У меня вопрос по нему есть: нужны ли ему четные клетки решета? В реализации из википедии я не смог от них избавиться. Поэтому там биткарта в два раза больше места занимает.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922180
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМарк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован
Если честно для меня оригнальный документ Prime sieves using binary quadratic forms
- A.O.L. Atkin , D.J.Bernstein
- сложен для понимания. И я пока не знаю как его реализовать.
Wiki описывала понятно. Но если это не оригинальный - тогда я временно отложу своё мнение в
сторонку. Посмотрю какие будут у вас успехи с этим Шматкины-Бернштейном.

Ради интереса поискал сравнение.

http://stackoverflow.com/questions/5235865/comparison-of-sieve-of-sundaram-and-sieve-of-atkin-for-generating-a-list-of-prim In theory:

The sieve of Sundaram has an arithmetic complexity O(n log n).

The basic sieve of Eratosthenes has arithmetic complexity O(n log log n).

Optimized variants of the sieve of Eratosthenes have arithmetic complexity O(n).

The sieve of Atkin has not only arithmetic but also bit complexity O(n/log log n).

A magical sieve where you are given the primes, in order, takes time O(n/log n).

In practice, the sieve of Sundaram is so slow that no one uses it, and the
sieve of Atkin is slower than optimized Eratosthenes variants (although it's
at least competitive). Perhaps one day Atkin or something else will displace
Eratosthenes but it's not likely to happen soon. (Also, there's no such thing as magic.)



Последний абзац я пробую перевести. Вот что у меня вышло.
На практике, решето Сундарама настолько медленно, что никто его не использует, и
решето Аткина медленнее, чем оптимизированные варианты Эратосфена (хотя это
последнее спорно). Возможно, в один прекрасный день Аткин или какой-либ другой алгоритм будет вытеснять
Эратосфена, но это вряд ли произойдет в ближайшее время. Чудес не бывает.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922256
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryЧерез полтора часа начну :)
Главное без оптимизаций, чтобы читаемо было. Для начала достаточно чтобы до 1000 считал.

У меня вопрос по нему есть: нужны ли ему четные клетки решета? В реализации из википедии я не смог от них избавиться. Поэтому там биткарта в два раза больше места занимает.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <stdio.h>
#include <stdlib.h>

#define SIZE 1000 + 1 //d=[1;SIZE+1)
#define MAGIC_NUM 60

int divisors0_1[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 };
int divisors0_2[] = { 3, 9, 15, 21, 27, 33, 39, 45, 51, 57 };
int divisors0_3[] = { 5, 25, 35, 55 };
int divisors1[] = { 1, 13, 17, 29, 37, 41, 49, 53 };
int divisors2[] = { 7, 19, 31, 43 };
int divisors3[] = { 11, 23, 47, 59 };

int element_belong(int x)
{
	for (int i = 0; i < sizeof(divisors1); ++i)	if (divisors1[i] == x) return 1;
	for (int i = 0; i < sizeof(divisors2); ++i)	if (divisors2[i] == x) return 2;
	for (int i = 0; i < sizeof(divisors3); ++i)	if (divisors3[i] == x) return 3;	
	return 0;
}
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922447
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смысл примерно такой. Но я где-то ошибся, пока данный код работает неккоретно

Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SIZE 1000 + 1 //d=[1;SIZE+1)
#define MAGIC_NUM 60


int divisors0_1[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 };
int divisors0_2[] = { 3, 9, 15, 21, 27, 33, 39, 45, 51, 57 };
int divisors0_3[] = { 5, 25, 35, 55 };
int divisors1[] = { 1, 13, 17, 29, 37, 41, 49, 53 };
int divisors2[] = { 7, 19, 31, 43 };
int divisors3[] = { 11, 23, 47, 59 };

int element_belong(int x)
{
	for (int i = 0; i < sizeof(divisors1); ++i)	if (divisors1[i] == x) return 1;
	for (int i = 0; i < sizeof(divisors2); ++i)	if (divisors2[i] == x) return 2;
	for (int i = 0; i < sizeof(divisors3); ++i)	if (divisors3[i] == x) return 3;	
	return 0;
}

int main()
{
	static bool* nums = (bool*)calloc(SIZE, sizeof(bool));//all numbers
	nums[2] = true;
	nums[3] = true;

	int n = 1;
	for (int x = 1;n<SIZE; ++x){
		for (int y = 1;; y += 2){
			n = 4 * x*x + y*y;
			if (n > SIZE)	
				break;
			if (element_belong(n%MAGIC_NUM) == 1)	
				nums[n] = !nums[n];
		}
	}

	n = 1;
	for (int x = 1; n<SIZE; x+=2){
		for (int y = 2;; y += 2){
			n = 3 * x*x + y*y;
			if (n > SIZE)
				break;
			if (element_belong(n%MAGIC_NUM) == 2)
				nums[n] = !nums[n];
		}
	}

	n = 1;
	for (int x = 2; n<SIZE; x ++){
		for (int y = 1;; y += 2){
			n = 3 * x*x - y*y;
			if (n > SIZE)
				break;
			if (element_belong(n%MAGIC_NUM) == 3)
				nums[n] = !nums[n];
		}
	}

	//output
	for (int i = 0; i < SIZE; ++i){
		if (nums[i])	printf("%i\n", i);
	}
	return 0;
}


...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922481
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, это не решает проблему, но всё же
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int element_belong(int x)
{
	for (int i = 0; i < sizeof(divisors1)/sizeof(divisors1[0]); ++i)	if (divisors1[i] == x) return 1;
	for (int i = 0; i < sizeof(divisors2) / sizeof(divisors2[0]); ++i)	if (divisors2[i] == x) return 2;
	for (int i = 0; i < sizeof(divisors3) / sizeof(divisors3[0]); ++i)	if (divisors3[i] == x) return 3;
	return 0;
}
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922502
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, исправил практически. Ещё какая-то мелочь осталась

Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SIZE 1000 + 1 //d=[1;SIZE+1)
#define MAGIC_NUM 60

int sqrt_SIZE = (int)sqrt((float)SIZE);

int divisors0_1[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 };
int divisors0_2[] = { 3, 9, 15, 21, 27, 33, 39, 45, 51, 57 };
int divisors0_3[] = { 5, 25, 35, 55 };
int divisors1[] = { 1, 13, 17, 29, 37, 41, 49, 53 };
int divisors2[] = { 7, 19, 31, 43 };
int divisors3[] = { 11, 23, 47, 59 };

int element_belong(int x)
{
	for (int i = 0; i < sizeof(divisors1) / sizeof(divisors1[0]); ++i)	if (divisors1[i] == x) return 1;
	for (int i = 0; i < sizeof(divisors2) / sizeof(divisors2[0]); ++i)	if (divisors2[i] == x) return 2;
	for (int i = 0; i < sizeof(divisors3) / sizeof(divisors3[0]); ++i)	if (divisors3[i] == x) return 3;
	return 0;
}

int main()
{
	static bool* nums = (bool*)calloc(SIZE, sizeof(bool));//all numbers
	nums[2] = true;
	nums[3] = true;

	int n = 1;
	for (int x = 1; x<sqrt_SIZE/4; ++x){
		for (int y = 1;; y += 2){
			n = 4 * x*x + y*y;
			if (n > SIZE)	
				break;
			if (element_belong(n%MAGIC_NUM) == 1)	
				nums[n] = !nums[n];
		}
	}

	n = 1;
	for (int x = 1; x<sqrt_SIZE/3; x+=2){
		for (int y = 2;; y += 2){
			n = 3 * x*x + y*y;
			if (n > SIZE)
				break;
			if (element_belong(n%MAGIC_NUM) == 2)
				nums[n] = !nums[n];
		}
	}

	n = 1;
	for (int x = 2; n<SIZE; x ++){
		for (int y = 1;y<x-1; y += 2){
			n = 3 * x*x - y*y;
			if (n > SIZE)
				break;
			if (element_belong(n%MAGIC_NUM) == 3)
				nums[n] = !nums[n];
		}
	}

	//output
	for (int i = 0; i < SIZE; ++i){
		if (nums[i])	printf("%i\n", i);
	}
	return 0;
}

...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922572
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня уже не доделаю( Завтра утром постараюсь закончить
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922622
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги исходники в форуме это хорошо. Но может давайте постить
больше идеи и результаты? А для сорцов я создам SVN.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922675
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Я вам щяс подкину концептуальный код. А вы подумайте... Взлетит не?

Не тестил. Интересует не компилляция а теоретическая полнота. Интересует перформанс
и возможные оптимизации. Интересует масштабирование и мета-компилляция.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
     long i=....;
     long counter2=1;
     long counter3=2;
     long counter5=5;
     long counter7=6;
     .......
     while(i){
     ...............
        if (counter2 && counter3 ..............................)
          printf("This number has interesting properties: %i\n",i);
     i++;     
     if (!--counter2) counter2=0;
     if (!--counter3) counter3=0;
     ............
     }



Прошу не придираться к возможным ошибкам. Это более идея чем реализация.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922844
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКоллеги. Я вам щяс подкину концептуальный код. А вы подумайте... Взлетит не?
Не понял это
Код: plaintext
1.
if (!--counter2) counter2=0;


раз код концептуальный, пиши без Сишной каши с вычислениями в условиях. Это тоже самое:
Код: plaintext
1.
2.
counter2--;
if (counter2 == 0) counter2 = 0;


Фигня какая-то.

А в целом, как понимаю, идея считать остаток от деления счетчиками. ИМХУ может взлететь.

maytonКоллеги исходники в форуме это хорошо. Но может давайте постить
больше идеи и результаты? А для сорцов я создам SVN.
+1 Саш, не замусоривай топик, прячь хотя бы под спойлер. А по хорошему кидай только готовое.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922860
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уберу чуть позже под спойлеры. Никто не против?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного отвлеку вас. Нашёл страничку. Онлайн факторизатор.

http://ru.numberempire.com/numberfactorizer.php

Вот такое вот число
Код: plaintext
1.
999999999999999999999999999999999999999999999999999999999997 


было разложено на множители менее чем за сек.
Код: plaintext
1.
719*757*6755603*271963805968702864258461551790513043662751795453



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

А в целом, как понимаю, идея считать остаток от деления счетчиками. ИМХУ может взлететь.

Я пытался эмулировать решето без самого решета. По сути конечным автоматом без состояния.
Моё решето делает лишние калькуляции от 2 до первого делителя впрочем это не должно
влиять на выхлоп. Здесь трудность - оценить насколько грузят CPU верчения круговых
счётчиков и сверка на не ноль с отсечениями.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922898
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38922973
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВам интересно, как? Мне - да. Мне интересно.
Надо возможности мат. библиотек поизучать, думаю там что-то такое задействовано. Типа GMP . Эта либа легко генерит простое число нужного размера, см. mpz_nextprime()

maytonЯ пытался эмулировать решето без самого решета. По сути конечным автоматом без состояния.
Теоретически сработает, вопрос как по производительности и памяти. Для каждого надо хранить: текущее состояние и до скольки считать. Можно потестить.
Назовем "Решето Майтона" :)


Нашел косяк в версии 2.0. Увлекся нечетными, забыл что еще четные бывают. next_prime(10) выдает 13 :(
это
Код: plaintext
1.
for(unsigned int i = (x | 1) + 2; i < limit; i += 2) {


заменить на это
Код: plaintext
1.
for(unsigned int i = ((x - 1) | 1) + 2; i < limit; i += 2) {


Позже выложу полную версию. Может еще чего найдется.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923083
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм....
Код: plaintext
1.
2.
3.
4.
5.
Function: void mpz_nextprime (mpz_t rop, const mpz_t op)

    Set rop to the next prime greater than op.

    This function uses a probabilistic algorithm to identify primes. For practical purposes it's adequate, the chance of a composite passing will be extremely small. 



probabilistic algorithm - это вероятностный алгоритм. Это та шняга которая используется в криптографии
для поиска простых чисел для генерации ключа ЕМНИП.

У меня пока нет мнения по поводу probabilistic но это явно не та тема, которая мне интересна.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923099
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton probabilistic algorithm - это вероятностный алгоритм. Это та шняга которая используется в криптографии
для поиска простых чисел для генерации ключа ЕМНИП.
Для этих целей пользовал. Я для примера, глубоко туда не вникал, может там что еще есть полезное.
Решето Майтона не взлетело
Рабочий прототип алгоритма
Код: 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.
typedef struct {
	unsigned int val; // текущее значение
	unsigned int init; // начальное значение счетчика
} mcnt_t;

void mayton(int limit)
{
	mcnt_t cnt[100000];
	int total = 0; // общее кол-во счетчиков
	for(unsigned int i = 2; i < limit; i++) {
		bool is_prime = true;
		for(unsigned int j = 0; j < total; j++) {
			cnt[j].val--;
			if(cnt[j].val == 0) {
				cnt[j].val = cnt[j].init;
				is_prime = false;
			}
		}
		if(is_prime) {
			//printf("%d ", i);
			if(total >= sizeof(cnt) / sizeof(mcnt_t)) {
				printf("Need more counters :(\n");
				i = 100500999;
				break;
			}
			cnt[total].val = i;
			cnt[total].init = i;
			total++;
		}
	}
}


Результатtest 100000
atkin 10 msec
mayton 911 msec

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



Попробуем посчитать.



Ну грубо говоря 200 бит.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923125
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не взлетело так не взлетело. Я думал мета-компилляция спасёт моё решето...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923131
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять же проверить тот сайт ты не можешь. Где гарантия что не врут? Как проверить?
Простое число 4200000037 как бы его точно в квадрат возвести и туда запостить. Везде округленные значения.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923230
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил умножением. Не врут. Произведение - точное. Правда
проверить на простоту число 271963805968702864258461551790513043662751795453
- это трабл.

Поискал другие сайты - тухляк. На многих факторизатор - игрушечный. Ограничен
диапазоном int32. А один особо отличился. Подвесил мне браузер нахер. Причем
так жёстко что пришлось ребутнуть процесс в taskmanager.

Кажется этот

http://ru.onlinemschool.com/math/assistance/number_theory/multiplier/
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923256
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм Аткина, согласно Аткину, реализован

Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SIZE 1000000 + 1 //d=[1;SIZE+1)
#define MAGIC_NUM 60

int sqrt_SIZE = (int)sqrt((float)SIZE);

//int divisors0_1[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 };
//int divisors0_2[] = { 3, 9, 15, 21, 27, 33, 39, 45, 51, 57 };
//int divisors0_3[] = { 5, 25, 35, 55 };
int divisors1[] = { 1, 13, 17, 29, 37, 41, 49, 53 };
int divisors2[] = { 7, 19, 31, 43 };
int divisors3[] = { 11, 23, 47, 59 };

int element_belong(int x)
{
	for (int i = 0; i < sizeof(divisors1) / sizeof(divisors1[0]); ++i)	if (divisors1[i] == x) return 1;
	for (int i = 0; i < sizeof(divisors2) / sizeof(divisors2[0]); ++i)	if (divisors2[i] == x) return 2;
	for (int i = 0; i < sizeof(divisors3) / sizeof(divisors3[0]); ++i)	if (divisors3[i] == x) return 3;
	return 0;
}

int main()
{
	static bool* nums = (bool*)calloc(SIZE, sizeof(bool));//all numbers
	nums[2] = true;
	nums[3] = true;
	nums[5] = true;

	int x2 = 0, y2 = 0, n = 0;
	for (int i = 1; i <= sqrt_SIZE; ++i)
	{
		x2 += 2 * i - 1;
		y2 = 0;
		for (int j = 1; j <= sqrt_SIZE; ++j)
		{
			y2 += 2 * j - 1;

			n = 4 * x2 + y2;
			if (n <= SIZE && element_belong(n%MAGIC_NUM) == 1)
				nums[n] = !nums[n];

			n -= x2;
			if (n <= SIZE && element_belong(n%MAGIC_NUM) == 2)
				nums[n] = !nums[n];

			n -= 2 * y2;
			if (n <= SIZE && element_belong(n%MAGIC_NUM) == 3 && i>j)
				nums[n] = !nums[n];
		}
	}

	for (int i = 5; i <= sqrt_SIZE; ++i)
	{
		if (nums[i]){
			n = i*i;
			for (int j = n; j <= SIZE; j += n){
				nums[j] = false;
			}
		}
	}


	//output
	int count = 0;
	for (int i = 0; i < SIZE; ++i){
		if (nums[i]){
	//		printf("%i\n", i);
			++count;
		}
	}
	printf("count=%i\n", count);
	return 0;
}



Пришлось воспользоваться конструкцией предложенной другим автором, но ничего страшного, та конструкция лучше того, что я предлагал вчера
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923257
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОпять же проверить тот сайт ты не можешь. Где гарантия что не врут? Как проверить?
Простое число 4200000037 как бы его точно в квадрат возвести и туда запостить. Везде округленные значения.

17640000310800001369
я ведь писал программу для работы с длинной арифметикой :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923259
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тот ресурс корректно справился с этим числом.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923282
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryАлгоритм Аткина, согласно Аткину, реализован

Пришлось воспользоваться конструкцией предложенной другим автором, но ничего страшного, та конструкция лучше того, что я предлагал вчера
В википедии подобная конструкция, но есть разница в мелочах. Хорошо написал, твой код понятнее. Теперь есть точка отсчета для оптимизации.

По твоему коду, что можно оптимизировать:
1. element_belong() раскладывается на 3 массива по 60 элементов, проставить true там где надо, затем проверять divisors1[n%60]. Можно 64 бита взять.
2. Вывод результата начиная с 3 и шагом 2.
3. Четные можно выкинуть из биткарты. Просто добавить проверку n на четность перед использованием n. if(n&1) ... Памяти потребуется вдвое меньше.

Еще бы n%60 как-то ускорить, т.е. от % избавиться.

Мысль появились: для оценки производительности надо посчитать общее количество итераций. Если у Аткина их заметно меньше Эратосфена, то есть смысл дальше бороться за скорость. Замерю - отпишусь.


SashaMercury17640000310800001369
я ведь писал программу для работы с длинной арифметикой :)
Вчера не сообразил. Вот она первая проблема чисел х64: как результаты смотреть? Надо про printf() почитать, может есть такой тип, или придется накидать что-нибудь простенькое.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923301
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923311
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНемного отвлеку вас. Нашёл страничку. Онлайн факторизатор.

http://ru.numberempire.com/numberfactorizer.php

Вот такое вот число
Код: plaintext
1.
999999999999999999999999999999999999999999999999999999999997 


было разложено на множители менее чем за сек.
Код: plaintext
1.
719*757*6755603*271963805968702864258461551790513043662751795453



Вам интересно, как? Мне - да. Мне интересно.Однозначно не перебором простых делителей. Если 6755603 еще гипотетически можно найти перебором, то например 340282366920938463463374607431768211457 (это 2^128+1 - седьмое число Ферма) разлагается на множители 59649589127497217*5704689200685129054721. Тут перебор делителей не поможет.
https://ru.wikipedia.org/wiki/Факторизация_с_помощью_эллиптических_кривых
https://ru.wikipedia.org/wiki/Метод_квадратичного_решета
https://ru.wikipedia.org/wiki/Общий_метод_решета_числового_поля
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923312
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.
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.
typedef unsigned long long uint64_t;

std::vector<unsigned int> prime;

void atkin(unsigned int limit)
{
	unsigned int* bitmap = (unsigned int*) calloc(limit / 32 + 1 + ((limit & 31) ? 1 : 0), sizeof(unsigned int));
	bitmap[0] = 12;
	unsigned int sqr_lim = (unsigned int)sqrt((long double)limit);
 	uint64_t cnt = 0;

	// Предположительно простые - это целые с нечетным числом
	// представлений в данных квадратных формах.
	// x2 и y2 - это квадраты i и j (оптимизация).
	unsigned int x2 = 0;
	for (unsigned int i = 1; i <= sqr_lim; i++) {
		x2 += 2 * i - 1;
		unsigned int y2 = 0;
		for (unsigned int j = 1; j <= sqr_lim; j++) {
			y2 += 2 * j - 1;
			cnt++; // cnt += 3;
			unsigned int n = 4 * x2 + y2;
			unsigned int m = n % 12;
			if ((n <= limit) && (m == 1 || m == 5))
				bitmap[n >> 5] ^= (1 << (n & 31));
	 
			n -= x2; // Оптимизация n = 3 * x2 + y2; 
			if ((n <= limit) && (n % 12 == 7)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
	 
			n -= 2 * y2; // Оптимизация n = 3 * x2 - y2;
			if ((i > j) && (n <= limit) && (n % 12 == 11)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
		}
	}
	 
	// Отсеиваем кратные квадратам простых чисел в интервале [5, sqrt(limit)].
	// (основной этап не может их отсеять)
	//for (unsigned int i = 5; i <= sqr_lim; i++) {
	for (unsigned int i = 5; i <= sqr_lim; i+=2) {
		cnt++;
		if (bitmap[i >> 5] & (1 << (i & 31))) {
			cnt--;
			unsigned int n = i * i;
			for (unsigned int j = n; j <= limit; j += n) {
				cnt++;
				bitmap[j >> 5] &= ~(1 << (j & 31));
			}
		}
	}
	 
	// Вывод списка простых чисел в консоль.
	//printf("2, 3, 5"); 
	prime.push_back(2);
	prime.push_back(3);
	prime.push_back(5);
	for(unsigned int i = 7; i <= limit; i += 2) {  // добавлена проверка делимости на 3 и 5. В оригинальной версии алгоритма потребности в ней нет.
		//if ((bitmap[i >> 5] & (1 << (i & 31))) && (i % 3 != 0) && (i % 5 !=  0)){
		cnt++;
		if ((bitmap[i >> 5] & (1 << (i & 31)))){
		  // printf(", %d", i);
		   prime.push_back(i);
		}
	}
	free(bitmap);
	if(cnt > 0xFFFFFFFF) {
		printf("atkin > 0xFFFFFFFF times\n");
	} else {
		printf("atkin %d times\n", (unsigned int) cnt);
	}
}

void eratosfen(unsigned int limit)
{
	unsigned int* bitmap = (unsigned int*) calloc(limit / 64 + ((limit & 63) ? 1 : 0), sizeof(unsigned int));
	prime.push_back(2);
	prime.push_back(3);
	uint64_t cnt = 0;
	unsigned int max_prime = 3; // максимальное простое
	bool need_fill = true;
	while(need_fill) {
		cnt++;
		unsigned int step = max_prime << 1;
		for(unsigned int i = max_prime * max_prime; i < limit; i += step) { // Вычеркиваем кратные max_pr
			bitmap[i >> 6] |= (1 << ((i >> 1) & 31));
			cnt++;
		}
		if(max_prime * max_prime >= limit) need_fill = false; // дальше заполнять не надо
		// вычитываем следущую порцию
		for(unsigned int i = max_prime + 2; i < limit; i += 2) {
			cnt++;
			if((bitmap[i >> 6] & (1 << ((i >> 1) & 31))) == 0) {
				prime.push_back(i);
				if(need_fill) {
					max_prime = i;
					break;
				}
			}
		}
	}
	free(bitmap);
	if(cnt > 0xFFFFFFFF) {
		printf("eratosfen > 0xFFFFFFFF times\n");
	} else {
		printf("eratosfen %d times\n", (unsigned int) cnt);
	}
}


Результатtest 100000000
eratosfen 146286641 times
atkin 159115849 times
Аткин на 8,7% больше проходов. Это еще без учета того что в первом цикле за раз три значения обрабатываются. Если там по 3 считать, то будет 359115849.
Вобщем надо Аткина как-то в эту сторону оптимизировать. По максимуму бороться с четными в переменных цикла. Что смог - уже учел в коде теста.
Проверьте, может криво намерил.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923316
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно 4 млрд. сравнить?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923344
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА можно 4 млрд. сравнить?
Тест доЭратосфенАткин10000012161915898610000001311234159126610000000139255881591017810000000014628664115911584980000000012152607781272900787
Аткин до 800 млн. считает корректно. Дальше разрядности x32 не хватает. Проблема отсюда же. 4*x2+y2, т.е. предел 4 млрд./5

Надо как-то выскакивать из цикла досрочно
Пробовал так. Вроде логично, но результаты становятся неправильные, затести на своем варианте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	for (unsigned int i = 1; i <= sqr_lim; i++) {
		x2 += 2 * i - 1;
		unsigned int y2 = 0;
		for (unsigned int j = 1; j <= sqr_lim; j++) {
			y2 += 2 * j - 1;
			cnt++; //cnt += 3;
			unsigned int n = 4 * x2 + y2;
			unsigned int m = n % 12;
			if ((n <= limit) && (m == 1 || m == 5))
				bitmap[n >> 5] ^= (1 << (n & 31));
	 
			n -= x2; // Оптимизация n = 3 * x2 + y2; 
			if ((n <= limit) && (n % 12 == 7)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
	 
			n -= 2 * y2; // Оптимизация n = 3 * x2 - y2;
			if(n > limit) break;
			if ((i > j) && (n <= limit) && (n % 12 == 11)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
		}
	}

...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923370
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
	for (unsigned int i = 1; i <= sqr_lim; i++) {
		x2 += 2 * i - 1;
		unsigned int y2 = 0;
		for (unsigned int j = 1; j <= sqr_lim; j++) {
			y2 += 2 * j - 1;
			cnt++; //cnt += 3;
			unsigned int n = 4 * x2 + y2;
			unsigned int m = n % 12;
			if ((n <= limit) && (m == 1 || m == 5))
				bitmap[n >> 5] ^= (1 << (n & 31));
	 
			n -= x2; // Оптимизация n = 3 * x2 + y2; 
			if ((n <= limit) && (n % 12 == 7)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
	 
			n -= 2 * y2; // Оптимизация n = 3 * x2 - y2;
			if(n > limit) break;
			if ((i > j) && (n <= limit) && (n % 12 == 11)) {
				bitmap[n >> 5] ^= (1 << (n & 31));
			}
		}
	}



логично что они становятся неправильные, y растёт, потому n убывает, потому корни ещё могут быть, прерывать нельзя
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923394
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryлогично что они становятся неправильные, y растёт, потому n убывает, потому корни ещё могут быть, прерывать нельзя
Понял. Тогда надо как-то перешагнуть область где (n > limit). Надо формулу изобретать.
Как вариант: прервать цикл и пойти с обратного конца. Так правильно будет?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923413
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryлогично что они становятся неправильные, y растёт, потому n убывает, потому корни ещё могут быть, прерывать нельзя
Понял. Тогда надо как-то перешагнуть область где (n > limit). Надо формулу изобретать.
Как вариант: прервать цикл и пойти с обратного конца. Так правильно будет?

Да, скорее всего так и нужно, значение y должно плясать от значение x с конца..
PS
Что-то не так. Аткин доказал что его алгоритм эффективнее, пусть это и не заметно на маленьких объёмах. У нас получается обратное, сейчас мы занимаемся оптимизацией. Значит либо Алгоритм реализован неправильно, либо в чём-то другом дело. Аткин говорит о 19 секундах для миллиарда, на более простом алгоритме, на старой машине. Что-то видимо я не так сделал.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923431
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что соавтор Аткина пишет , и выкладывает
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923443
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно запустить его код и проверить на своей машине, или это будет проблематично ?
Интересно, будет ли тот код быстрее твоей реализации Эратосфена
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923464
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВозможно запустить его код и проверить на своей машине, или это будет проблематично ?
Интересно, будет ли тот код быстрее твоей реализации Эратосфена
Видел ту ссылку, только там какая-то гора исходников, внутрь не заглядывал. Можно попробовать. Пока некогда, вечером попробую запустить.

Можешь сам затестить. Мой Эратосфен выше. Выкини в обоих случаях сохранение. У меня prime.push_back(). Замени на подсчет количества найденных.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923665
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу не взлетело так не взлетело. Я думал мета-компилляция спасёт моё решето...
Вобщем я подумал и вот что решил. Никакое это не решето мейтона. Это фильтр мейтона. (Mayton's numbers filter (MNF)).
Ну... вобщем нет смысла хардкодить циклическую арифметику на полную длину primes до SQRT.
Но можно эффективно отбрасывать PRIMES которые имеют делители до первой сотни. И вот почему.
В современных железках есть команды SIMD. Это когда за 1 шаг мы выполняем вектор инициаций.
Вектор сложений. И вектор еще чего-нибудь. Напр 128-битный SSE регист может быть побит на 4х64
или 8х32 регистра и операции сложения будут работать как микро-threads в контексте 1 итерации
проверки числа на простоту.

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

Можешь сам затестить. Мой Эратосфен выше. Выкини в обоих случаях сохранение. У меня prime.push_back(). Замени на подсчет количества найденных.
Саша. Дима. Давайте зальём в репозитарий. Будет удобнее работать совместно.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923691
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаша. Дима. Давайте зальём в репозитарий. Будет удобнее работать совместно.
Я не против, только не умею :) Как понимаю ты тут уже все заготовил 17455393

Как туда зацепиться? Есть какая-нибудь инструкция? желательно на русском.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923700
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скачай и установи себе TortoiseSVN.

http://tortoisesvn.net/

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

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

http://tortoisesvn.net/

Дальше - расскажу.
Дальше не надо. Уже стоит. Думал там что-то другое надо.
Зарегался, качнул. Вечером освобожусь, подготовлю свои поделки к аплоаду.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923749
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДальше не надо. Уже стоит. Думал там что-то другое надо.
Зарегался, качнул. Вечером освобожусь, подготовлю свои поделки к аплоаду.
Ты должен дать мне реквест на добавление тебя в группу разработки. Иначе доступ - R/O.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923750
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня кстати первая в жизни самостоятельная программа была (учебное задание на первом курсе) -- именно генерация простых чисел и именно решетом Эратосфена.
На Fortran-IV.
На ЕС ЭВМ.
До сих пор где-то тетрадка с распечаткой валяется.

Это был первый урок постижения, что такое "производительность" и как за неё бороться.
Меня отец учил. Сначала написал, отладил на числах до 100, запустил на до миллиона -- задача снята без
ответа (на ЕС пакетный режим, и ограничение по процессорному времени были).
И дальше -- поехало, такая оптимизация, такая (деталей не помню) -- всё на математике.
В конце влезла она в тайм-слот, и напечатала все числа, задание сдал.

Попробую отрыть тетрадь для прикола...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923769
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сколько памяти было на ЕС ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923770
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА сколько памяти было на ЕС ?

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

Код: plaintext
1.
2.
3.
4.
5.
6.
branches
tags
+trunk
   + DimaT
   + mayton
   + SashaMercury



Делайте коммиты туда. Потом разберёмся и перенесем как надо.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923809
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМинутку. Может это я должен подключить мембера?
Вроде я должен попросится сначала, как понял из инета. Может ты должен как-то разрешить просится? Доки надо читать, у меня с английским не очень.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923836
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу для миллиона Эратосфена должно быть не меньше 128Кб только для данных.

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

Вы бы это, чатик какой что-ли завели, на базе skype или icq, или ещё чего-нибудь.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923864
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivМеньше, чем на появившейся чуть позде первой XT (286), где было 640к.
на 286 был 1Мб, можно было второй воткнуть, помню была у меня такая "планка" размером с небольшую клавиатуру :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923870
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivМеньше, чем на появившейся чуть позде первой XT (286), где было 640к.
на 286 был 1Мб, можно было второй воткнуть, помню была у меня такая "планка" размером с небольшую клавиатуру :)

Программе доступно было 640к. далее шла видеопамять.
HIMEM появился только с 386-го.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923893
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я катался на тройках. SX. Жлобский вариант. 33Мгц. В них еще не было FPU
и для запуска Ауто-КАд надо было запускать софтварный эмулятор со-процессора
арифметики. В моей перой конфигурации ОС был МС ДОС 5.0 без Нортор-Командира.
И я использовал RAR как файловый менеджер для блуждания по каталогам.

В каталогах у меня были ништяки. Например

setka.exe - транслировала настроечную таблицу. И пищала на tспикер.
Prince.exe - страшная хорор-игрушка с поддержкой даже CGA/EGA.
Wolf3d - мега крутая игруха про немцев
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38923925
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПрограмме доступно было 640к. далее шла видеопамять.
HIMEM появился только с 386-го.
Нет. https://ru.wikipedia.org/wiki/HIMEM.SYS
himem появился в 286, в 386 добавился emm386.exe
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924073
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А была еще такая шняга как emm386.exe. Без нее игрухи не шли. Некоторые.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924093
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВот что соавтор Аткина пишет , и выкладывает
Попробовал откомпилировать primespeed.c . Не получилось.
Код: plaintext
1.
timing.h(4) : Cannot open include file: 'hasrdtsc.h'


В инете порылся - не нашел. Подсунул пустой файл, пишет нет еще hasgethr.h, еще пустой подсунул - надо primegen.h. Что-то не так я делаю.

Я не силен в компиляциях под линуксы. Свой виндовый исходник еще могу доделать чтоб собирался, а с чужими сложнее. Может чего не так запускал.

Там есть eratspeed.c (как понимаю эратосфен). Тоже интересно скорость глянуть.

Может кто расскажет как запустить в линуксе ? Еще лучше в виндовсе.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924109
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivПрограмме доступно было 640к. далее шла видеопамять.
HIMEM появился только с 386-го.
Нет. https://ru.wikipedia.org/wiki/HIMEM.SYS
himem появился в 286, в 386 добавился emm386.exe

Так, ребяты, там же написано, что HIMEM появился в 5-ом DOS-е.
У нас был 3-ий.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924118
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryВот что соавтор Аткина пишет , и выкладывает
Попробовал откомпилировать primespeed.c . Не получилось.
.....
Может кто расскажет как запустить в линуксе ? Обычно запустить "make" достаточно
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924119
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima Tпропущено...

Нет. https://ru.wikipedia.org/wiki/HIMEM.SYS
himem появился в 286, в 386 добавился emm386.exe

Так, ребяты, там же написано, что HIMEM появился в 5-ом DOS-е.
У нас был 3-ий.
А кто мешал 5-й запускать на 286 ? Я к тому что было у меня 2 Мб на 286м. И проги их использовали.
Пофиг уже. С него сразу на Pentium100 пересел.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924125
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Экскурс в прошлое. Мдя...
Пылью покрылось.

Несколько моих скверных поделий
7137996
7138453 (тот самый метод грубой силы. Тупой.)
7139627 Вроде та-же шняга под Win-64x
7140643 Целочисленный SQRT


Некий Студентик на(ш)кодил
7149017 Эратосфен на Паскале
+еще дофига сорцов на Паскале

К сожалению там так и не был опубликован последний вариант PBFA который я тестил на OpenSuse.
Похоже я его утерял. Ну и хер с ним. Восстановлю. Собственно он решал задачи ХРАНЕНИЯ
в файлах уже расчитанных primes до 2^64.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924131
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneОбычно запустить "make" достаточно
Спасибо. Помогло :)

Результаты:
Аткин (primespeed)50847534 primes up to 1000000000.
Timings are in ticks. Nanoseconds per tick: approximately 0.288855.
Overall seconds: approximately 0.517420.

Эратосфен (eratspeed)50864821 primes up to 1000359390.
Timings are in ticks. Nanoseconds per tick: approximately 0.288853.
Overall seconds: approximately 0.662039.
мои поделкиtest 1000000000
eratosfen 4158 msec
next_prime 1098 msec
отстаю :(
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924133
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПрограмме доступно было 640к. далее шла видеопамять.
HIMEM появился только с 386-го.EMS появился вместе со вторым досом и XT на 8086. Но как всякая железка стоил весьма негуманных денег.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924143
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошая новость: есть с чем сравнивать и количество совпало.
Аткин50847534 primes up to 1000000000.
мой эратосфенtest 1000000000
check prime[50847534] to 999999937
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924154
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нам полюбому нужен сценарий теста. Хорошо-бы чтоб все утилиты в STDOUT сбрасывали результат
по ключу.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924188
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит на отрезке 2..1 000 000 000
найдено 50 847 534 primes?

ОКИ. Примем это за базовый тест. Будет как smoke.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924205
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivпропущено...


Так, ребяты, там же написано, что HIMEM появился в 5-ом DOS-е.
У нас был 3-ий.
А кто мешал 5-й запускать на 286 ?

Так НЕ БЫЛО его ещё...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924223
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНам полюбому нужен сценарий теста. Хорошо-бы чтоб все утилиты в STDOUT сбрасывали результат
по ключу.
Не писать не вариант, компилятор просто выкинет ненужный код и получишь нездоровые замеры.
Писать в STDOUT - тормоза от printf() не дадут нормально скорость измерить.
Я вектор использую, тоже не совсем корректно, память довыдедеряет, хотя это достаточно быстро, но вообще-то уже С++, а не С.

Предлагаю изолировать расчет от хранения результатов. Передавать в параметрах функцию void prime_store(uint64_t x), а дальше подсовывай что хочешь: хоть заглушку со счетчиком, хоть вектор. Пусть только верхний уровень знает что подсунул, а нижний честно ее вызывает.

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

А кто мешал 5-й запускать на 286 ?

Так НЕ БЫЛО его ещё...
Перпендикулярное синхроннее вертикального. Забей, проехали.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924227
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonНам полюбому нужен сценарий теста. Хорошо-бы чтоб все утилиты в STDOUT сбрасывали результат
по ключу.
Не писать не вариант, компилятор просто выкинет ненужный код и получишь нездоровые замеры.
Писать в STDOUT - тормоза от printf() не дадут нормально скорость измерить.
Я вектор использую, тоже не совсем корректно, память довыдедеряет, хотя это достаточно быстро, но вообще-то уже С++, а не С.

Предлагаю изолировать расчет от хранения результатов. Передавать в параметрах функцию void prime_store(uint64_t x), а дальше подсовывай что хочешь: хоть заглушку со счетчиком, хоть вектор. Пусть только верхний уровень знает что подсунул, а нижний честно ее вызывает.
Можно делать вычисления отдельным модулем. Функция. Класс. Компонента.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924233
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS Дурной день был, умотался, все что наобещал сегодня не успею, завтра зафиксирую свои поделки.
Да бох с ним. Я не тороплю. Этот проект - Just For Fun.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924252
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мужики,

мне кажется до определённого размера простые числа можно не хранить, достаточно перебора

999999937 / 50847534 =19.6

вот смотрите, при натуральном k

6k-1
6k - кратно 2 и 3
6k+1
6k+2 - кратно 2
6k+3 - кратно 3
6k+4 - кратно 2

т.е. все простые числа лежат в множестве 6k+/-1, достаточно проверять 1 из 3-х чисел
операции с регистрами гораздо быстрее чем попытки лезть в память
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924255
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)все простые числа лежат в множестве 6k+/-1
Сходу могу сказать что ты масштабнее Аткина в 102,4 раза :) У того магическое число было 60.

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

Это называется Спираль Улама.



На ней чёрными точками обозначены primes - белыми все остальные составные числа.
При условии что заполнение шло от центра квадрата против часовой стрелки.

На спирали отчётливо виден ближний порядок точек. По сути каждая точка
в ряду отстоит от другой на строго фиксированное расстояние
которое квадратично зависит от "витка спирали".

По сути картинка наглядно показывает что существует формула
описывающая "возникновение" следующей точки в ряду.

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

Это называется Спираль Улама.

https://ru.wikipedia.org/wiki/Скатерть_Улама .
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924293
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tkealon(Ruslan)все простые числа лежат в множестве 6k+/-1
Сходу могу сказать что ты масштабнее Аткина в 102,4 раза :) У того магическое число было 60.

Давай, развивай свою идею до примера кода который можно запустить.
залейте исходники рабочие того что есть, что бы сравнивать можно было
сюда же вроде как решились лить?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924301
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это кому как удобно.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924372
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tkealon(Ruslan)все простые числа лежат в множестве 6k+/-1
Сходу могу сказать что ты масштабнее Аткина в 102,4 раза :) У того магическое число было 60.

Давай, развивай свою идею до примера кода который можно запустить.

Марк, товарищ привел известный факт, не более ни менее. а 60 скорее всего получено эмпирически, других предположений пока нет, кроме мистицизма об делимости на числа от 1 до 6 ;)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924392
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обязательно устанавливать ту программу для совместной работы с репозиторием ? Только через 7 часов смогу этим заняться
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924398
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА обязательно устанавливать ту программу для совместной работы с репозиторием ? Только через 7 часов смогу этим заняться
Оттуда брать можешь без нее, но обратно что-то заливать без нее не получится. С ней удобнее, меньше кнопок нажимать.

maytonЭто называется Спираль Улама.
Глянул мельком, интересная метода, но получить все простые с ее помощью будет проблематично. Например посмотри где стоят 15 и 27.
Для криптографии подойдет. probabilistic algorithm
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924402
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury60 скорее всего получено эмпирически
Это произведение первых простых чисел: 2*3*5 = 60 следующее такое 420.
Думаю на этом оптимизация как-то завязана.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924408
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Мужики,

мне кажется до определённого размера простые числа можно не хранить, достаточно перебора

999999937 / 50847534 =19.6

вот смотрите, при натуральном k

6k-1
6k - кратно 2 и 3
6k+1
6k+2 - кратно 2
6k+3 - кратно 3
6k+4 - кратно 2

т.е. все простые числа лежат в множестве 6k+/-1, достаточно проверять 1 из 3-х чисел
операции с регистрами гораздо быстрее чем попытки лезть в памятьМожно пойти дальше: остатки от деления на 30 для простых чисел больше 5 могут быть только 1,7,11,13,17,19,23,29. Можно сократить битовую карту почти вдвое - один байт на 30 чисел. Выкидываем кратные 7 - получаем 48 бит (6 байт) на 210 чисел. И т.д.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924409
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercury60 скорее всего получено эмпирически
Это произведение первых простых чисел: 2*3*5 = 60 следующее такое 420.
Думаю на этом оптимизация как-то завязана.2*3*5 = 30
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924413
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone2*3*5 = 30
вот я затупил
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924439
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял магичность числа 60.
Если взять все числа которые не делятся без остатка на 2,3,5, будет такая табличкаЧислоОт предыдущего7114132174192234296312376414432474492534596612676......

если табличку продолжить видно что повторы идут с частотой 60
Исследовал как бы в цикле шаги побольше делать.
Для выкидывания четных шаг 2. Т.е. перебор 50% значений
Для (2, 3) шаги 2,4,6. Перебор 25% (кол-во эл-тов/сумму)
Для (2, 3, 5) шаги 4,2,4,2,4,6,2,6,4,2,4,2,4,6,2,6. Перебор 26,7% (16/60) (отсюда и получилось 2*3*5 = 60)
Для (2, 3, 5, 7) Перебор 22,9% (96/420)

Неоптимальное число 60, лучше 420
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924442
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TГлянул мельком, интересная метода, но получить все простые с ее помощью будет проблематично. Например посмотри где стоят 15 и 27.
Для криптографии подойдет. probabilistic algorithm
С помощью нее и невозможно получить все простые. Но можно найти ряд полиномов внезапно (!) генерирующих
подмножество простых на интервале.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924460
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще несколько магических чисел:
4620 для (2,3,5,7,11) Перебор 20,8% (960/4620)
60060 для (2,3,5,7,11,13) Перебор 19,2% (11520/60060)
1021020 для (2,3,5,7,11,13,17) это уже сложно в экселе обсчитать
Магическая формула простая: перемножаем все простые 2...N и еще раз на 2. Выкидываем кратные 2...N и строим ряд из разницы соседних. Цикл начинаем со следующего простого после N

В итоге перебор стремится к 5% (примерно столько простых в диапазоне), но как-то медленно стремится. Попробую для начала тройки выкинуть, уже двухкратное ускорение по сравнению с перебором нечетных.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924474
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, еще раз на 2 то зачем умножать? http://primes.utm.edu/glossary/page.php?sort=WheelFactorization
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924479
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Large wheels are not particularly efficient. To remove 90% of the composites, we must use the primes up to 251. 95% requires the primes to 75,037. 96% requires the primes to 1,246,379. 97% requires the primes to 134,253,593!
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924507
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima T, еще раз на 2 то зачем умножать?
я исхожу из того чтобы циклом идти как можно большими шагами, там периодичность именно такая выходит
Например для (2,3) начинаем со следующего простого (5) и шагаем 2,4,6,2,4,6... т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int i = 5;
while(i < 10000) {
  i+=2;
  ... проверка i
  i+=4;
  ... проверка i
  i+=6;
  ... проверка i
}

Суммарный шаг 12(2+4+6) или (2*3)*2

для (2,3,5) шаги 4,2,4,2,4,6,2,6,4,2,4,2,4,6,2,6.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924512
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, последовательность 4,2,4,2,4,6,2,6 повторяется дважды зачем?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924520
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima T, последовательность 4,2,4,2,4,6,2,6 повторяется дважды зачем?
Точно, задвоилась. В целом пофиг. На конечный процент пропусков не влияет.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924563
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, зафиксировал синхронного этатосфена. Учел все пожелания по оформлению. Можешь посмотреть.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924651
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично. Только нам нам надо придумать как это собирать в консоли.

Я делаю *.cmd файлы под MinGW (Win_x64). Но честно говоря
выглядят они позорно. И я их не коммичу. Хотелось-бы скриптовать
сборку приличнее.

Я пользовался сборщиками в основном под java (ant,maven,gradle)
и слабо знаком с тем какие есть для С/C++.

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

Я делаю *.cmd файлы под MinGW (Win_x64).
Я тоже не большой спец в этом вопросе. Сделал проект в MSVC Express, там пишу, запускаю, отлаживаю.
В линуксе: gcc eratosfentest.cpp -O2 -oerat
много накопится, можно make общий сделать.

Если ввести требование: один exe из одного cpp то компиляция резко упростится.
т.е. все пишем в .h, цепляем нужные в один cpp, его компилируем.

Проект небольшой, думаю этого достаточно.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924778
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima T, еще раз на 2 то зачем умножать? http://primes.utm.edu/glossary/page.php?sort=WheelFactorization

ага, оно самое

авторNotice that the simple wheel based on 2 and 3 removed 4/6 = 2/3 rds of the composites. The larger wheel using 2, 3, 5, and 7 will remove 162/210 (over 77%) of the composites.

Large wheels are not particularly efficient. To remove 90% of the composites, we must use the primes up to 251. 95% requires the primes to 75,037. 96% requires the primes to 1,246,379. 97% requires the primes to 134,253,593! Just imagine how many primes you will need to remove 99% of the composites!
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924888
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел затестить вместо %6
maytonПо поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления.

Вот из моих сорцов. К сожалению делители только до 10.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#define OPTDIV_2(num)  num >> 1
#define OPTDIV_3(num)  num * 683 >> 11
#define OPTDIV_4(num)  num >> 2
#define OPTDIV_5(num)  num * 205 >> 10
#define OPTDIV_6(num)  num * 683 >> 12
#define OPTDIV_7(num)  num * 1171 >> 13
#define OPTDIV_8(num)  num >> 3
#define OPTDIV_9(num)  num * 911 >> 13
#define OPTDIV_10(num) num * 205 >> 11


Врет чудоформула
OPTDIV_6(2069) = 345
2069/6 = 344,8
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38924953
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напутал немного с расчетами шагов. Если кратные 2м и 3м выкинуть, то перебор 33% а не 25%. Зафиксировал.
Количество итераций на миллиарде уменьшилось с 1524 млн. до 1191. Правда пропорционально быстрее не стало. Итераций меньше на 22%, время на 7%. Думаю из-за %6. Надо затестить пропуски (2,3,5)
Результатыtest eratosfen2() from 1 to 1000M
eratosfen2() 1524M steps
count 50847534 primes time 4486 msec

test eratosfen3() from 1 to 1000M
eratosfen3() 1191M steps
count 50847534 primes time 4166 msec
Нашел странный косяк в next_prime() Пропускает в дебаге число 76293757 в релизе не пропускает. Не заметил, т.к. в основном в релиз компилировал.
Тест:
Код: plaintext
1.
2.
	test_init();
	eratosfen(76293800, store_check);


Похоже косяк с довыделением памяти под биткарту как-то связан, если сразу выделить максимум - не проявляется. Поразбираюсь позже.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925010
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВрет чудоформула
OPTDIV_6(2069) = 345
2069/6 = 344,8
Хм... действительно есть погрешность. Чортов старик Уоррен...

Потестил на Java с использованием long64.

Код: 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.
2047 OPTDIV_6(2047)=341 2047/6=341 
2048 OPTDIV_6(2048)=341 2048/6=341 
2049 OPTDIV_6(2049)=341 2049/6=341 
2050 OPTDIV_6(2050)=341 2050/6=341 
2051 OPTDIV_6(2051)=342 2051/6=341 
2052 OPTDIV_6(2052)=342 2052/6=342 
2053 OPTDIV_6(2053)=342 2053/6=342 
2054 OPTDIV_6(2054)=342 2054/6=342 
2055 OPTDIV_6(2055)=342 2055/6=342 
2056 OPTDIV_6(2056)=342 2056/6=342 
2057 OPTDIV_6(2057)=343 2057/6=342 
2058 OPTDIV_6(2058)=343 2058/6=343 
2059 OPTDIV_6(2059)=343 2059/6=343 
2060 OPTDIV_6(2060)=343 2060/6=343 
2061 OPTDIV_6(2061)=343 2061/6=343 
2062 OPTDIV_6(2062)=343 2062/6=343 
2063 OPTDIV_6(2063)=344 2063/6=343 
2064 OPTDIV_6(2064)=344 2064/6=344 
2065 OPTDIV_6(2065)=344 2065/6=344 
2066 OPTDIV_6(2066)=344 2066/6=344 
2067 OPTDIV_6(2067)=344 2067/6=344 
2068 OPTDIV_6(2068)=344 2068/6=344 
2069 OPTDIV_6(2069)=345 2069/6=344 
2070 OPTDIV_6(2070)=345 2070/6=345 
2071 OPTDIV_6(2071)=345 2071/6=345 
2072 OPTDIV_6(2072)=345 2072/6=345 
2073 OPTDIV_6(2073)=345 2073/6=345 
2074 OPTDIV_6(2074)=345 2074/6=345 
2075 OPTDIV_6(2075)=346 2075/6=345 
2076 OPTDIV_6(2076)=346 2076/6=346 
2077 OPTDIV_6(2077)=346 2077/6=346 
2078 OPTDIV_6(2078)=346 2078/6=346 
2079 OPTDIV_6(2079)=346 2079/6=346 
2080 OPTDIV_6(2080)=346 2080/6=346 
2081 OPTDIV_6(2081)=347 2081/6=346 
2082 OPTDIV_6(2082)=347 2082/6=347 
2083 OPTDIV_6(2083)=347 2083/6=347 
2084 OPTDIV_6(2084)=347 2084/6=347 
2085 OPTDIV_6(2085)=347 2085/6=347 
2086 OPTDIV_6(2086)=347 2086/6=347 
2087 OPTDIV_6(2087)=348 2087/6=347 
2088 OPTDIV_6(2088)=348 2088/6=348 
2089 OPTDIV_6(2089)=348 2089/6=348 
2090 OPTDIV_6(2090)=348 2090/6=348 
2091 OPTDIV_6(2091)=348 2091/6=348 
2092 OPTDIV_6(2092)=348 2092/6=348 
2093 OPTDIV_6(2093)=349 2093/6=348 
2094 OPTDIV_6(2094)=349 2094/6=349 
2095 OPTDIV_6(2095)=349 2095/6=349 
2096 OPTDIV_6(2096)=349 2096/6=349 
2097 OPTDIV_6(2097)=349 2097/6=349 
2098 OPTDIV_6(2098)=349 2098/6=349 
2099 OPTDIV_6(2099)=350 2099/6=349 
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925036
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОтлично. Только нам нам надо придумать как это собирать в консоли.

Я делаю *.cmd файлы под MinGW (Win_x64). Но честно говоря
выглядят они позорно. И я их не коммичу. Хотелось-бы скриптовать
сборку приличнее.

Я пользовался сборщиками в основном под java (ant,maven,gradle)
и слабо знаком с тем какие есть для С/C++.

Возможно Илья нас проконсультирует по этому вопросу.

CMake используйте...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925037
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм... действительно есть погрешность.
Это приближенные вычисления. Я сначала тупо скопипастил, а как сглючило - задумался.
Код: plaintext
1.
num*683>>12 это num*683/4096 или num/5,9971
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925046
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное весь смысл в том как мы интерпретируем результат целочисленного деления.
На досуге попробую поделить в столбик в двоичной системе...

Ну.. хотя-бы оно сохраняет монотонность и на том спасибо.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925056
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХотел затестить вместо %6
maytonПо поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления.

Вот из моих сорцов. К сожалению делители только до 10.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#define OPTDIV_2(num)  num >> 1
#define OPTDIV_3(num)  num * 683 >> 11
#define OPTDIV_4(num)  num >> 2
#define OPTDIV_5(num)  num * 205 >> 10
#define OPTDIV_6(num)  num * 683 >> 12
#define OPTDIV_7(num)  num * 1171 >> 13
#define OPTDIV_8(num)  num >> 3
#define OPTDIV_9(num)  num * 911 >> 13
#define OPTDIV_10(num) num * 205 >> 11


Врет чудоформула
OPTDIV_6(2069) = 345
2069/6 = 344,8Ну да. 683/2048 == 0,33349609375 и это несколько отличается от 0.33333333333333333
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925067
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНаверное весь смысл в том как мы интерпретируем результат целочисленного деления.
До 2000 точно считает, дальше сказывается погрешность:
Код: plaintext
1.
6/(6-4096/683) = 2049
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925075
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Адаптировал целочисленный квадратный корень для 64х бит.
По сути была добавлена еще одна итерация начального приближения.
И некоторые константы я перевел в Hex для лучшего понимания.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
uint64_t isqrt64(uint64_t x)
{	
	uint64_t x1;
	uint64_t s, g0, g1;
	if (x <= 1) return x;
	s = 1;
	x1 = x - 1;
        if (x1 > 0x100000000 - 1)     { s+=16; x1>>=32;}
	if (x1 > 0x10000     - 1)     { s+=8;  x1>>=16;}
	if (x1 > 0x100       - 1)     { s+=4;  x1>>=8; }
	if (x1 > 0x10        - 1)     { s+=2;  x1>>=4; }
	if (x1 > 3)                   { s+=1; }
	g0 = 1<<s;
	g1 = (g0 + (x >> s)) >> 1;
	while(g1 < g0)
	{
		g0 = g1;
		g1 = (g0 + (x/g0)) >> 1;
	}
	return g0;
}



Прошу тестить.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925078
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivCMake используйте...
Спасибо. Качнул развернул cmake-3.2.1. То что нужно. Не обещаю что буду посвящать этой теме 100%
времени но по мере сил...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПрошу тестить.
Не взлетел. Считает точно, но медленно.
Посчитал корень всех простых до лярда
Код: plaintext
1.
2.
sqrt((double)x); // 450 мс
isqrt64(x); // 1700 мс


sqrt() ты не обгонишь, т.к. там считает процессор. Команда FSQRT
По хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925134
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - наоборот math::sqrt(double) более медленный. Покажи как ты тестил?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925167
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПо хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется.Дык, выкинуть цикл в конце, сделать одну итерацию. Будет быстрее, но промахиваться вверх.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925173
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного статистики.

Мой жлобский метод PBFA-32bit (power brute force) работал аж 33 минуты.

От 2 до 1 000 000 000 нашёл аж 50 847 534 primes. При этом было задействовано
262 Мб памяти (типа std::vector<int> ) для кеша.

Сегодня подчищу код и опубликую для всех.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925178
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima TПо хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется.Дык, выкинуть цикл в конце, сделать одну итерацию. Будет быстрее, но промахиваться вверх.
Я уже придумал как. Начальное приближение можно брать с предыдущей итерации.
Всё равно они отличаются на [0..1] дробное целое.

А на больших значениях x, квадратный корень почти пологий.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925196
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня - наоборот math::sqrt(double) более медленный. Покажи как ты тестил?
зафиксировал sqrtspeed.cpp позапускай.
У меня такие результаты
Код: plaintext
1.
2.
3.
-858523137 isqrt64 time 1612 msec
-858523137 isqrt32 time 511 msec
-858523137 sqrt time 370 msec


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

У меня - ноут.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$ c++ --version
c++.exe (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ c++ eratosfentest.cpp -O2 -o eratosfentest.exe

$ eratosfentest.exe
start
-858523137 isqrt64 time 2034 msec
-858523137 isqrt32 time 850 msec
-858523137 sqrt time 1067 msec
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925294
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, странно. Не совсем такая картина.
От проца наверно зависит. В ноутах электричество надо за счет чего-то экономить.
У меня тесты на i7-3770К (это хост, на нем виртуалка ХР с 1 ядром)

вот еще тестыскомпилировал в линуксе x64 (тоже виртуалка, там же, 1 ядро)
$ g++ sqrtspeed.cpp -O2 -oerat
Код: plaintext
1.
2.
3.
-858523137 isqrt64 time 1183 msec
-858523137 isqrt32 time 564 msec
-858523137 sqrt time 245 msec



Вот результат x32 EXE (из прошлого теста) на проце i5-660
Код: plaintext
1.
2.
3.
-858523137 isqrt64 time 2400 msec
-858523137 isqrt32 time 640 msec
-858523137 sqrt time 470 msec




Все равно твой sqrt64 не взлетел. Ускоряй. Тест близкий к реальному использованию.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет-же говорю. Я от него откажусь. Будет другой метод. Или подвид Брезенхейма или кусочно-линейный.
Или буду использовать приближение предыдущего шага.

А что ты в нём хочешь соптимизировать для целых чисел? Алгоритмически - уже вроде не куда.
Можно что-то улучшать базируясь на гистограмме входных данных. Разве что.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925354
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА что ты в нём хочешь соптимизировать для целых чисел? Алгоритмически - уже вроде не куда.
Начальное значение у тебя грубо степени двойки охватывает. Точнее посчитать несложно сдвигами и т.п.
https://ru.wikipedia.org/wiki/Квадратный_корень При работе в двоичной системе, следует использовать другую оценку 2^(D/2) (здесь D это число двоичных цифр).
maytonМожно что-то улучшать базируясь на гистограмме входных данных. Разве что.
может это взлетит
maytonЯ уже придумал как. Начальное приближение можно брать с предыдущей итерации.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925361
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал кастинг в твоём тесте. Быстрее стало.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	double*   primeDouble = (double*)   malloc(TEST * sizeof(double));
        .....
	double s2 = 0;
	for(int i = 0; i < TEST; i++) {
		s2 += sqrt(primeDouble[i]);
	}
	printf("%f sqrt time %d msec\n", s2, now_msec() - t);



Код: plaintext
1.
2.
3.
4.
5.
Press any key to continue . . . 
start
-858523137 isqrt64 time 1914 msec
-858523137 isqrt32 time 805 msec
1025663660831.226200 sqrt time 406 msec
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925378
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУбрал кастинг в твоём тесте. Быстрее стало.
Сейчас твои результаты пропорциональны моим. Похоже это твой компилятор "соптимизировал".

У меня в MSVC так вообще не компилируется. Пробовал (float) и (double) - скорость не меняется.
затестил так, скорость таже
Код: plaintext
1.
2.
3.
	float s2 = 0;
	for(int i = 0; i < TEST; i++) {
		s2 += sqrt((float)prime[i]);
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925389
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему ... float на уровне калькуляций кроме экономии разрядной сетки не даёт вообще ничего.

Не пробовал просмотрель ассеблерный выход для float/double на предмет разницы?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925393
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУ меня в MSVC так вообще не компилируется.
Не заметил что у тебя double* primeDouble
затестил так, у меня никаких изменений.

затести так
Код: plaintext
1.
2.
double primed = prime[i];
s2 += sqrt(primed);


преобразование из int в double не может занимать столько же времени как вычисление корня. Явно глюк компилятора.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925404
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе пробовал просмотрель ассеблерный выход для float/double на предмет разницы?
Нет разницы. Отладчиком прошелся, значение передается в Сишный рантайм, а там проверки валидности и fsqrt.
Затестил оба, нет разницы в скорости. float еще и неточно посчитал.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Флоат втопку. И пепел в море утопить.

Я закоммитил 1-й вариант своей тулзы. Работает она медленно. Зато сходу выдаёт итератор primes.

Делай

Код: plaintext
1.
$ svn update .
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925418
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Revision: 10
Author: mayton
Date: Thursday, April 02, 2015 5:23:00 PM
Message:
Added 'PowerBruteForce' algorithm for 32-x bit computation architecture.

----
Added : /trunk/mayton/PBFA
Added : /trunk/mayton/PBFA/src
Added : /trunk/mayton/PBFA/src/pbfa.cpp
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925427
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ уже придумал как. Начальное приближение можно брать с предыдущей итерации.Ну тогда эта функция вообще не нужна, достаточно проверить, пора ли увеличить значение "с предыдущей итерации" на единицу :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925428
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это и есть алгоритм Брезенхейма.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925433
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда он создавался для рисования растровых кривых эллипсов и линий.
Но на курсе Графического моделирования нам рассказывали о параболе.
Следовательно я делаю вывод что есть и такая имплементация.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925436
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ закоммитил 1-й вариант своей тулзы. Работает она медленно. Зато сходу выдаёт итератор primes.
Обновил. Чтоб не тормозила - поставь предел поменьше. 10-100 млн. чтоб максимум в 5 сек укладывалась.
Вектор быстрая штука, тестил с ним и без него - разница 20-30 мс на расчете до миллиарда. Добавлю тоже себе вариант с вектором.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925437
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя конечно смотря что тут подразумевалось под итерацией...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925443
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonЯ закоммитил 1-й вариант своей тулзы. Работает она медленно. Зато сходу выдаёт итератор primes.
Обновил. Чтоб не тормозила - поставь предел поменьше. 10-100 млн. чтоб максимум в 5 сек укладывалась.
Вектор быстрая штука, тестил с ним и без него - разница 20-30 мс на расчете до миллиарда. Добавлю тоже себе вариант с вектором.
Не очень понял о каком пределе ты пишешь.

И ... это опенсорц. Закоммить свои изменения в мой файл. И я вобщем-то не буду против если это не крашит приложение.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925505
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, вы ведь понимаете, что топик не может заканчиваться не на простом числе страниц? ;))
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925519
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нарисовал табличку для тестов и для оценки плотности распределения primes.

Selection from 2 to..Primes detectedAll to primes ratio10025 0.251000 168 0.16810000 1 229 0.1229100000 9 592 0.095921000000 78 498 0.07849810000000 664 579 0.0664579100000000 5 761 455 0.057614551000000000 50 847 534 0.050847534
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925534
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе очень понял о каком пределе ты пишешь.
И ... это опенсорц.
Понятно что могу поправить. Я к тому что какой смысл полминуты считать, все-равно долго. Топик с того и начался что я не мог дождаться пока мой перебор насчитается :)

egorychребята, вы ведь понимаете, что топик не может заканчиваться не на простом числе страниц? ;))
Верно подмечено, теперь цель 11-я, после 13-й туго будет, присоединяйся

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

Я искал оптимальные способы хранения расчитанных primes на диске
чтобы факоризировать сверх-длинные целые.

А ты хотел чтобы Эратосфен до 2 млрд считался за несколько секунд. Но это другая задача.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925538
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ нарисовал табличку для тестов и для оценки плотности распределения primes.
Ты формулу распределения давал n/ln(n)

Чем дальше, тем формула точнее предсказывает. На лярде по формуле 48254942, на 5% не совпало.

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

Но эта задея до сих пор у меня не взлетела именно из-за капризного характера самих
primes. Их невозможно оценить по стат-показателям. Они - постоянно плывут.
Дельта между primes плывёт. Плывёт разрядность. Причём постоянно в сторону
усложнения архитектур.

Пожалуй n/ln(n) это единственное что стационарно. Хоть какая-то точка отсчёта
в этом океане хаоса.

Вобщем старик Ландау хихикает в своём гробу глядя на мои потуги.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925551
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПросто мы решаем разные задачи.

Я искал оптимальные способы хранения расчитанных primes на диске
чтобы факоризировать сверх-длинные целые.
Готовь диски, всё будет. max_prime(uint64_t x) посчитаем. Точнее уже есть заготовка, просто не доделал, поэтому не выложил. Сначала с Сашей отвлекся на Аткина (не зря, получили ориентир по скорости), потом с наведением порядка и заливкой разбирался.

Я привык решать вопросы последовательно. Начали с начала - иду той же последовательностью. Начинал с Эратосфена, тут причесал - выложил. Самое вкусное оставлено на десерт.

Тут еще мысль с оптимизацией шага цикла недоделана.

maytonА ты хотел чтобы Эратосфен до 2 млрд считался за несколько секунд. Но это другая задача.
Он будет считаться за 100 мс. Порвем Аткина. Есть мысли. Потерпи :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925603
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, откомпилировал твой исходник, с ходу не получилось, MSVC 2008 не понял. Пришлось поправить
Код: plaintext
1.
2.
//#include <stdint.h>
typedef unsigned long long uint64_t;



Вывод в консоль это жесть. Завешивает RDP-терминал наглухо. Ладно хоть до миллиона указал, не долго считалось :)

Статистика ожидаемая, пытаюсь с ней боротьсяKey[3] = 7 %, hits = 49999
Key[5] = 5 %, hits = 33331
Key[7] = 4 %, hits = 26660
Key[11] = 3 %, hits = 22846
Key[13] = 3 %, hits = 20754
Key[17] = 2 %, hits = 19148
Key[19] = 2 %, hits = 17999
Key[23] = 2 %, hits = 17039
Key[29] = 2 %, hits = 16271
Key[31] = 2 %, hits = 15669
Key[37] = 2 %, hits = 15154
Key[41] = 2 %, hits = 14692
Key[43] = 2 %, hits = 14290
Key[47] = 2 %, hits = 13935
Key[53] = 2 %, hits = 13584
Key[59] = 1 %, hits = 13230
Key[61] = 1 %, hits = 12904
Key[67] = 1 %, hits = 12630
Key[71] = 1 %, hits = 12321
Key[73] = 1 %, hits = 12052
Key[79] = 1 %, hits = 11823
Key[83] = 1 %, hits = 11533
Key[89] = 1 %, hits = 11283
Key[97] = 1 %, hits = 11004
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925643
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновись снова. Я не знал что ты будешь компилировать с _DEBUG
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925645
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПросто мы решаем разные задачи.
Зафиксировал недоделанную next_prime64(). Она рабочая, но не оптимизированная под последовательности, не x64, считает только до 2^32.
Но как считает:
Код: plaintext
1.
next_prime64(4200000000);


результатprime 4200000037 time 0
Смотри nextprime.cpp

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

Если ты - счастливый обладатель Пингвина - то запускай

Код: plaintext
1.
$ ./pbfa 1000000000 > /dev/null 



Для винды.
Код: plaintext
1.
$ pbfa.exe 1000000000 > NUL



или в файл. А так будет ацкий тормоз.

Но вобщем-то смысл моей работы был в том что числа нужно где-то хранить. Просто count(*) мне неинтересен.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925678
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В debug запустил потому что MS VC его по дефолту ставит. Сейчас вообще в дебаг не компилируется. Мелочи.

Сегодняшние изучения. Микрооптимизация ускоряющая твой код на 20-25%
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	primesCache.push_back(3);
...
	int min_prime = 5;
...
	int step = 4;
	for (int c1 = 5; c1 < max_prime; c1 += step) {
		step = 6 - step;
...


Это пропуск кратных тройке.

Там счетчик итого показывает на 1 больше, но вроде это со счетчиком проблема.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925690
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, Dima T

Добавьте простенький CMakeLists
хотя бы как во вложении (он для pbfa)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925691
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо вобщем-то смысл моей работы был в том что числа нужно где-то хранить. Просто count(*) мне неинтересен.
Допили под свои потребности
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include "next_prime.h" 

int main(int argc, char* argv[])
{
	uint32_t min = 0, max = 0;
	if (argc == 3) {
		min = atoi(argv[1]);
		max = atoi(argv[2]);
	}
	if(max <= min) {
		printf("Usage:\nprimestore min max\n");
	} else {
		uint32_t x = next_prime(min);
		while(x < max) {
			printf("%u\n", x);
			x = next_prime(x);
		}
	}
	any_key();
}


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

На 100_000 сошлось. Значит всё будет ок. Выражение step переделал. Скорость еще не мерял но с шагом больше
двух полюбому быстрее будет.

Код: plaintext
1.
2.
	for (int c1 = min_prime; c1 < max_prime; c1 += step) {
		step^=0x0006;


Fixed.
Код: plaintext
1.
2.
3.
4.
5.
6.
Revision: 15
Author: mayton
Date: Thursday, April 02, 2015 10:17:16 PM
Message:
Improovement speed of main loop. Added non linear step.
----
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925705
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, похоже ты не понимашь главного: next_prime(X) это простейший супер-интерфейс получения простых чисел. Хочешь с нуля считай, хочешь - любое следующее, как следствие - диапазон от .. до, хочешь на простоту проверяй Х == next_prime(X - 1). Разве что предыдущее сложно получить.

а дальше сам решай сохранять их или просто считать сколько получилось.

PS mayton, готовь диски, x64 простых ~4*10^17, или 400`000 терачисел :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925713
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, какие ограничения на память будут действовать для твоего решета x64 ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925714
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСкорость еще не мерял но с шагом больше двух полюбому быстрее будет.
Это тест был незаконченный, хочу унивесальный пропуск сделать (2,3,5,7 ...) Затестить какой оптимальнее.

По замерам времени: возьми мой header.h, там есть now_msec() для замеров в мс, а то в секундах несерьезно. Можешь стандартный clock() использовать, только в линуксе он считает сколько програма реально проработала, всякие sleep() не учитывает, но в данном случае это не критично.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925717
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, какие ограничения на память будут действовать для твоего решета x64 ?
Можно медленно с 64Кб, можно быстро с максимум 750 Мб(все простые x32 в uint32). Оба варианта дадут одинаково быстро посчитают однократно next_prime64(X), разница в скорости будет на расчете диапазона (при малом кэше придется пересчитывать). Для быстрого расчета next_prime64(X) надо в кэше иметь все простые до sqrt(X), в первый заход они расчитываются.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925726
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... перефразирую вопрос. Вот задача. Проверить на простоту это число.

Код: plaintext
1.
271963805968702864258461551790513043662751795453


Факторизовать. Как более общая постанока. Разложить на простые.

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

Я искал оптимальные способы хранения расчитанных primes на диске
чтобы факоризировать сверх-длинные целые.

maytonНу... перефразирую вопрос. Вот задача. Проверить на простоту это число.

Код: plaintext
1.
271963805968702864258461551790513043662751795453


Факторизовать. Как более общая постанока. Разложить на простые.

Я писал об этом в начале топика. Меня увлекает это. Я - have fun от подобных
головоломок.Чтобы "факоризировать сверх-длинные целые", не надо хранить простые числа. Бесполезно это.

А число ваше простое, по крайней пере по вероятностным тестам. Нужно доказанное простое - смотрите на что-нибудь типа https://ru.wikipedia.org/wiki/Тест_Миллера_(теория_чисел) или https://ru.wikipedia.org/wiki/Критерий_Поклингтона
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925799
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня был план - хранить расчитанные primes в бинарных файлах специально оптимизированных по размеру (каждое число укладывалось в несколько бит).
Делись планом. Это одна из недорешанных проблем.
Из моего алгоритма Эратосфен никуда не не исчез, поэтому кэш нужен. Причем нужен быстрый последовательный перебор от 2 до N. Где N макс.простое до 2^32
Самое быстрое это вектор uint32, для расчета любого x64 под него потребуется 750 Мб. Пока использована биткарта, ей хватает 256 Мб, но чтение из нее это побитовый перебор - очень не быстро, секунда на проход. Есть мысль хранить расстояние между соседними, если не окажется дырок больше 128К, то можно будет взять массив uint16 - это 375 Мб
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925813
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton271963805968702864258461551790513043662751795453


Критерий Поклингтона для вашего числа:
N = 271963805968702864258461551790513043662751795453
N-1 = 90233392513315464829662320219386916428363 * 3014004
Берем a=2, проверяем что 2^(N-1) mod N = 1 и gcd(2^3014004-1, N) = 1 - это легко, возьмите gmp (или mpir под windows) и проверьте. Я проверил.
Правда теперь надо еще доказать, что 90233392513315464829662320219386916428363 простое.
Для него можно проделать все то же самое, теперь упремся в доказательство простоты 10378812113332811689632196942648598623.
С этим хуже, для него N-1 = 2*3*11*73*761*83537*403253*1108092371*75833962769 - тут нет простого множителя больше квадратного корня, критерий Поклингтона не получиться использовать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925818
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... перефразирую вопрос. Вот задача. Проверить на простоту это число.

Код: plaintext
1.
271963805968702864258461551790513043662751795453


Факторизовать. Как более общая постанока. Разложить на простые.

Я писал об этом в начале топика. Меня увлекает это. Я - have fun от подобных
головоломок.

Есть библиотеки специальные, GMP например. Результат совместного творчества решения подобных головоломок умными дядьками. ИМХУ мне их точно не перегнать.
271963805968702864258461551790513043662751795453 is probably prime
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <gmp.h>

int main()
{
	mpz_t x;
	mpz_init_set_str(x,"271963805968702864258461551790513043662751795453",10);
	switch(mpz_probab_prime_p(x, 1)) {
		case 2:
			gmp_printf("%Zd is definitely prime\n", x);
			break;
		case 1:
			gmp_printf("%Zd is probably prime\n", x);
			break;
		case 0:
			gmp_printf("%Zd is definitely composite\n", x);
			break;
		default:
			printf("error\n");
	}
	mpz_clear(x);
}


не понял что второй параметр mpz_probab_prime_p() задает
https://gmplib.org/manual/Number-Theoretic-Functions.html

Я так понимаю нет чудо теста который гарантированно скажет что это простое число, 100% гарантия это только перебор с делениями на все sqrt(x) и производные от него. Вобщем все упирается в sqrt(x), в данном случае до 10^24 или перебор ~10^22 простых. Со скоростью 1 млрд. в секунду уйдет всего 317 млрд. лет :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925819
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЧтобы "факоризировать сверх-длинные целые", не надо хранить простые числа. Бесполезно это.

А число ваше простое, по крайней пере по вероятностным тестам. Нужно доказанное простое - смотрите на что-нибудь типа https://ru.wikipedia.org/wiki/Тест_Миллера_(теория_чисел) или https://ru.wikipedia.org/wiki/Критерий_Поклингтона
Я вобщем-то ждал этого. Ну что-ж спасибо за совет.
Думаю что в обучательных целях некоторое хранилище
простых кому-то пригодиться.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925821
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДумаю что в обучательных целях некоторое хранилище простых кому-то пригодиться.
возможно пригодится 17467271
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925825
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ так понимаю нет чудо теста который гарантированно скажет что это простое число, 100% гарантия это только перебор с делениями на все sqrt(x) и производные от него. Вобщем все упирается в sqrt(x), в данном случае до 10^24 или перебор ~10^22 простых. Со скоростью 1 млрд. в секунду уйдет всего 317 млрд. лет :)
Дима! Ну что за пессимизм. А векторность. Мультипоточность. Гриды.

Ну прямо сел на пенёк и упал духом!

Go! Go! Секс. Rock-n-Roll и С++!!
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925829
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима! Ну что за пессимизм. А векторность. Мультипоточность. Гриды.
Не, это число конечно обсчитаем всей планетой за пару месяцев, а второе где считать будем?

Как ни крути - надо ускорять Эратосфена алгоритмическими способами.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925887
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ так понимаю нет чудо теста который гарантированно скажет что это простое числоНу как же нет, надо провести тест Миллера для всех простых не превосходящих 2*log²(N) - примерно до 23858. А, ну еще гипотезу Римана доказать :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925928
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсть мысль хранить расстояние между соседними, если не окажется дырок больше 128К, то можно будет взять массив uint16 - это 375 МбВроде бы отсутствие контрпримеров к гипотезе Лежандра гарантирует отсутствие дырок больше 128К для простых не превосходящих 2^32. Или нет?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925940
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зафиксировал next_prime64(). Теперь она x64.
Код: plaintext
1.
prime 1000000000000037 time 220 msec




Barlone А, ну еще гипотезу Римана доказать :)
Как понимаю из-за этой "мелочи" GMP пишет is probably prime :)
Код: plaintext
1.
1000000000000037 is probably prime
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38925971
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima TЕсть мысль хранить расстояние между соседними, если не окажется дырок больше 128К, то можно будет взять массив uint16 - это 375 МбВроде бы отсутствие контрпримеров к гипотезе Лежандра гарантирует отсутствие дырок больше 128К для простых не превосходящих 2^32. Или нет?
Посчитать элементарно
max delta 336 between 3842610773 and 3842611109
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
		uint32_t t = now_msec();
		uint32_t cnt = 0;
		uint32_t delta = 0;
		uint32_t x = 1;
		while(x && x < TEST) {
			cnt++;
			uint32_t xn = next_prime(x);
			if(xn - x > delta) {
				delta = xn - x;
				printf("max delta %u between %u and %u\n", delta, x, xn);
			}
			x = xn;
		}
		printf("end calc to %u count %u time %u msec\n", TEST, cnt, now_msec() - t);


Результатmax delta 6 between 23 and 29
max delta 8 between 89 and 97
max delta 14 between 113 and 127
max delta 18 between 523 and 541
max delta 20 between 887 and 907
max delta 22 between 1129 and 1151
max delta 34 between 1327 and 1361
max delta 36 between 9551 and 9587
max delta 44 between 15683 and 15727
max delta 52 between 19609 and 19661
max delta 72 between 31397 and 31469
max delta 86 between 155921 and 156007
max delta 96 between 360653 and 360749
max delta 112 between 370261 and 370373
max delta 114 between 492113 and 492227
max delta 118 between 1349533 and 1349651
max delta 132 between 1357201 and 1357333
max delta 148 between 2010733 and 2010881
max delta 154 between 4652353 and 4652507
max delta 180 between 17051707 and 17051887
max delta 210 between 20831323 and 20831533
max delta 220 between 47326693 and 47326913
max delta 222 between 122164747 and 122164969
max delta 234 between 189695659 and 189695893
max delta 248 between 191912783 and 191913031
max delta 250 between 387096133 and 387096383
max delta 282 between 436273009 and 436273291
max delta 288 between 1294268491 and 1294268779
max delta 292 between 1453168141 and 1453168433
max delta 320 between 2300942549 and 2300942869
max delta 336 between 3842610773 and 3842611109
end calc to 4294967295 count 203231690 time 23904 msec

Замечательно. Хватит одного байта. Все разницы четные, поэтому на 2 поделим. Т.е. итого 203 Мб.
31 вариант всего, можно в 5 бит уместить. Т.е. 127 Мб.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926009
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T31 вариант всего, можно в 5 бит уместить. Т.е. 127 Мб.
Обсчитался, немного, не все скопировал с консоли. Еще есть разницы 2 и 4, т.е. вариантов 33, поэтому 6 бит надо. Или 152 Мб.
Это если кто хранением захочет заняться.

Мне больше однобайтовый вариант подходит, хранить delta/2, чтобы быстро писать и быстро читать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926015
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T31 вариант всего, можно в 5 бит уместить. Т.е. 127 Мб.Не, про 31 вариант неправда. Точно есть разности 2 и 4. Ну и после нахождения большой дельты вы уже не показываете меньшие.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926022
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, между 139 и 149 дельта 10.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926033
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНапример, между 139 и 149 дельта 10.
Точно, тест про другое. Это не проверилось т.к. раньше было 127 - 113 = 14
Тогда 1 байт.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926048
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТогда 1 байт.Надо к ним кодирование Хаффмана применить.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926088
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я предполагал использовать знаковое кодирование для кодов Левенштейна или Фибоначчи.
Чтобы плотно ужимать поток "Дельт".
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926106
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima TТогда 1 байт.Надо к ним кодирование Хаффмана применить.
Хаффман - это очень хороший вариант. Но надо будет делать перерасчёт
таблицы для каждого файла-блока primes.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926129
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да там кстати и повторяющиеся последовательности будут, та же "4,2,4,2,4,6,2,6" где-то вылезет. Так что взять и пожать zlib, ничего не изобретая.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926166
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zlib нас ограничивает в произвольном доступе.
К примеру если 2-Гб трафик (потока дельт) был сжат.
Но нам нужно получить актуальность какогото prime
который лежит в середине файла - придётся
пробегать с самого начала.

Кастомные-же форматы позволяют нам строить
индекс по этому сжатому трафику.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926167
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посчитал распределение
end calc to 4294967295 time 9203 msec
DeltaCountДоляНарастающим120.00%0.00%2127366336.27%6.27%4127372846.27%12.53%62284663311.24%23.78%8102021715.02%28.80%10132239506.51%35.30%12171747328.45%43.75%1495354204.69%48.45%1672012983.54%51.99%18131830606.49%58.48%2072957043.59%62.07%2262556103.08%65.14%2495642594.71%69.85%2645805112.25%72.10%2849938332.46%74.56%3090758874.47%79.03%3228918161.42%80.45%3430441011.50%81.95%3650125382.47%84.41%3823725181.17%85.58%4028216181.39%86.97%4242218192.08%89.05%4417398230.86%89.90%4615094880.74%90.65%4826237321.29%91.94%5015043530.74%92.68%5211399490.56%93.24%5419155290.94%94.18%569988550.49%94.67%588618580.42%95.10%6017945700.88%95.98%625690120.28%96.26%645806200.29%96.54%6610762230.53%97.07%684429190.22%97.29%706351460.31%97.60%726508570.32%97.92%743227110.16%98.08%762889520.14%98.23%785545090.27%98.50%802871550.14%98.64%822038530.10%98.74%844257720.21%98.95%861540200.08%99.03%881601340.08%99.10%903258690.16%99.26%921105000.05%99.32%941012970.05%99.37%961794880.09%99.46%98948970.05%99.50%100989750.05%99.55%1021326480.07%99.62%104610420.03%99.65%106539270.03%99.67%108935500.05%99.72%110569220.03%99.75%112448270.02%99.77%114691480.03%99.80%116294880.01%99.82%118290010.01%99.83%120624470.03%99.86%122199640.01%99.87%124201770.01%99.88%126388010.02%99.90%128140210.01%99.91%130193130.01%99.92%132245740.01%99.93%134105980.01%99.94%13693960.00%99.94%138179890.01%99.95%140112410.01%99.96%14267860.00%99.96%144116100.01%99.96%14649930.00%99.97%14854920.00%99.97%150113100.01%99.98%15236100.00%99.98%15444950.00%99.98%15663390.00%99.98%15826220.00%99.98%16030600.00%99.99%16240850.00%99.99%16419610.00%99.99%16617320.00%99.99%16838700.00%99.99%17018560.00%99.99%17212310.00%99.99%17422060.00%99.99%17610270.00%99.99%1789050.00%99.99%18020070.00%100.00%1827830.00%100.00%1846860.00%100.00%18610700.00%100.00%1884250.00%100.00%1906670.00%100.00%1927390.00%100.00%1943550.00%100.00%1963820.00%100.00%1986480.00%100.00%2003150.00%100.00%2022310.00%100.00%2044130.00%100.00%2061730.00%100.00%2081700.00%100.00%2104190.00%100.00%2121240.00%100.00%214990.00%100.00%2161880.00%100.00%218810.00%100.00%2201140.00%100.00%2221100.00%100.00%224660.00%100.00%226560.00%100.00%228870.00%100.00%230570.00%100.00%232320.00%100.00%234890.00%100.00%236320.00%100.00%238340.00%100.00%240560.00%100.00%242220.00%100.00%244180.00%100.00%246280.00%100.00%248170.00%100.00%250150.00%100.00%252250.00%100.00%25460.00%100.00%256100.00%100.00%258160.00%100.00%26080.00%100.00%26280.00%100.00%264100.00%100.00%266100.00%100.00%26850.00%100.00%270100.00%100.00%27220.00%100.00%27420.00%100.00%27670.00%100.00%27810.00%100.00%28040.00%100.00%28260.00%100.00%28430.00%100.00%28620.00%100.00%28850.00%100.00%29050.00%100.00%29230.00%100.00%30410.00%100.00%30610.00%100.00%31010.00%100.00%32010.00%100.00%33620.00%100.00%203231689100.00%

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
		uint32_t t = now_msec();
		uint32_t cnt[337] = {0};
		uint32_t delta = 0;
		uint32_t x = 1;
		while(x && x < TEST) {
			uint32_t xn = next_prime(x);
			if(xn) cnt[xn - x]++;
			x = xn;
		}
		printf("end calc to %u time %u msec\nDelta,Count\n", TEST, now_msec() - t);
		for(int i = 1; i < 337; i++) if(cnt[i]) printf("%d,%d\n",i, cnt[i]);


150 вариантов. Минимум 8 бит. Весь диапазон 168 (336/2). ИМХУ нет смысла заморачиваться на хитрое хранение.
Не совсем понял зачем вы коды добавлять собрались. Если для контроля целостности при хранении, то проще писать блоками, в начале и конце указывать полное значение, проверить не сложно.
Судя по распределению обычный архиватор должен хорошо пожать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926192
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохранил в файл. Не особо жмется
Типразмерисходный203 231 689zip168 118 383rar158 861 104
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926194
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonzlib нас ограничивает в произвольном доступе.
К примеру если 2-Гб трафик (потока дельт) был сжат.
Но нам нужно получить актуальность какогото prime
который лежит в середине файла - придётся
пробегать с самого начала.

Кастомные-же форматы позволяют нам строить
индекс по этому сжатому трафику.Ну чтобы получить prime по дельтам, по любому надо с самого начала начинать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926202
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПосчитал распределение
DeltaCountДоляНарастающим120.00%0.00%
Это что за артефакт? Понятно, 3-2 = 1. А откуда вторая дельта = 1?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926207
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, увидел, начальное значение, 2-1
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926209
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЭто что за артефакт? Понятно, 3-2 = 1. А откуда вторая дельта = 1?
2-1 перебор с единицы начинается. Код там же. Накосячил немного :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926212
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что в распределении явно выделяются кратные 6 - кажется довольно неожиданным.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926216
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохранил бикарту в файл:
Типразмерисходный268 435 456zip141 244 527rar133 962 811
Биткарта лучше жмется. И для произвольного доступа удобнее.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926220
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TБиткарта лучше жмется. И для произвольного доступа удобнее.Я уже предлагал делать биткарту только для некратных 2,3,5. Получается по байту на 30 чисел. Правда доступ чуть сложнее.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926231
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЧто в распределении явно выделяются кратные 6 - кажется довольно неожиданным.
Это не кратные, а разница 6. В принципе объяснимо кратными 3.
для исключения кратных 3 так перебор строится
Код: plaintext
1.
2.
3.
4.
int step = 4;
for(int i = 5; i < N; i += step) {
  step = 6 - step;
...


половина двоек и четверок отсекается
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926232
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonemaytonzlib нас ограничивает в произвольном доступе.
К примеру если 2-Гб трафик (потока дельт) был сжат.
Но нам нужно получить актуальность какогото prime
который лежит в середине файла - придётся
пробегать с самого начала.

Кастомные-же форматы позволяют нам строить
индекс по этому сжатому трафику.Ну чтобы получить prime по дельтам, по любому надо с самого начала начинать.
Всё зависит от того как мы спроектируем.

Варианты:

1) Быстрое получение признака primary. Большой объём дискового хранилища.
2) Среднее время получения признака primary. Компромиссный (регулируемый объём)
дискового хранилища исходя из требования или пожелания по времени ожидания.
3) Медленное получение признака. Компактный объём. Архив.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926240
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima TБиткарта лучше жмется. И для произвольного доступа удобнее.Я уже предлагал делать биткарту только для некратных 2,3,5. Получается по байту на 30 чисел. Правда доступ чуть сложнее.
Думаю оптимальный вариант для хранения и произвольного доступа.
Компактнее будет чем у меня в RARе. У меня только кратные пропущены. 1 байт 16 чисел.

Можно затестить если код будет:
Код: plaintext
1.
2.
set_bit(uint32_t x, uint8_t *bitmap);
get_bit(uint32_t x, uint8_t *bitmap);
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926250
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBarloneЧто в распределении явно выделяются кратные 6 - кажется довольно неожиданным.
Это не кратные, а разница 6. В принципе объяснимо кратными 3.
для исключения кратных 3 так перебор строится
Код: plaintext
1.
2.
3.
4.
int step = 4;
for(int i = 5; i < N; i += step) {
  step = 6 - step;
...


половина двоек и четверок отсекается
Дима. А если мы оставшийся трафик прогоним через какой-нибудь анализ.
Вдруг еще чего-то "кикнуть" можно будет? Но желательно чтоб формула
была простака. Типа вот разность или xor.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926255
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭто не кратные, а разница 6.Понятно, что разности кратные 6. Почему-то мне казалось, что распределение должно убывать более равномерно. А нет, например 30 встречается заметно чаще, чем 28 и т.д.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926256
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 all.

В сборке pbfa-x64 я добавил подсчёт "чисел-близнецов" twin-primes. Возможно пригодится для оценки.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Primes detected      : 5761455
Twin primes          : 440311
Range                : [2..100000000]
Memory cache used    : 65536 K
Square root algorithm: Henry Warren's 'isqrt64'
AVG speed generation : 37170 units/sec
Elapsed time         : 155 sec
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926260
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBarloneпропущено...
Я уже предлагал делать биткарту только для некратных 2,3,5. Получается по байту на 30 чисел. Правда доступ чуть сложнее.
Думаю оптимальный вариант для хранения и произвольного доступа.
Компактнее будет чем у меня в RARе. У меня только кратные пропущены. 1 байт 16 чисел.

Можно затестить если код будет:
Код: plaintext
1.
2.
set_bit(uint32_t x, uint8_t *bitmap);
get_bit(uint32_t x, uint8_t *bitmap);

навскидку что-то такое
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int get_bit(int n) {
  switch(n % 30) {
    case 1:  return 1;
    case 7:  return 2;
    case 11: return 4;
    case 13: return 8;
    case 17: return 16;
    case 19: return 32;
    case 23: return 64;
    case 29: return 128;
    default: return 0; // делится на 2,3 или 5...
  }
}
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926263
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneКритерий Поклингтона для вашего числа:
N = 271963805968702864258461551790513043662751795453
N-1 = 90233392513315464829662320219386916428363 * 3014004
Берем a=2, проверяем что 2^(N-1) mod N = 1 и gcd(2^3014004-1, N) = 1 - это легко, возьмите gmp (или mpir под windows) и проверьте. Я проверил.
Правда теперь надо еще доказать, что 90233392513315464829662320219386916428363 простое.
Для него можно проделать все то же самое, теперь упремся в доказательство простоты 10378812113332811689632196942648598623.
С этим хуже, для него N-1 = 2*3*11*73*761*83537*403253*1108092371*75833962769 - тут нет простого множителя больше квадратного корня, критерий Поклингтона не получиться использовать.
Уже третий раз берусь писать комментарий но всё откладываю.

Спрошу проще.

Данный критерий даёт примерно одинаковую вероятность простоты для всех чисел?
Или одни числа могут быть простыми с большей вероятностью чем другие?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926282
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима. А если мы оставшийся трафик прогоним через какой-нибудь анализ.
Вдруг еще чего-то "кикнуть" можно будет? Но желательно чтоб формула
была простака. Типа вот разность или xor.
Который трафик? на входе (диапазон чисел) или на выходе (простые).

Я как раз этим и занимался. Не закончил. С тройкой все просто, шаг 2,4,2,4...
Дальше сложнее: для (2,3,5) шаги 4,2,4,2,4,6,2,6
тут уже таблица нужна, но тоже достаточно быстро должно быть
Код: plaintext
1.
2.
3.
4.
5.
6.
int step[] = {4,2,4,2,4,6,2,6};
int step_id = 1;
for(int i = 5; i < N; i += step[step_id]) {
  step_id++;
  if(step_id == 8) step_id = 0;
...


это непроверенный код, пока только вычислил шаги, не факт что не ошибся.

(2,3,5,7) - 48 шагов
(2,3,5,7,11) - 480 шагов
(2,3,5,7,11,13) - 5720 шагов

По хорошему надо генератор последовательностей написать и затестить какая выше взлетит.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926292
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonBarloneКритерий Поклингтона для вашего числа:
N = 271963805968702864258461551790513043662751795453
N-1 = 90233392513315464829662320219386916428363 * 3014004
Берем a=2, проверяем что 2^(N-1) mod N = 1 и gcd(2^3014004-1, N) = 1 - это легко, возьмите gmp (или mpir под windows) и проверьте. Я проверил.
Правда теперь надо еще доказать, что 90233392513315464829662320219386916428363 простое.
Для него можно проделать все то же самое, теперь упремся в доказательство простоты 10378812113332811689632196942648598623.
С этим хуже, для него N-1 = 2*3*11*73*761*83537*403253*1108092371*75833962769 - тут нет простого множителя больше квадратного корня, критерий Поклингтона не получиться использовать.
Уже третий раз берусь писать комментарий но всё откладываю.

Спрошу проще.

Данный критерий даёт примерно одинаковую вероятность простоты для всех чисел?
Или одни числа могут быть простыми с большей вероятностью чем другие?Это как бы детерменированный тест. Про какую вероятность речь? Что для простого N и некоторого а (которое в примере 2) gcd будет не 1? Не знаю, на самом деле это вообще маловероятно.
Да, этот критерий используют не для проверки простоты, а для её доказательства. Разница понятна? Для проверки простоты используют вероятностный тест Миллера-Рабина - он говорит "число точно не простое / возможно простое". А критерий Поклингтона - "число точно простое / возможно не простое".
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926336
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barloneнавскидку что-то такое
Затестил, работает
Код: 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.
#include "../next_prime.h" 

uint8_t get_mask(uint32_t n) {
  switch(n % 30) {
    case 1:  return 1;
    case 7:  return 2;
    case 11: return 4;
    case 13: return 8;
    case 17: return 16;
    case 19: return 32;
    case 23: return 64;
    case 29: return 128;
    default: return 0; // делится на 2,3 или 5...
  }
}

#define TEST 0xFFFFFFFF

int main(int argc, char* argv[])
{
	int size = TEST / 30 + 1;
	uint8_t* bitmap = (uint8_t*)calloc(size, 1);
	uint32_t x = 7;
	while(x && x < TEST) {
		bitmap[x/30] |= get_mask(x);
		x = next_prime(x);
	}
	FILE* f = fopen("bitmap30.bin", "wb");
	fwrite(bitmap, size, 1, f);
	fclose(f);

	printf("bitmap ready size = %d\n", size);
	x = 7;
	for(uint32_t i = 0; i < TEST; i++) {
		if((bitmap[i/30] & get_mask(i))) {
			if(i != x) {printf("error %u != %u\n", i, x);break;}
			x = next_prime(x);
		}
	}
	printf("check end\n");

	any_key();
}


Типразмерисходная143 165 577zip105 477 171rar106 706 171
ИМХУ это пока самый оптимальный вариант для хранения.
switch() только на массив заменить, чтобы так было mask[n%30]
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926373
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЭто как бы детерменированный тест. Про какую вероятность речь? Что для простого N и некоторого а (которое в примере 2) gcd будет не 1? Не знаю, на самом деле это вообще маловероятно.
Да, этот критерий используют не для проверки простоты, а для её доказательства. Разница понятна? Для проверки простоты используют вероятностный тест Миллера-Рабина - он говорит "число точно не простое / возможно простое". А критерий Поклингтона - "число точно простое / возможно не простое".
Спасибо. Всё это надо обдумать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926381
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТипразмерисходная143 165 577zip105 477 171rar106 706 171
ИМХУ это пока самый оптимальный вариант для хранения.
switch() только на массив заменить, чтобы так было mask[n%30]Надо уже куда-нибудь выложить файл.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926466
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНадо уже куда-нибудь выложить файл.
Смысл один файл вкладывать? Он дольше качаться будет чем генериться.
Причесал немного. Сделал x64. Выложил исходник https://sourceforge.net/projects/primegen/
только там _strtoui64(), как понял только в MSVC скомпилируется. Не искал еще аналог для линукса.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926495
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tтолько там _strtoui64(), как понял только в MSVC скомпилируется. Не искал еще аналог для линукса. strtoull ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926536
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima Tтолько там _strtoui64(), как понял только в MSVC скомпилируется. Не искал еще аналог для линукса. strtoull ?
Поправил. Компилируется в линуксе. Залил.
https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/bitmap30.cpp
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926634
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взлетает идея с оптимизацией шагов цикла.
Результатыtest eratosfen2() skip 2 from 1 to 1000M
eratosfen2() 1524M(499M) steps
count 50847534 primes time 4786 msec

test eratosfen3() skip 2,3 from 1 to 1000M
eratosfen3() 1191M(333M) steps
count 50847534 primes time 4277 msec

test eratosfen5() skip 2,3,5 from 1 to 1000M
eratosfen5() 1024M(266M) steps
count 50847534 primes time 4095 msec
это замер трех вариантов перебора до 10^9 с пропусками кратно 2, затем 2,3, затем 2,3,5
Синим: количество млн. итераций всего(в т.ч. оптимизируемого цикла)
Красным: общее время расчета.
Цикл такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
		// для определения номера текущего шага
		static uint32_t offset[] = {9,0,9,9,9,9,9,1,9,9,9,2,9,3,9,9,9,4,9,5,9,9,9,6,9,9,9,9,9,7};
		// порядок шагов
		static uint32_t step5[] = {6,4,2,4,2,4,6,2};
		uint32_t step_id = offset[max_prime % 30]; // max_prime последнее найденное простое
		for(uint32_t i = max_prime + step5[step_id]; i < limit; i += step5[step_id]) {
			step_id++;
			step_id &= 7; //if(step_id == 8) step_id = 0;
			cnt++;
			cnt2++;
...
		}
	}
	free(bitmap);
	printf("eratosfen5() %dM(%dM) steps\n", (uint32_t)(cnt / 1000000), (uint32_t)(cnt2 / 1000000));


Целиком тут https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/eratosfentest.cpp

Можно писать генератор, только мне массив offset[] не нравится. Как бы его укоротить. Попробую на switch() заменить.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926648
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут решил посчитать сколько primes мы выкурим по 64-битной архитектуре.

Максимальное целое unit64 = 0xFFFF FFFF FFFF FFFF = 18 446 744 073 709 551 615



415 828 534 307 635 091

или 415 "пета"-чисел.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926651
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плотность primes на последних интервалах стремиться к 2%.
Если работать по Эратосфену - то по сути гоняем воздух.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926658
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ нарисовал табличку для тестов и для оценки плотности распределения primes.

Selection from 2 to..Primes detectedAll to primes ratio10025 0.251000 168 0.16810000 1 229 0.1229100000 9 592 0.095921000000 78 498 0.07849810000000 664 579 0.0664579100000000 5 761 455 0.057614551000000000 50 847 534 0.05084753418 446 744 073 709 551 615415 828 534 307 635 091(approx)0.0225421100
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926668
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0.0508 всего в 2.258 раза больше 0.0225. Решаемо. Оптимизатор цикла поглубже сделать. Тестю switch(), есть мысли по 17471110 ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926678
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... оказывается в Java (BigInteger) есть имплементация некой проверки на простоту.
Метод isProbablePrime() который в свою очередь сложно зависим либо от теста passesMillerRabin(),
(насколько я понял имеется в виду этот метод) и либо от совокупности решений
passesMillerRabin(..) && passesLucasLehmer(..). Последний - скорее всего https://ru.wikipedia.org/wiki/Тест_Люка_—_Лемера

Забавно что isProbablePrime в методе МиллераРабина оставляет за собой право вызывать функцию SecureRandom()
очевидно для получения некой энтропии. Интересно насколько это влияет на дерерминизм самого метода
isProbablePrime.

Мда. Коллеги. Я многих веще признаться не знал. Надо подумать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926679
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗабавно что isProbablePrime в методе МиллераРабина оставляет за собой право вызывать функцию SecureRandom()
очевидно для получения некой энтропии. Интересно насколько это влияет на дерерминизм самого метода
isProbablePrime.
Ну, учитывая основное назначение подобных функций, детерминизм был бы там скорее минус чем плюс ))
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926684
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще метод isProbablePrime (в стеке вызовов внутренних методов) содержит искусственный
ограничитель раундов проверки Рабина. Машинально делая code-review глазами я застрял на нём сейчас.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if (sizeInBits < 256) {
            rounds = 27;
        } else if (sizeInBits < 512) {
            rounds = 15;
        } else if (sizeInBits < 768) {
            rounds = 8;
        } else if (sizeInBits < 1024) {
            rounds = 4;
        } else {
            rounds = 2;
        }


Обратите внимание что чем больше разрядная сетка основного числа которое мы проверяем тем
меньше циклов Рабина идёт на выход. По всей видимости это искусственное ограничение
на сам метод чтобы не грузить пользователя долгим откликом.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926688
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗабавно что isProbablePrime в методе МиллераРабина оставляет за собой право
вызывать функцию SecureRandom() очевидно для получения некой энтропии.
А может они в качестве финальной проверки используют генерацию RSA-ключа и
шифрование-дешифрование блока.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926689
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BigInteger не содержит зависимостей от крипто-библиотек. Скорее наоборот.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926690
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА может
Пардон, брякнул не прочитав ссылку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926693
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonBigInteger не содержит зависимостей от крипто-библиотек.
Для проверки на простоту не надо генерировать криптостойкий RSA ключ, поэтому
криптобиблиотеки и не нужны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926728
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Коллеги. Я потёр весь оффтопик касающийся SVN клиента и настроек. В дальнейшем давайте либо личным сообщением либо в отдельный топик
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926823
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпамяти в x32 не хватает чтобы результаты обоих хранитьСравните контрольные суммы, а не сами результаты.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38926961
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима. Я на выходных попробую запилить Рабина-Миллера. И посмотреть
его погрешность в определении простоты.

Особо меня заинтересовало как можно устранить источник энтропии
внутри функции. Иначе это путает все карты.

offОказывается Рабин - это не только фамилия. Это еще и титул учёного-толкователя ("раввин").
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927133
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима. Я на выходных попробую запилить Рабина-Миллера. И посмотреть
его погрешность в определении простоты.
Всё уже украдено до нас - https://oeis.org/A001262 https://oeis.org/A020229 https://oeis.org/A074773
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927144
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://web.mit.edu/primes/materials/2014/conf/5-1-Narayanan.pdf

Модератор: Не ленись давать комментарии к ссылкам, пожалуйста
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927176
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone, почитал ссылки. А на каком языке написан код в разделе 'PROG' ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38927268
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonBarlone, почитал ссылки. А на каком языке написан код в разделе 'PROG' ?
https://en.wikipedia.org/wiki/PARI/GP
...
Рейтинг: 0 / 0
Генератор простых чисел (до 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
Генератор простых чисел (до 10^9 за 5 сек)
    #38929775
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,
Из математических пакетов как по мне лучший -
Mathematica http://rutracker.org/forum/viewtopic.php?t=4337743
Это целая вселенная ... /попасть в нее легко .../

PS: Кроме того на просторах inet имеется несколько несколько математических пакетов с
исходниками /десятки тысяч математических алгоритмов .../.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929781
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вывихнул мозг асинхронностью очередной раз. Пытаюсь шаги цикла к next_prime() приделать. Пока результаты от 1 до 10^9 такие
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Test(0M...1000M): next_prime() skip 2
count 50847534 primes. time 2253 msec speed 22568K/sec OK

Test(0M...1000M): next_prime2() skip 2
count 50847534 primes. time 2874 msec speed 17692K/sec OK

Test(0M...1000M): next_prime3() skip 2,3
count 50847534 primes. time 2123 msec speed 23950K/sec OK


next_prime() - достраивает решето с 1, пропускает четные, эталонный показатель.
next_prime2() - не тратит лишнюю память, только заполняет кусок решета (64 кб), это вышеупомянутый next_prime64() без оптимизации, только в x32 варианте. Тормозит из-за высчитывания смещений перед началом заполнения решета.
next_prime3() - тоже самое что и 2, только с пропуском кратных 2 и 3. Причем в обоих циклах (вычеркивания и чтения). Чуть быстрее первого. Надеялся на большее.

Цикл вычеркивания дальше не оптимизировать, т.к. там будет куча умножений и из-за них тормозит больше чем без них. Вычеркивание без 2,3 сделал сдвигами. Остается оптимизировать только цикл считывания результатов.
С ним все плохо, таблица шагов не ложится сюда один-в-один из моего синхронного Эратосфена. Запутался в смещениях. Доделаю, но не думаю что по времени ниже 1,5 сек. опущусь. Надо еще какие-то идеи по оптимизации алгоритма.

PS После из самого быстрого next_primeX() сделаю next_prime64() и найдем MAX(next_prime64()), а пока надо 0.5 сек Аткина как-то обогнать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929791
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 Dima T не обижайся.
То чего ты хочешь достичь - "Лично мне охота Аткина обогнать, посчитать за <0,5 сек диапазон до 10^9."
Как по мне, то лучше "ляг поспи и все пройдет" /хотя тебе виднее .../
Не обижаюсь, обгоню :) У того же автора Эратосфен в три раза быстрее моего (0,6 сек). Он, как ты пишешь, 15 лет занимался проблемой, а я всего вторую неделю. Все еще впереди.

PS Туда специально не заглядываю, не люблю списывать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929806
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОн, как ты пишешь, 15 лет занимался проблемой, а я всего вторую неделю. Все еще впереди. Да не я это писал ...
Всего лишь после ссылки привел выдержку из комментов к статье ...

PS: Ну тогда подключаем thread, SSE / http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions /, ... ...
С Богом /удачи ни когда не желаю - для не верующих/.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929831
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012...
...
Реализация этого метода на C++
http://gforge.inria.fr/projects/ecm/
svn checkout svn://scm.gforge.inria.fr/svnroot/ecm/trunk

Посмотрел, почитал readme. Ну да, есть там и ecm, и P-1, и P+1. Но у меня оригинальный алгоритм, в группе решений уравнения Пелля. По крайней мере я его описания раньше нигде не встречал. Перекрывает P-1 и P+1. Понятно, что на практике малоинтересен по сравнению с ECM, но проще в реализации.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929964
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonБарлон. Я выпал в осадок. Ты мне сначала лекции прочитай по кольцам вычетов а потом
уж факторизация....Вычеты по простому модулю... Ну можно немножко упрощенно считать, что это остатки от деления на это простое число. Их можно складывать и умножать, так же беря остаток от деления результата.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929967
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P-1 метод основывается на том, что при операциях умножения остатков по составному модулю эквивалентны параллельным операциям по соответствующим простым модулям
(например, 7*8%15 = 11, при этом (7%3)*(8%3)%3=2 и (7%5)*(8%5)%5=1 ну и 11%3=2 и 11%5=1), это кажется следствие китайской теоремы об остатках .
А также на малой теореме Ферма :
Код: plaintext
Если p — простое число и a — целое число, не делящееся на p, то a^(p-1) % p = 1
Если (p-1) произведение q1*q2, то a^(p-1) = (a^q1)^q2. А единица в любой степени остается единицей.
Так что взяв произвольное не кратное p число a, и последовательно возводя его в степени 2,3,4,5,6... по модулю p то есть ((a^2 % p)^3 %p)^4 % p... рано или поздно получим 1.
Если теперь взять составное число N = p*q и a: gcd(a,N)=1, и начать a возводить в степени по модулю N, то есть большая вероятность, что в какой-то момент результат окажется равным единице по модулю одного из сомножителей и неравным единице по модулю другого сомножителя. Тогда gcd(a^K %N - 1, N) - один из делителей N. Вот например gcd(3^4 % 35 - 1, 35) = 5.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38929979
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так всё-таки задача обсуждения обогнать реализацию предложенную соавтором Аткина ?

PS
кстати, кто-нибудь узнал как тот сайт факторизует 60значные числа в течении одной секунды ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930043
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал вышеупомянутый сайт http://primesieve.org/ там форсированный Эратосфен в основе. Причем форсировали его капитально.
Затестил до 10^9: 0,06 сек. (4 ядра), 0,12 сек. (1 ядро)
Можно смело заявлять: Эратосфен победил Аткина.

Optimizations used in primesieve Uses a bit array with 8 flags each 30 numbers for sieving
Pre-sieves multiples of small primes <= 19
Compresses the sieving primes in order to improve cache efficiency [5]
Starts crossing off multiples at the square
Uses a modolo 210 wheel that skips multiples of 2, 3, 5 and 7
Uses specialized algorithms for small, medium and big sieving primes
Uses a custom memory pool (for big sieving primes)
Processes two sieving primes per loop iteration to increase instruction-level parallelism
Parallelized (multi-threaded) using OpenMP

По существу направления оптимизации такие:
- обсчет окнами
- биткарта без кратных 2,3,5 (30 чисел на байт)
- оптимизация шагов цикла с пропуском кратных до 19
- оптимизация умножений и корней
- распараллеливание расчета

У меня все те же направления (два последних обдумываю), осталось суметь нормально реализовать их в коде.

А моя поделка выше не взлетает :(
Добавил пропуски кратных 2,3,5,7,11,13 - стало чуть медленнее работать. Итераций меньше, но доп.вычисления съедают всю экономию. Вариант с пропуском 2,3 пока самый быстрый. Буду его дотачивать. После распараллеливания на 4 ядра разгоню до <0,5 сек.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима. Меня интересует продолжение расчёта за границей Эратосфена.
У тебя есть рабочий макет?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930121
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима. Меня интересует продолжение расчёта за границей Эратосфена.
У тебя есть рабочий макет?
Понятней напиши что хочешь получить.
Для x64 мой next_prime64() считает почти до 2^64. Споткнется из-за разрядности в самом конце интервала, точнее после квадрата максимального простого 2^32, т.к. там там надо будет next_prime(2^32) посчитать, а это x32 пока. Как это вылечу посчитаю next_prime64(2^64 - 10000).

Он немного неоптимизирован по скорости и расходу памяти, но как оказалось скорость особо некуда разгонять, а памяти ему надо максимум 256 мб.

По сути сейчас его и ускоряю, только в виде x32 версии. А x32 только потому что компилятор у меня такой, x64 просто тормозит из-за эмуляции работы с x64

Теоретически дальше можно в x128 переделать. Надо только чтобы арифметика x128 считалась (+-*/%).
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930255
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T ,
Не совсем понимаю, какой смысл вычислять простые числа на процессоре, если это замечательно делает видеокарта?
Запускаем:

D:\aProjects\PrimeSearch\x64\Release>PrimeSearch.exe -nvidia

Prime search: 4214924346 .. 4294924346
Accelerator: NVIDIA GeForce GTX 980
Found : 3608107
First prime : 4214924369
Last prime : 4294924289
=============
Exec time : 24.6 seconds.

:)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930305
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValExec time : 24.6 seconds.
Всего лишь в 100 раз медленнее одного ядра моего проца :)
Код: plaintext
1.
2.
3.
Test(4214M...4294M): next_prime64() 4214924346 .. 4294924346
count 3608107 primes. time 220 msec speed 16400K/sec 
first 4214924369 last 4294924289


Можешь затестить у себя
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include "next_prime.h" 

		test_start("next_prime64() 4214924346 .. 4294924346", 4214924346, 4294924346);
		uint64_t first = next_prime64(4214924346);
		uint64_t last; 
		uint64_t x = first;
		while(x < 4294924346) {
			store_count(x);
			last = x;
			x = next_prime64(x);
		}
		test_end();
		printf("first %llu last %llu\n", first, last);


Остальное тут https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930352
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValFirst prime : 4214924369
Last prime : 4294924289
=============
Exec time : 24.6 seconds.

Лажа какая-то!

Он что 24 секунды расчитывал 4 294 924 289 - 4 214 924 369 = интервал 79 999 920 ?

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

Ну и о качестве моего "программирования":

D:\aProjects\PrimeSearch\x64\Release>PrimeSearch.exe -cpu

Prime search: 4214924346 .. 4294924346
Accelerator: CPU
Found : 3608107
First prime : 4214924369
Last prime : 4294924289
=============
Exec time : 466 seconds.

А поскольку "качество" программирования у меня одинаковое и для CPU и для ГПУ, то видно, что на ГПУ всё выполняется в 20 раз быстрее чем на ЦПУ. :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930418
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonИли мы здесь все присутствующие неверно истолковали этот отчётик?

Всё верно. Что программа выдала, то я сюда и вставил. Смысл программы в проверке и сравнении скорости выполнения одного и того же на различных видеокартах:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
D:\aProjects\PrimeSearch\x64\Release>PrimeSearch.exe
Usage:
PrimeSearch.exe -cpu
PrimeSearch.exe -ati
PrimeSearch.exe -nvidia
PrimeSearch.exe -intel
PrimeSearch.exe -show_devices
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930444
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValА поскольку "качество" программирования у меня одинаковое и для CPU и для ГПУ, то видно, что на ГПУ всё выполняется в 20 раз быстрее чем на ЦПУ. :)
Мне-то это что дает? Я качество алгоритма улучшаю. Количество (время выполнения) это просто мера сравнения на одном и том же железе.

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

Но я прошу обсудить эти нюансы отдельным топиком.
У нас уже сформировалось комьюнити вокруг C/C++
для классической архитектуры, и распыляться на видеокарты нет
особого смысла.

Тем более что векторы интересов у нас идут намного дальше
чем просто хардварная оптимизация. Мы еще не исчерпали
алгоритмы и проверки гипотез математики.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930509
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TМне-то это что дает? Я качество алгоритма улучшаю.
Это какбэ даёт понимание, что сколько не улучшай качество алгоритма на одном процессоре, 2048 процессоров Вам не обогнать.
Разумеется, если эти процессоры не у такого "программиста" как я :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930516
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValDima TМне-то это что дает? Я качество алгоритма улучшаю.
Это какбэ даёт понимание, что сколько не улучшай качество алгоритма на одном процессоре, 2048 процессоров Вам не обогнать.
Разумеется, если эти процессоры не у такого "программиста" как я :)
Эта оценка должна быть пересмотрена с учётом возможности параллелизма и закона Амадала.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930530
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValЭто какбэ даёт понимание, что сколько не улучшай качество алгоритма на одном процессоре, 2048 процессоров Вам не обогнать.
Разумеется, если эти процессоры не у такого "программиста" как я :)
Наивный. Если бы все алгоритмы легко паралеллились, то в ЦПУ давно было бы по несколько тысяч ядер, интел давно предлагал 800 ядерный проц выпустить, прототипы показывал, только он нафиг не нужен, т.к. 4 ядра занять нечем.
Почитай про Закон Амдала , поймешь что сначала надо мозг сломать об распараллеливание алгоритма, а потом уже его в ГПУ отправлять
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930610
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНаивный. Если бы все алгоритмы легко паралеллились, то в ЦПУ давно было бы по несколько тысяч ядер, интел давно предлагал 800 ядерный проц выпустить, прототипы показывал, только он нафиг не нужен, т.к. 4 ядра занять нечем.

Ничей мозг ломать не надо. Всё распараллелено до нас. Ещё на Cray и IBM.
Да и у нас в России(в институте Стеклова) давно есть параллельные библиотеки для ГПУ.. но нам они их не дадут... чтобы врагам не достались. :)

Intel обещал 80 ядерный проц. И не выпустил потому, что скорость доступа к памяти как была 20 лет назад, так и осталась.
Поэтому и добавляет в процессоры немыслимые кэши 2-го, 3-го, 4-го уровня.
* про Амдала я слышал.
** за прошедший год появилась хорошая бесплатная библиотека параллельных алгоритмов для С++ AMP.
намедни ParallelRadixSort на массиве в 400 MB. Зверь! Глазом не успеваешь моргнуть.
*****
А Ваша программа шустренько работает... впечатляет. :) (может в выходные и свою маленько оптимизирую).
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930679
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValНичей мозг ломать не надо. Всё распараллелено до нас. Ещё на Cray и IBM.

* про Амдала я слышал .

SerVal. Я читаю в твоём посту два взаимоисключающих параграфа и думаю
что тебе еще многому надо научиться и много чудесных чудес предстоит узнать.


Классик
О сколько нам открытий чудных
Готовят просвещенья дух
И опыт, сын ошибок трудных,
И гений, парадоксов друг,
И случай, бог изобретатель...


Good luck!
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38930689
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonSerVal, тема CUDA/NVidia очень интересна и многогранна.
Но я прошу обсудить эти нюансы отдельным топиком.
У нас уже сформировалось комьюнити вокруг C/C++ ...

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

Подытоживая.

Сама идея хранения длинных простых чисел для меня уже не особо интересна.
Попробую изучить те алгоритмы которые были приведены в топике или хотя-бы
понимать проблематику и терминологию которая уже звучала.

Пишите и коммитьте если что.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932204
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итоги не очень. Слил все идеи воедино, скорость особо не выросла, получилось только память поэкономить.
Переименовал немного, теперь:
next_prime() это последняя x64 версия
next_prime32() это старый next_prime()
next_prime64() тот же какой был, прототип текущего next_prime()

Что получилось оптимизировать:
1. Память: под решето 64кб и от 16 кб под кэш для инициализации. 16 кб хватает до ~10^10, максимум 196 Мб для 10^19
2. Пропуск кратных 2,3 немного ускорил, дальше наращивать - бесполезно, тормоза только возрастают.
3. Возможна многопоточность, только надо изначально инициализировать кэш next_prime(MAX) (позже попробую обогнать Аткина на 4 ядрах)
Результаты на линукс x64 (g++ nextprime.cpp -O2)Test(0M...1000M): next_prime32()
count 50847534 primes. time 1974 msec speed 25758K/sec OK

Test(0M...1000M): next_prime64()
count 50847534 primes. time 2045 msec speed 24864K/sec OK

Test(0M...1000M): next_prime()
count 50847534 primes. time 1741 msec speed 29205K/sec OK

Test(4000M...6000M): next_prime()
count 89583557 primes. time 3540 msec speed 25306K/sec OK

Test(4000M...6000M): next_prime64()
count 89583557 primes. time 4314 msec speed 20765K/sec OK
При компиляции под x32 тормоза в 1,5 раза для x64тоже самое MSVC2008 x32Test(0M...1000M): next_prime32()
count 50847534 primes. time 2143 msec speed 23727K/sec OK

Test(0M...1000M): next_prime64()
count 50847534 primes. time 2764 msec speed 18396K/sec OK

Test(0M...1000M): next_prime()
count 50847534 primes. time 2804 msec speed 18133K/sec OK

Test(4000M...6000M): next_prime()
count 89583557 primes. time 5768 msec speed 15531K/sec OK

Test(4000M...6000M): next_prime64()
count 89583557 primes. time 5778 msec speed 15504K/sec OK


Максимума разрядности x64 достигнуть не удалось. Чуть раньше останавливается из-за превышения разрядности во время заполнения решета.
Максимум получил 18 446 744 030 759 878 627 до 2^64 не дошел на 42 949 750 784.

Исходники next_prime.h зафиксировал. Там же nextprime.cpp тесты

PS Потестил корректность сколько смог, рандомно результаты между собой посравнивал. Работает. Но primesieve говорит что в диапазоне 4...6 млрд. на одно число меньше. Поразбираюсь позже.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932223
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tprimesieve говорит что в диапазоне 4...6 млрд. на одно число меньше. Поразбираюсь позже.
Нашел причину. Ошибка в тестах была. Поправил. Проверил до 10^10 количество совпадает.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тут кастинг обязательно указывать?

Код: plaintext
1.
if (x > (uint64_t)18000000000000000000) {... 
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932337
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА тут кастинг обязательно указывать?

Код: plaintext
1.
if (x > (uint64_t)18000000000000000000) {... 


Не знаю как правильно написать. MSVC нормально понимает без (uint64_t).
g++ варнинги писал, добавил (uint64_t) - ничего не поменялось, затестил - понимает правильно, оставил так.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932813
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал пример многопоточного использования multi_prime.cpp

В 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :)
Код: plaintext
1.
2.
Test(0M...1000M): next_prime() multithread
count 50847534 primes. time 472 msec speed 107727K/sec OK



PS Сделал потоки на WinAPI, под линуксом не соберется.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932829
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :)
Код: plaintext
1.
2.
Test(0M...1000M): next_prime() multithread
count 50847534 primes. time 472 msec speed 107727K/sec OK

Поздравляю!
Какие ближайшие планы?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38932852
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСделал пример многопоточного использования multi_prime.cpp

В 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :)
Код: plaintext
1.
2.
Test(0M...1000M): next_prime() multithread
count 50847534 primes. time 472 msec speed 107727K/sec OK



PS Сделал потоки на WinAPI, под линуксом не соберется.
Макрос есть. __WIN32 или что-то в этом роде.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38933731
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навел порядок, причесал исходники.
Сделал два файла с x32 и x64 версиями next_prime() внутри:
next_prime32.h
next_prime64.h

От x64 в реальности польза сомнительная, все равно тормозит на больших числах, и на малых при x32 компиляторе, поэтому сделал отдельно x32 вариант, для практических задач ее хватит (по крайней мере мне).
Настроил x32 на минимальный расход памяти 22.5 кб на расчет любого до 2^32.

Исходники тут

PS mayton, исправь, пожалуйста, ссылку в первом посте на действительно последний вариант.
PPS egorych, ты был прав 17466144 :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38933809
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пощупал gmp. Интересно а как проверить некорректную конверсию строка-число? Пока не понял.

Код: 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.
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <math.h>

#include "gmp.h"

using namespace std;


int main(int argc, char* argv[], char* env[]) {

	if (argc == 1) {
		printf("\nGreathest Common Divisor 1.0 (gcd) (c) sql.ru\n");
		printf("Usage:\n\n");
		printf(" gcd [n1 [n2]]\n\n");
		return 0;
	} else {
		mpz_t n1;
		mpz_t n2;
		if (argc == 3) {
			mpz_init(n1);
			mpz_init(n2);
			

			mpz_set_str (n1, argv[1], 10);
			gmp_printf ("n1 = %Zd\n", n1);

			mpz_set_str (n2, argv[2], 10);
			gmp_printf ("n2 = %Zd\n", n2);

			mpz_clear(n1);
			mpz_clear(n2);

		}
	}

}



В доке пишут. https://gmplib.org/manual/Assigning-Integers.html
— Function: int mpz_set_str (mpz_t rop, const char *str, int base)

Set the value of rop from str, a null-terminated C string in base base. White space is allowed in the string, and is simply ignored.

The base may vary from 2 to 62, or if base is 0, then the leading characters are used: 0x and 0X for hexadecimal, 0b and 0B for binary, 0 for octal, or decimal otherwise.

For bases up to 36, case is ignored; upper-case and lower-case letters have the same value. For bases 37 to 62, upper-case letter represent the usual 10..35 while lower-case letter represent 36..61.

This function returns 0 if the entire string is a valid number in base base. Otherwise it returns -1.

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

Ну... я не совсем понял что на что я должен исправить.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38933838
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПолучается что я не могу различать присвоение "0" и неуспех.
Затести
Код: plaintext
1.
2.
3.
	printf("%d ", mpz_set_str(x,"mayton",10));
	printf("%d ", mpz_set_str(x,"0",10));
	printf("%d ", mpz_set_str(x,"1",10));


результат-1 0 0
Там есть mpz_init_set_str() - это совмещенные mpz_init() и mpz_set_str()


maytonНу... я не совсем понял что на что я должен исправить.
так поправьэту ссылку убрать, т.к. версия в итоге оказалась хоть и рабочей, но промежуточной, да и в sourceforge она тоже есть.
Dima T http://www.sql.ru/forum/1149455/generator-prostyh-chisel-do-10-9-za-5-sek?mid=17451792#17451792

а так написать
next_prime32.h
next_prime64.h
Тесты и примеры использования
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38933984
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем я решил взять некую паузу и вернуться к истокам. С Эвклиду. Этот старый бородач
создал алгоритм которому нет аналогов в мире в соотношении простоты и полезного эффекта.
Я имею в виду НОД (в англоязычном варианте GCD - Greatest Common Divisor).

Описывать шаги не буду. Вики описала много. Добавлю свои наблюдения + разный
материал из разных источников.

Некоторые свойства.

Если

Код: plaintext
1.
gcd(a,b) = 1

то числа a и b называются взаимно простые. Например 3 и 5.
Взаимно простые образуют несократимую дробь a/b.

Для трех аргументов утверждение взаимной простоты не влечёт попарную простоту.

Если gcd(a,b,c) = 1 то вовсе не факт что gcd(a,b).... e.t.c. должно быть равно 1.

Далее

Код: plaintext
1.
gcd(a,a)=a

- число является делителем по отношению к группе таких-же

И наконец свёртка:

Код: plaintext
1.
gcd(a,b,c,d) = gcd(gcd(gcd(a,b),c),d)



Последний метод возможно имеет элегантное функциональное описание.

Почему я взялся за Эвклида? Ответ - простота. И фундаментальные отсылки которые ведут к
постоянной оценке кратности. Без этого алгоритма не упрощаются рациональные дроби.
gcd упрощает дроби не привлекая primes в явном виде. И эта особенность - привлекает.
Существуют также связи Эвклида с непрерывными дробями и с функцией Эйлера.
(Из книги Виноградова.)

Книгу пока неосилил но всё будет постепенно.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934097
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВобщем я решил взять некую паузу и вернуться к истокам. С Эвклиду. Этот старый бородач
создал алгоритм которому нет аналогов в мире в соотношении простоты и полезного эффекта.
Я имею в виду НОД (в англоязычном варианте GCD - Greatest Common Divisor).
На отличную мысль натолкнул, давно ломал голову над заменой GUID`у в ограниченной распределенной системе.

Задача: имеем N несвязанных БД, документы из которых в итоге сливаются в одну. Например клиенты банка в оффлайне готовят платежки, затем пересылают в банк, каждой платежке надо присвоить уникальный id. Пример надуманный, для общего понимания задачи.
При ожидаемом общем количестве записей менее 1 млрд. обычного int с запасом хватает, но т.к. распределенная система невозможно гарантировать уникальность, поэтому счетчики не подходят.
GUID задачу решает, но тормоза из-за размера, 16 байт на id: база быстро пухнет от хранения и выборки в разы замедяляются.

Решение: выдаем каждой БД уникальное простое число (шаг счетчика) не меньше заданного (это константа, минимум), далее счетчиком генерим последовательность с этим шагом. Остатается только пропустить те значения где при разложении на множители есть простые больше минимума.
Т.е. задаем какой-то минимум для всей системы, например 1000, и дальше выдаем простые последовательно каждой базе (1009,1013,1019... тысячной базе 9433) по сути это ID базы. Например база с ID 1013 генерит последовательность 1013, 2026, 3039 ... пропуская пересечения с другими последовательностями (например 1022117 = 1009*1013). Остается сделать проверку что нет простого делителя больше заданного минимума.
В итоге получаем боле-мене равномерное использование всего диапазона 2^32 Побочный эффект по конкретному значению можно вычислить ID базы которая его сгенерила.

Только придумал, не тестил, но вроде должно взлететь. Надо еще над выбором минимума подумать.

PS была мысль раздавать диапазоны id (например 1000-1999, 2000-2999, 3000-3999 ...) и по мере использования выдавать следующий, оно более линейно, но тоже не идеально, диапазон кончился, связи с раздающим нет, все встало.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934116
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Решение: выдаем каждой БД уникальное простое число
Чего уж там мелочиться.
Сделай вэб сервис, который выдаем уникальный ID для зарегитрировавшегося на нем.
И все!
Осталось за малым, то чтобы этот стандарт приняли все разработчики.
Собственно по такому принципу и MAC адреса распределяются.
Так как после разработки device, фирма должна обратиться к некой организации, которая отвечает
за распределение MAC ... и получить лицензию на допустимый диапазон MAC для производимых device.

PS: Далее выдержка из https://ru.wikipedia.org/wiki/GUID
Алгоритм, который Microsoft использовала для генерации GUID, был широко раскритикован.
В частности, в качестве основы для генерации части цифр GUID использовался MAC-адрес сетевого
адаптера, что означало, например, что по данному документу MS Word
(также получающему при создании свой уникальный GUID) можно было определить компьютер, на
котором он был создан. Позже Microsoft изменила алгоритм таким образом, чтобы
он не включал в себя MAC-адрес.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934140
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012, чтобы флудить не в тему есть отдельный форум .
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934208
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потестил. Не взлетело. Слишком много пропускать надо, 50-70% пропусков. Дорогая плата за расширяемость. Если дополнительно максимальное простое ограничить, то пропусков значительно меньше, но с фиксированным максимумом проще классическое решение: задаем уникальное исходное значение <max и увеличиваем счетчик шагом max.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934253
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
[quot Dima T
Задача: имеем N несвязанных БД, документы из которых в итоге сливаются в одну. Например клиенты банка в оффлайне готовят платежки, затем пересылают в банк, каждой платежке надо присвоить уникальный id. Пример надуманный, для общего понимания задачи.
При ожидаемом общем количестве записей менее 1 млрд. обычного int с запасом хватает, но т.к. распределенная система невозможно гарантировать уникальность, поэтому счетчики не подходят.
GUID задачу решает, но тормоза из-за размера, 16 байт на id: база быстро пухнет от хранения и выборки в разы замедяляются.

Решение: выдаем каждой БД уникальное простое число (шаг счетчика) не меньше заданного (это константа, минимум), далее счетчиком генерим последовательность с этим шагом. Остатается только пропустить те значения где при разложении на множители есть простые больше минимума.
....
[/quot]
Что ж так сложно то...
В первой базе генерим id вида k*N+0, во второй - k*N+1, в третьей k*N+2, ..., в N-ной базе - k*N+(N-1).
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934308
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Что ж так сложно то...
В первой базе генерим id вида k*N+0, во второй - k*N+1, в третьей k*N+2, ..., в N-ной базе - k*N+(N-1).
Уже написал что к этому все приходит 17505147
Тут жесткое ограничение по N, т.е. с появлением N+1 базы будет большая проблема.
Хотел избавиться от ограничения по N, получается непрактично.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТ.е. задаем какой-то минимум для всей системы, например 1000, и дальше выдаем простые последовательно каждой базе (1009,1013,1019... тысячной базе 9433) по сути это ID базы. Например база с ID 1013 генерит последовательность 1013, 2026, 3039 ... пропуская пересечения с другими последовательностями (например 1022117 = 1009*1013). Остается сделать проверку что нет простого делителя больше заданного минимума.
В итоге получаем боле-мене равномерное использование всего диапазона 2^32 Побочный эффект по конкретному значению можно вычислить ID базы которая его сгенерила.

Только придумал, не тестил, но вроде должно взлететь. Надо еще над выбором минимума подумать.

PS была мысль раздавать диапазоны id (например 1000-1999, 2000-2999, 3000-3999 ...) и по мере использования выдавать следующий, оно более линейно, но тоже не идеально, диапазон кончился, связи с раздающим нет, все встало.
Данную задачу можно решить 1000 способами. Но самое главное - дать точный ответ на вопрос
какие требования ты выставляешь к последовательности.

Самый последний вариант (диапазоны id) - вполне себе рабочий. Используй его. А для линейной гистограммы
можно сделать расширение разрядной сетки до 128 бит. Потом shuffle всех битов по одной постоянной схеме
или еще сделать несколько раундов различных операций с полученным целым.

Данная схема вполне рабочая но не криптостойкая.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934320
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 Чего уж там мелочиться.
Сделай вэб сервис, который выдаем уникальный ID для зарегитрировавшегося на нем.
И все!
Осталось за малым, то чтобы этот стандарт приняли все разработчики.
Собственно по такому принципу и MAC адреса распределяются.

Это неверно. Дима-ж пишет что сеть БД несвязная. Тоесть должен сущестовать децентрализованный
но раздельный механизм генерации GUID.

Никаких веб-сервисов.

Тоесть это 3-й тип систем по теореме Брюера. У нее есть только availability + partition tolerance (AP).

А отсылка к МАС-вообщем-то не по сути. Есть много способов перепрограммировать механизм
генерации GUID и МАС/sysdate/IP это просто один из множества способов получить начальное состояние.

P.S. Кстати поведение протокола с МАС+GUID совершенно недетрминированно в случае если на сервере
мы меняем местами две сетевушки в слотах.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934342
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДанную задачу можно решить 1000 способами. Но самое главное - дать точный ответ на вопрос
какие требования ты выставляешь к последовательности.
Логи надо писать в моей распределенной системе сообщений: кто-кому-когда-чего. В идеале должно фоном копиться и на сервер скидываться по мере возможности, лог надо вести за 1-2 последних месяца, в этом промежутке времени желательно чтобы сообщение имело уникальный ID, чтобы просто сводить логи отправителя и получателя. Сейчас каждый сам генерит ID сообщений, для передачи хватает т.к. срок жизни в кэше получателя = время доставки + минута, если совпало в этом промежутке - есть механизм смены ID, можно конечно извратиться и их использовать, но копаться в таких логах неудобно будет.

Сообщений между всеми меньше миллиона в месяц. Т.е. в идеале ID должно быть 7-8 разрядное число.

Пока раздача диапазонов приоритетный вариант. Думал может простым числам тут применение найдется. В принципе идея неплохая: выдал один раз каждому узлу по уникальному числу и пусть генерит ID по кругу, лишь бы повторы не чаще раз в 2 месяца, но есть узлы где где всего 10-20 сообщений в сутки, есть 5-10 тысяч.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934362
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто неверно. Дима-ж пишет что сеть БД несвязная. Тоесть должен сущестовать децентрализованный
но раздельный механизм генерации GUID.Dima T Извиняюсь за флуд.
GUID привел в пример потому, что на форумах не встречал ни каких других подходов к получению
уникального кода.
GUID имеет некоторую структуру ...
Было бы весьма не плохо создать какой-то другой механизм создания уникальных кодов, который
бы позволил и код генерировать меньшей длины и по возможности нести в себе какие-либо данные
об объекте /коды базы, табельный номер, ... .../.
Вполне допускаю, что это может быть ссылка к данным об объекте.
Возьмем к примеру какой-либо handle /файлу, .../.
Он всегда уникальный /обычно это ссылка к данным какого-либо блока памяти/ ...
Вообщем то задумка у тебя довольно интересная.

PS: mayton.
Знаешь я далеко не льстец /и тем более не грубиян/.
Но +5 за твой последний ответ.
Таким бы таким тоном и конструктивом шли обсуждения, то было бы просто здорово ...
/однозначно буду перенимать такой подход/
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934439
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012GUID привел в пример потому, что на форумах не встречал ни каких других подходов к получению
уникального кода.
Выше 17505369 классический подход генерации ID для распределенных БД.
По большому счету все подходы (в т.ч. GUID) сводятся к тому чтобы выдать каждому генератору какую-то уникальную константу, к которой генератор добавляет свое уникальное число по заданному алгоритму. Т.е. константа определяет диапазон в котором работает генератор. А дальше конкретные реализации, связанные с оптимизацией ради уменьшения размера ID. Все оптимизации сводятся к ограничению количества констант и диапазона в котором может работать конкретный генератор.

Разрядности 128 бит GUID`а достаточно чтобы не заморачиваться что в один прекрасный день кончатся ID или невозможно будет выдать очередную константу новой базе, но во-первых базы раздуваются в разы по сравнению с int, как следствие в разы замедляются выборки. И во-вторых банальное желание покопаться руками в базе (в поисках какого-нибудь косяка) превращается в кошмар: запомнить/записать 7-8 цифр обычного ID элементарно, а 36 знаков GUID`a - уже проблема.

Как-то решал эту проблему двумя ID: int для внутреннего использования в рамках одной базы, GUID для репликации с другими. Не скажу что решение идеальное, один из компромиссов между скоростью выборки и свободой от ограничений по разрядности.

По поводу анонимности: она нужна далеко не всегда, но нынешнее маниакальное желание всяких вэб-сервисов собрать максимум инфы о пользователях немного напрягает и заставляет задумываться.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934447
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРазрядности 128 бит GUID`а достаточно чтобы не заморачиваться что в один прекрасный день кончатся ID или невозможно будет выдать очередную константу новой базе
А что если UNIQ /наш аналог GUID/ будет переменной длины.
Т.е. в нем скажем 0-й бит 1-го байта имеет значение:
== 0 - UNIQ фиксированной длины;
== 1 - UNIQ переменной длины;

/даже пока не рассматриваю проблемы SQL баз у которых обычно нет эффективного механизма с
манипуляциями и хранением данных переменной длины/.

Почему так.
Возьмем скажем Microsoft. У них GUID в применении скажем к COM это не просто уникальный ключ,
но и ссылка к одной или нескольким веткам реестра /в котором хранятся дополнительные данные об
UNIQ/.
Подход /как по мне/ - правильный.
Так вот сделать архитектуру нашего UNIQ гибкую и расширяемую
/может быть даже завязанную с некой базой UNIQs (но ни как не привязанной к реестру)/.

PS: Конечно сказанное мной немножко сумбурно и не связанно.
Просто вот как бы рассказал немного о том чего бы хотелось иметь.
Если удастся решить этот вопрос, то думаю он вполне потянет на новый документ в RFC ...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934510
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСделал пример многопоточного использования multi_prime.cpp

В 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :)
Код: plaintext
1.
2.
Test(0M...1000M): next_prime() multithread
count 50847534 primes. time 472 msec speed 107727K/sec OK



PS Сделал потоки на WinAPI, под линуксом не соберется.

Поздравляю! :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934547
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 А что если UNIQ /наш аналог GUID/ будет переменной длины.
Смысл? Цель какая?

Владимир2012 Возьмем скажем Microsoft. У них GUID в применении скажем к COM это не просто уникальный ключ,
но и ссылка к одной или нескольким веткам реестра /в котором хранятся дополнительные данные об
UNIQ/.
Подход /как по мне/ - правильный.
Так вот сделать архитектуру нашего UNIQ гибкую и расширяемую
/может быть даже завязанную с некой базой UNIQs (но ни как не привязанной к реестру)/.
Не надо мешать в одну кучу ключи и связанные с ними данные, GUID для COM это именно уникальный ключ конкретного класса, а ветка в реестре - место хранения метаданных этого класса. Никто GUID`ы в реестре хранить не заставляет. COM изобретение MS, решили они хранить в реестре в ветке с именем по GUID - их право, от того что ты изобретешь свое хранилище подход MS никак не поменяется.

Проблема именно в размерах: ID придумано именно для уменьшения размеров, для компактного хранения данных. Чтобы диапазон допустимых значений незначительно превосходил количество требуемых. Если бы с размерами проблем не было, то делай 128 бит (хоть самодельным алгоритмом) и забудь про все остальные проблемы.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934589
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСмысл? Цель какая?Чтобы затем этот GUID можно было использовать и в WWW, ...
Кроме того если далее GUID использовать по примеру Microsoft и иметь доступ к его метаданным,
то он будет подобен URL.
Проще говоря это будет "URL" к объекту.
Т.е. зная GUID объекта можно получить мета данные по нем /к примеру об книге, товаре, .../.
При этом нам не нужно будет разрабатывать ни какие вэб сервисы ...
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934683
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 А что если UNIQ /наш аналог GUID/ будет переменной длины.
Т.е. в нем скажем 0-й бит 1-го байта имеет значение:
== 0 - UNIQ фиксированной длины;
== 1 - UNIQ переменной длины;

С точки зрения БД - всё равно. Строки и псевдо-числа (Number) хранятся в виде последовательностей символов.

128-битность может быть интересна в тех сферах где основная вычислительная нагрузка падает именно
на сравнения 128-битных целых. Но я таких не знаю. К примеру все современные файловые системы NTFS/Zfs
в качестве основного вычислимого типа используют uint64_t. Это покрывает все потребности роста ФС на десятки
лет в будущее.

Представить себе объёмы измеряемые 128 битами не просто невозможно. Это неслыханно. Это астрономически
огромное число. Мы можем его попробовать сравнить с секундами возраста вселенной или количеством атомов вещества.
Чтобы хотя-бы обладать порядком сравнения.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934686
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima TСмысл? Цель какая?Чтобы затем этот GUID можно было использовать и в WWW, ...
Кроме того если далее GUID использовать по примеру Microsoft и иметь доступ к его метаданным,
то он будет подобен URL.
Проще говоря это будет "URL" к объекту.
Т.е. зная GUID объекта можно получить мета данные по нем /к примеру об книге, товаре, .../.
При этом нам не нужно будет разрабатывать ни какие вэб сервисы ...
В такой постановке как сгенерить GUID дело десятое. По сути ты предлагаешь сделать каталог всего на свете, чтобы потом просто на него ссылаться или брать необходимую инфу. Придумать его структуру и правила хранения - не проблема. Даже RFC написать можно. Только это 0,01% от решения всей задачи. Кто будет наполнять этот каталог и следить за актуальностью? Вот в чем проблема.

Все придумано до нас: у товаров есть EAN у книг ISBN.
Придумано потому что это выгодно и оправдывает затраты на "придумывание" и главное на поддержание придуманного в рабочем состоянии.

Так что оставшиеся 99,99% твоей задачи придумать как доказать владельцу объекта (например производителю товара) что ему выгодно зарегистрироваться в твоей системе и поддерживать в актуальном состоянии информацию о своих объектах.

PS Ты не первый с подобными идеями, хотя по размаху яндекс.маркет убогая поделка по сравнению с твоими замыслами :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934697
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсе придумано до нас: у товаров есть EAN у книг ISBNВот в этом и изюминка.
Будет предложен унифицированный подход к созданию meta данных об объекте.

PS: Разница в том, что подход "EAN у книг ISBN" порождает неимоверное количество разных сущностей.
Что в свою очередь как "ком" тянет за собой другие проблемы.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934731
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В внедрением протокола Ipv6. Разрядную сетку IP адреса получателя и отправителя не просто удвоили.
А учетверили. Я думаю что перегнули палку. Админам трудно запоминать даже приблизительно Ipv6
адреса. Специально для этого была придумана "сжатая" нотация с двоеточиями (":") чтобы скипать
длинные последовательности нулей (капец рациональность) в пустых пока еще диапазонах.
Трудно будет также фиксировать сложные правила файрвола. Индивидуальные блокировки e.t.c.
Еще сложнее будет хранить мета-базы данных трафика.

Думаю что с 128 битами явно поспешили. Не было поэтапного развития. Дай бох планета земля
доживёт до новых потребностей в расширении адреса.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПоздравляю! :)
Привет лентяй. А ты собираешся нас порадовать кодингом?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38934771
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ внедрением протокола Ipv6. Разрядную сетку IP адреса получателя и отправителя не просто удвоили.
А учетверили.
maytonПредставить себе объёмы измеряемые 128 битами не просто невозможно. Это неслыханно. Это астрономически
огромное число. Мы можем его попробовать сравнить с секундами возраста вселенной или количеством атомов вещества.
Чтобы хотя-бы обладать порядком сравнения.
Каждой молекуле по IP-шнику дали, а мы тут за какие-то несчастные GUIDы. Надо IP-шники раздавать на все случаи жизни
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38935278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима. Please review.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Revision: 33
Author: mayton
Date: Monday, April 13, 2015 7:39:00 PM
Message:
Fixes MinGW compiller warning : 'this decimal constant is unsigned only in ISO C90'
----
Modified : /trunk/DimaT/header.h


+ надо-бы написать краткие аннотации или в Help или в каментах что каждая утилита делает.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38935386
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКаждой молекуле по IP-шнику дали, а мы тут за какие-то несчастные GUIDы. Надо IP-шники раздавать на все случаи жизни
А смысл? IP надо раздавать устройствам которые хотя-бы пингуются и светят в мир на 80 порту
хоть какой-то веб-мордой. А так - тривиальные клиенты спокойно сидят за proxy, nat и не жужжат.
И внешний адрес им нужен как зайцу 5-е колесо.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38935679
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил порассуждать о некоторых частных случаях факторизации. Припустим есть
некое длинное целое A которое является результатом произведения 2х достаточно
больших простых чисел (X,Y). Почему двух? Ну... согласно криптографическим протоколам.
Вобщем таковы начальные условия.

Какими должны быть эти (X,Y). Ну... предположительно они должны быть достаточно
большими чтобы исключать "перебор" решетом primes или таблице или базой.
Исходим из предположения что A имеет астрономически-высокую разрядность (512 бит
максимум) и разрядная сетка обычно задейстована на 80-100%. Тогда
искомые (X,Y) которые удовлетворят уравнению



Или



находятся на кривой типа гипербола которая проходит через точки:

(1,A), (x1,y1), (y1,x1), (A,1).

которые имеют целочисленное решение. А все остальные (xi,yi) по сути
не имеют целого решения xy=1 по определению. Потому-что такова постановка.

Где-бы следовало искать точку (xi,yi) ? По всей видимости не в окрестности
(1,A) или (A,1) где решение находится перебором. И не в окрестности

(xc,yc)=((SQRT(A),SQRT(A)) где число трудно но всё-таки можно искать от центра симметрии.

А скорее всего искомые (x,y) лежат между (xc,yc) и (A/ymaxprime,ymaxprime) и (xmaxprime,A/maxprime)
где *maxprime это максимум последовательности простых чисел которые у нас есть и которые
легко и удобно извлекаются и имеют единичную оценку сложности алгоритма проверки делимости в
рамках нашей решаемой задачи.

Уф... написал. Чуть позже нарисую поясняющую картинку.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38935711
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonГде-бы следовало искать точку (xi,yi) ? По всей видимости не в окрестности
(1,A) или (A,1) где решение находится перебором. И не в окрестности

(xc,yc)=((SQRT(A),SQRT(A)) где число трудно но всё-таки можно искать от центра симметрии.
Ага, метод Ферма
maytonА скорее всего искомые (x,y) лежат между (xc,yc) и (A/ymaxprime,ymaxprime) и (xmaxprime,A/maxprime)
где *maxprime это максимум последовательности простых чисел которые у нас есть и которые
легко и удобно извлекаются и имеют единичную оценку сложности алгоритма проверки делимости в
рамках нашей решаемой задачи.
Вообще-то чтобы получить N-битный RSA ключ, берется пара нечетных случайных N/2-битных чисел A и B, каждое из которых тестируется по Миллеру-Рабину по нескольким основаниям. Никто не стремится специально доказать их простоту. Да, еще неплохо проверить, что A-1 и B-1, а также A+1 и B+1 содержат большие простые множители.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38935736
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Спасибо Барлон. У меня уже целый список чего почитать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38936305
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима. Please review.
+ надо-бы написать краткие аннотации или в Help или в каментах что каждая утилита делает.
Поправил варнинги.
Думаю надо там поудалять лишнее. Промежуточные версии наверно никому не интересны.
Оставить next_prime32.h next_prime64.h и сделать одну primegen.cpp собрав туда все полезное. Удаляю?

primegen.cpp почти сделал (осталось добавить многопоточность). Считает по заданному диапазону и сохраняет найденные в файл. Если файл не задавать, то просто количество считает, т.е. тест на скорость.
Можешь потестить.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38936311
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Я думаю что 32х битные версии для сообщества не представляют
интереса. Кому надо под легаси-железо - сам поправит и пересоберёт.

Я грохну PBFA-32bit няшную шнягу.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38936415
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа. Я думаю что 32х битные версии для сообщества не представляют интереса.
Не совсем согласен. С математической точки зрения они бесполезны, но с практической - они просто быстрее. 8 байт дольше читается чем 4, пусть ускорение не в 2 раза, но 10-15% времени x32 экономит.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38936577
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял твою мысль. На уровне storage имеет смысл сохранить кеши vector<uint32>, vector<uint64>.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38938689
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ещё вот такая мысль возникла

все простые числа >2 можно представить в виде только одним способом при a=b+1
a^2-b^2 =(a-b)(a+b)

числа
при к>0 всегда не простые

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

Но кому нужен точный расчёт факториала? Пожалуй только в задачах доказательства теорем
или схождений рядов им подобных.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #38939212
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил многопоточность в primegen.cpp. Правда при запуске в многопоточном варианте он только скорость померяет. В файл запись не стал делать, слишком много кода получится и хранить надо где-то, чтобы последовательно в файл писать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39012652
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чортов сорсфорж. Упал нафик

https://sourceforge.net/p/primegen/code/
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39151177
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со ссылкой на хабр http://habrahabr.ru/post/275541/

Еще одно простое число найдено.



Эти чортовы ботаны не спят ночей и мучают процессор и видяшку
чтобы получить свои 3000 условных енотов и потешить своё самолюбие!
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39151189
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭти чортовы ботаны не спят ночей и мучают процессор и видяшку
чтобы получить свои 3000 условных енотов и потешить своё самолюбие!
Есть от них польза, косяк в интеловском проце нашли :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39151201
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonЭти чортовы ботаны не спят ночей и мучают процессор и видяшку
чтобы получить свои 3000 условных енотов и потешить своё самолюбие!
Есть от них польза, косяк в интеловском проце нашли :)
Ну чтож.. остаётся только развести руками и обругавшись спросить как
они (Intel) там вообще тестируют новые модели процессоров?

Бох с ними с простыми числами. Хотя-бы прогнали регресс по DDIV, экспонентам
и элементарной математике.

Обжёгшись на молоке как говориццаа.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39347913
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток господа. Смотрю так буйно бились и подостыли?) Я какоето время тоже простыми числами интересуюсь, вот появилось пару недель свободных засел.. Бегло пролистал топик, пока мулач Аткина. Домучал его х32 до 6FFFFFFF размерности.. дальше Аут оф мемори.. а вы вроде все х32 значения им считали? упаковывали байты в биты? (типа по памяти в раз экономи) на производительность пофигу.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39347962
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYka,

Битовая карта всех 32-битных чисел занимает 4Г/8бит=512 МБ (без упаковки).
Такое помещается обычно в памяти, если конечно не совсем древний комп.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348028
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, да не древний.. один 7ая корка,16ГБ . 2ой 2ух процессорный ксенон 8гб.. та реализация Аткина что у меня попалась 1 бит занимает 1 байт.(с вики стянул потом допиливал..) т.е в моем случае как раз 4ГБ памяти и надо. и на переполнение 4*x*x+y*y наступил.. пол часа в отладке сидел, не мог понять почему таблицы портятся.. Но это скорее мои личные проблемы.
я незнаю может комуто будет интересно, страдал фигней, оптимизировал тривиальный брут простых чисел. Кину сюда на всяк случай, может комуто сгодится. Вроде оптимальней некуда

Код: 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.
function isPrime_asm(dwIn,Prime_tlb:DWord):boolean ;assembler;
asm
        mov ecx,eax //eax-dwIn  save for work
        mov esi,edx //edx-table prime numbers
@loop:
        lodsd       //load prime from tlb
        test eax,eax
        jz @prime

        mov ebx,eax //data from Prime_tlb
        xor edx,edx
        mov eax,ecx//copy dwIn
        div ebx
        test edx,edx
        jz @not_prime
        nop
        jmp @loop
//-------------------
@not_prime:
        xor eax,eax
        jmp @exit
//-------------------
@prime:
        mov [esi-4],ecx  //save prime
        mov eax,1
@exit:
end;
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348033
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и да.. 1. таблица с праймами.. должна быть 0-терминейт... вобщем по хорошему сразу файл с нулями.
2. и чтоб избегать 2ой проверки при каждом вызове isPrime_asm на предмет prime mod 5.. при старте таблу заполняю сраз до 5ки включительно. Производительность даже в таком виде конечно удручает.. на Коре и7.. гдето 70-80 дней 32бит праймы собираются.. но это скорее для эксперементов, а не для работы
ЗЫ. сори за дабл пост, но чет не вижу.. тут свои посты править можно после публикации?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348168
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYka,

Посты здесь править нельзя, к сожалению.
Никакой оптимизацией у тебя и не пахнет, причем алгоритм - перебора по таблице, причем до конца таблицы тоже вряд ли эффективен.
И конечно, чтобы проверить на простоту N - эту таблицу надо сначала всю заполнить, хотя бы до sqrt(N)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348197
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl, оптимизация как бы по скорости.. все в регистрах. это раз. как бы профилировка по скорости. перебор до конца таблицы и вычисления sqrt тоже спорный вопрос, если кому надо добавляем ще 1 параметр, и еще одну проверку после loasd .. ток в так как простые числа идут 1 к 10. и множитель в 90 проц случаев находится быстрее чем + еще одна проверка.. и на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя.
Допилил Аткина.. судя по всему Done save primes 203 280 221 09:12:20.. верный результат.. ибо сошелся с primesieve-5.7.0
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348263
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaDone save primes 203 280 221 09:12:20
Если это 9 часов, то это многовато.
Все должно быть в пределах нескольких минут.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348288
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaSiemargl, оптимизация как бы по скорости.. все в регистрах. это раз. как бы профилировка по скорости. перебор до конца таблицы и вычисления sqrt тоже спорный вопрос, если кому надо добавляем ще 1 параметр, и еще одну проверку после loasd .. ток в так как простые числа идут 1 к 10. и множитель в 90 проц случаев находится быстрее чем + еще одна проверка.. и на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя.
Допилил Аткина.. судя по всему Done save primes 203 280 221 09:12:20.. верный результат.. ибо сошелся с primesieve-5.7.0
Какие однако познания в оптимизации от дельфиста =)

Открываем сайт http://primesieve.org/#implementation и читаем, что сделали грамотные люди.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348358
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyVodoleYkaDone save primes 203 280 221 09:12:20
Если это 9 часов, то это многовато.
Все должно быть в пределах нескольких минут.
9мин 12 сек 20 милисек. то я криво формат указал при выводе.. сори.
касательно быстрого извлечения корня и возведения в квадрат , а также умнжоения и деления.. простите.. но я вкурсе. я на асме с 94го года.. я вобщемто не спорю.. не нравится.. не берите.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348361
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaи на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя.
Корень можно заменить на возведение в квадрат.
Суть корня в том что проверку по таблице нужно останавливать когда p i > sqrt(N) или по другому p i *p i > N где p i очередное простое, N проверяемое.
Для 32бит таблицу простых надо всего до 65536.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348371
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TVodoleYkaи на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя.
Корень можно заменить на возведение в квадрат.
Суть корня в том что проверку по таблице нужно останавливать когда p i > sqrt(N) или по другому p i *p i > N где p i очередное простое, N проверяемое.
Для 32бит таблицу простых надо всего до 65536.

ок
@loop:
lodsd //load prime from tlb
----------
cmp eax,FFFF
ja @prime
----------
test eax,eax
jz @prime

так легче? без корня. потеря в скорости не существенная. вместо FFFF sroot можно если хотите считать.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348376
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
типа при самом фиговом варианте обработается 6488+54 праймов..
1..2^8 = 54
2^8..2^16 =6488
2^16..2^24=1 071 329
2^24..2^32=202 202 350

total 2^32 =203 280 221

вы лучше подскажите, кто знает сколько праймов в диапазоне 2^32..2^64.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348382
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaтак легче?
Не знаю. По времени расчета какие изменения?

Можно квадраты не считать каждый раз, а добавить таблицу квадратов и сравниваться с ней.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348386
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaвы лучше подскажите, кто знает сколько праймов в диапазоне 2^32..2^64.
в 2^64 примерно 415 828 534 307 635 091 простых (тут прикидывали 17471253 )
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348407
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

cmp eax, $FFFF //0:00:37 vs 0:00:03
ja @prime
считай в 40 раз. при одинаковых условиях при расчете 1го 1кк чисел.. (не праймов.. просчет чисел от 0 до 1кк) и по идее дальше должна еще увеличиваться.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348415
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно ускорить перебирая не все подряд, а пропуская кратные первым простым 2,3,5,7..., т.е. построить таблицу смещений.
Например для 2,3,5 таблица 4,2,4,2,4,6,2,6. т.е. проверять значения 5,7,11,13,17,19... Тут генератор 17479728
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348427
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
это видел. я собственно этот код для себя писал. он все равно сильно много не насчитает. поэтому вылизывать его можно конечно, для перфекционизма, но как рабочий инструмент он почти бесполезен. не ну можно переползти на BigMath и считать дальше.. но смысл.
я тут кстати.. ввиде маразма запустил тест 1024 RSA modulus на праймах х32.. чуть позже сообщу время.. на глаз.. гдето 22ч либу там скрещивал сам.. там половина асм кода.. но там еще оптимизировать и оптимизировать.. но по крайней мере бОльшая часть кода там по уму сделана.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348436
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно по минимуму, четные пропускать. Уже в два раза меньше проверять.

В том коде главная проблема в div. Деление достаточно тяжелая операция.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348443
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

ну совсем меня за лоха то не держи? и 5 пропускается в том числе.. четные просто inc 2 числам.. а 5 ща mod но можно еще ускорить, но повторюсь.. сильно не вижу смысла. я просто кинул кусок кода на асме, который в плане скорости и размера очень мал. поверь.. я в своей жизни на говнокода насмотрелся. я собственно последние лет 10 ток кейгены и пишу.. поэтому и гремучая смесь делфи+асм
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348449
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
я тебе скажу по секрету.. там самая тяжелая операция это lodsd ... а регистровый div он еще на конвеере полу обрабатывается.. а вот работа с памятью.. в частности использования переменных... вот это самые большие тормоза. но никуда без таблицы праймов не дется. когдато у меня была табла про такты которые тратит проц на обработку комманды.. гдето пол года назад пытался найти свежую, уже не публикуют вроде ибо стало все сложно. ибо CISCO RISC процы уже отсутсвуют.. ща они все гибридные
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348505
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaработа с памятью.. в частности использования переменных... вот это самые большие тормоза. но никуда без таблицы праймов не дется.
для расчета 2^32 надо всего 6500 чисел или ~26 Кб под таблицу. Она целиком в кэш проца влезет и не будет никаких обращений в память.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348573
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaDima T,

cmp eax, $FFFF //0:00:37 vs 0:00:03
ja @prime
считай в 40 раз. при одинаковых условиях при расчете 1го 1кк чисел.. (не праймов.. просчет чисел от 0 до 1кк) и по идее дальше должна еще увеличиваться.
Затестил, таблица квадратов дает ускорение еще на порядок.
Диапазон 2^16..2^24
ФункцияВремяis_prime()14.4 сек.is_prime2()1.2 сек.

Исходник
Код: 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.
#define PRIME_TABLE 6541

uint32_t primes[PRIME_TABLE]; // простые до 2^16
uint32_t primes2[PRIME_TABLE]; // квадраты до 2^16

// Перебор всего массива
bool is_prime(uint32_t n) {
	for(int i = 0; i < PRIME_TABLE; i++) {
		if (n % primes[i] == 0) return false;
	}
	return true;
}

// Перебор до sqrt(n)
bool is_prime2(uint32_t n) {
	int i;
	for (i = 0; n >= primes2[i]; i++) {
		if (n % primes[i] == 0) return false;
	}
	return true;
}

// Инициализация таблиц
void init_primes() {
	int pos = 1;
	primes[0] = 3;
	primes2[0] = 9;
	for (int i = 5; i < 65536; i += 2) {
		if (is_prime2(i)) {
			primes[pos] = i;
			primes2[pos] = i*i;
			pos++;
		}
	}
}

...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348580
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

кстати.. о таблице праймов.. там на хабре статейка была.. на предмет того чтоб не хранить прайм, а хранить шаг между соседом. там получается что всего около 10ка праймов находятся на расстоянии больше 256 байт.. т.е можно просто хранить не
2 3 5 7 а
2 2 2 и т.д.. для тех, где расстояние больше тратить 3 байта типа 0 хх хх, так базу можно на 25 проц ужать, вобщемто без потери скорости работы.. все равно праймы друг за другом перебираются
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348591
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 4 раза ужимается.
Где-то в топике выше обсуждали. Одного байта достаточно до 2^64. Максимум разницу 300 с небольшим находил. Дополнительно еще на 2 делил, т.к. разница всегда четная. Так в 1 байт шаг до 512 влазит.

Таблица квадратов не нужна, с умножением время точно такое же
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
bool is_prime3(uint32_t n) {
	int i;
	for (i = 0; n >= primes[i] * primes[i]; i++) {
		if (n % primes[i] == 0) return false;
	}
	return true;
}
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348595
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДА но тебе все равно нужен маркер какойто.. что число больше байта. вобщем и это детали
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348603
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил. На скорость оптимизация не влияет, те же 1.2 сек, разве что когда до 2^64 считать, то таблица перестанет в кэш проца влазить.

Исходник
Код: 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.
#define PRIME_TABLE 6541

uint32_t primes[PRIME_TABLE];
uint32_t primes2[PRIME_TABLE];
uint8_t primes_delta[PRIME_TABLE];

bool is_prime4(uint32_t n) {
	int prime = 3;
	int pos = 0;
	for (int i = 0; n >= prime * prime; i++) {
		if (n % primes[i] == 0) return false;
		prime += ((int) primes_delta[pos]) * 2;
		pos++;
	}
	return true;
}

// Инициализация таблиц
void init_primes() {
	int pos = 1;
	primes[0] = 3;
	primes2[0] = 9;
	for (int i = 5; i < 65536; i += 2) {
		if (is_prime2(i)) {
			primes[pos] = i;
			primes2[pos] = i*i;
			primes_delta[pos] = (uint8_t) ((i - primes[pos - 1]) / 2);
			pos++;
		}
	}
}

...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348607
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VodoleYkaДА но тебе все равно нужен маркер какойто.. что число больше байта. вобщем и это детали
Оно всегда влазит. Я ж писал максимум разница 300 с небольшим нашлась.
У меня в коде эратосфена x64 проверка есть, она ни разу не сработала.
Код: plaintext
1.
2.
3.
4.
if(prime - p >= 512) {
	printf("Error cache: %llu - %llu = %llu > 512\n", prime, p, prime - p);
	return 0;
}
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348614
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тю блин.. это я затупил.. вы в таблице уже поделенные значения хранить собирались.. согласен.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348709
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ 4 раза ужимается.
Где-то в топике выше обсуждали. Одного байта достаточно до 2^64. Максимум разницу 300 с небольшим находил. Дополнительно еще на 2 делил, т.к. разница всегда четная. Так в 1 байт шаг до 512 влазит.

Таблица квадратов не нужна, с умножением время точно такое же
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
bool is_prime3(uint32_t n) {
	int i;
	for (i = 0; n >= primes[i] * primes[i]; i++) {
		if (n % primes[i] == 0) return false;
	}
	return true;
}


я может чего не понимаю, а почему просто корень не извлечь сразу?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool is_prime3(uint32_t n) {
	int i;
        int sqn = sqrt(n + 1);
	for (i = 0; sqn >= primes[i]; i++) {
		if (n % primes[i] == 0) return false;
	}
	return true;
}



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

Я кстати решил полностью уйти с SVN и поудалять всё с миграцией в github.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348778
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)я может чего не понимаю, а почему просто корень не извлечь сразу?
VodoleYka, не хотел с корнями связываться на асме. Затестил, по скорости одинаково что с корнями что с квадратами.

maytonDima T, давай актуализируем нашу песочницу.

Я кстати решил полностью уйти с SVN и поудалять всё с миграцией в github.
Там все актуально, больше доработок не было, переноси как есть.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348892
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
ну FSQRT еще никто не отменял.. но там получается 2 операции с памятью. а это не гуд.. а вот регистровое умножение, вполне имеет право на жизнь..
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348931
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
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.
function isPrime_asm(dwIn,Prime_tlb:DWord):DWord ;assembler;
asm
        mov ecx,eax //eax-dwIn  save for work
        mov esi,edx //edx-table prime numbers
@loop:
        lodsd       //load prime from tlb
        mov ebx,eax //data from Prime_tlb beckup

        xor edx,edx
        imul eax,eax
        test edx,edx //test resul>x32
        jnz  @prime

        cmp ecx,eax //dwIn<prime[i]^2
        jl @prime
//------------------
        //cmp eax, $FFFF    //ver 1.0 0:00:37 vs 0:00:03
        //ja @prime
//------------------
        //test eax,eax  //End of table
        //jz @prime

        //mov ebx,eax //data from Prime_tlb
        xor edx,edx
        mov eax,ecx//copy dwIn
        div ebx
        test edx,edx
        jz @not_prime
        nop
        jmp @loop
//-------------------
@not_prime:
        xor eax,eax
        jmp @exit
//-------------------
@prime:
        //mov [esi-4],ecx  //save prime
        mov eax,ecx
@exit:  //return 0-if not prime, or return prime
end;



ну короче както так.. ток теперь вызывающая процедура озабочена записью прайма в таблицу.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39348933
VodoleYka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тю блин.. в коментах ошибка..
cmp ecx,eax //dwIn<prime[i]*prime[i]
ЗЫ
как же фигово что нельзя править сообщения
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Генератор простых чисел (до 10^9 за 5 сек)
    #39601515
кибальчиш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Составил програмку расчёта первых простых чисел по методу Владимира Хренова.

http://www.zodiack.narod.ru/nchisla.pdf

Первые три миллиарда находит за 7 часов 10 минут. Хотелось бы ослышать оценку по скорости генерации по сравнению с решетом Эратосфена.
Протестировано на Intel Core I5-2400 3.1 Ghz, 4 Gb memory, Win 10 Pro.

29 cnt:10 end time: 08:03:18 date: 02/13/18
71 cnt:20 end time: 08:03:18 date: 02/13/18
113 cnt:30 end time: 08:03:18 date: 02/13/18
173 cnt:40 end time: 08:03:18 date: 02/13/18
229 cnt:50 end time: 08:03:18 date: 02/13/18
281 cnt:60 end time: 08:03:18 date: 02/13/18
349 cnt:70 end time: 08:03:18 date: 02/13/18
409 cnt:80 end time: 08:03:18 date: 02/13/18
463 cnt:90 end time: 08:03:18 date: 02/13/18
541 cnt:100 end time: 08:03:18 date: 02/13/18
1223 cnt:200 end time: 08:03:18 date: 02/13/18
1987 cnt:300 end time: 08:03:18 date: 02/13/18
2741 cnt:400 end time: 08:03:18 date: 02/13/18
3571 cnt:500 end time: 08:03:18 date: 02/13/18
4409 cnt:600 end time: 08:03:18 date: 02/13/18
5279 cnt:700 end time: 08:03:18 date: 02/13/18
6133 cnt:800 end time: 08:03:18 date: 02/13/18
6997 cnt:900 end time: 08:03:18 date: 02/13/18
7919 cnt:1000 end time: 08:03:18 date: 02/13/18
17389 cnt:2000 end time: 08:03:18 date: 02/13/18
27449 cnt:3000 end time: 08:03:18 date: 02/13/18
37813 cnt:4000 end time: 08:03:18 date: 02/13/18
48611 cnt:5000 end time: 08:03:18 date: 02/13/18
59359 cnt:6000 end time: 08:03:18 date: 02/13/18
70657 cnt:7000 end time: 08:03:18 date: 02/13/18
81799 cnt:8000 end time: 08:03:18 date: 02/13/18
93179 cnt:9000 end time: 08:03:18 date: 02/13/18
104729 cnt:10000 end time: 08:03:18 date: 02/13/18
224737 cnt:20000 end time: 08:03:18 date: 02/13/18
350377 cnt:30000 end time: 08:03:18 date: 02/13/18
479909 cnt:40000 end time: 08:03:18 date: 02/13/18
611953 cnt:50000 end time: 08:03:18 date: 02/13/18
746773 cnt:60000 end time: 08:03:18 date: 02/13/18
882377 cnt:70000 end time: 08:03:18 date: 02/13/18
1020379 cnt:80000 end time: 08:03:18 date: 02/13/18
1159523 cnt:90000 end time: 08:03:18 date: 02/13/18
1299709 cnt:100000 end time: 08:03:18 date: 02/13/18
2750159 cnt:200000 end time: 08:03:19 date: 02/13/18
4256233 cnt:300000 end time: 08:03:19 date: 02/13/18
5800079 cnt:400000 end time: 08:03:19 date: 02/13/18
7368787 cnt:500000 end time: 08:03:20 date: 02/13/18
8960453 cnt:600000 end time: 08:03:20 date: 02/13/18
10570841 cnt:700000 end time: 08:03:21 date: 02/13/18
12195257 cnt:800000 end time: 08:03:21 date: 02/13/18
13834103 cnt:900000 end time: 08:03:21 date: 02/13/18
15485863 cnt:1000000 end time: 08:03:22 date: 02/13/18
32452843 cnt:2000000 end time: 08:03:26 date: 02/13/18
49979687 cnt:3000000 end time: 08:03:30 date: 02/13/18
67867967 cnt:4000000 end time: 08:03:34 date: 02/13/18
86028121 cnt:5000000 end time: 08:03:39 date: 02/13/18
104395301 cnt:6000000 end time: 08:03:44 date: 02/13/18
122949823 cnt:7000000 end time: 08:03:49 date: 02/13/18
141650939 cnt:8000000 end time: 08:03:54 date: 02/13/18
160481183 cnt:9000000 end time: 08:03:59 date: 02/13/18
179424673 cnt:10000000 end time: 08:04:04 date: 02/13/18
373587883 cnt:20000000 end time: 08:04:58 date: 02/13/18
573259391 cnt:30000000 end time: 08:05:55 date: 02/13/18
776531401 cnt:40000000 end time: 08:06:55 date: 02/13/18
982451653 cnt:50000000 end time: 08:07:58 date: 02/13/18
1190494759 cnt:60000000 end time: 08:09:02 date: 02/13/18
1400305337 cnt:70000000 end time: 08:10:07 date: 02/13/18
1611623773 cnt:80000000 end time: 08:11:13 date: 02/13/18
1824261409 cnt:90000000 end time: 08:12:19 date: 02/13/18
2038074743 cnt:100000000 end time: 08:13:26 date: 02/13/18
4222234741 cnt:200000000 end time: 08:25:12 date: 02/13/18
6461335109 cnt:300000000 end time: 08:37:53 date: 02/13/18
8736028057 cnt:400000000 end time: 08:50:24 date: 02/13/18
11037271757 cnt:500000000 end time: 09:03:08 date: 02/13/18
13359555403 cnt:600000000 end time: 09:16:56 date: 02/13/18
15699342107 cnt:700000000 end time: 09:30:25 date: 02/13/18
18054236957 cnt:800000000 end time: 09:44:45 date: 02/13/18
20422213579 cnt:900000000 end time: 09:58:37 date: 02/13/18
22801763489 cnt:1000000000 end time: 10:12:29 date: 02/13/18
47055833459 cnt:2000000000 end time: 12:38:55 date: 02/13/18
71856445751 cnt:3000000000 end time: 15:14:08 date: 02/13/18
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39601519
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без исходника как то незачотно. А вдруг ты пошутил?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39601524
кибальчиш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
Пошутил в смысле слишком быстро или слишком медленно ? Какие тут шутки. Алгоритм в этой работе нарисован - смотри на картинку дерева чисел. Автор ничего не скрыл - всё на виду.
Принцип простой. Все простые числа или их произведения принадлежат двум последовательностям:

1) P1(i)=6*i-1, где i=1,2,....n (n стремится к бесконечности)
2) P2(i)=6*i+1, где i=1,...n

То есть:
P1(1)=6*1-1=5 - простое
P2(1)=6*1+1=7 - простое
P1(2)=6*2-1=11 - простое
P2(2)=6*2+1=13 - простое
P1(3)=6*3-1=17 - простое
P2(3)=6*3+1=19 - простое
P1(4)=6*4-1=23 - простое
P2(4)=6*4+1=25 - составное
P1(5)=6*5-1=29 - простое
P2(5)=6*5+1=31 - простое
...
Далее, каждое новое простое число генерирует две другие бесконечные последовательности. Так называемые "положительные" последовательности вида (m стремится к бесконечности)
K1(j) = P1(i)*P1(i)+P1(i)*6*j где j=0,1,2,....m
и "отрицаетльные" последовательности вида
K2(j)=P1(i)P2(i)+P1(i)*6*j где j=0,1,2,...m

Например:
Для i=1 и P1(соответствующее простое число 5 ):
"Положительная" последовательность
K1(P1(1),0)=5*5+5*6*0=25
K1(P1(1),1)=5*5+5*6*1=55
K1(P1(1),2)=5*5+5*6*2=85
...
"Отрицательная" последовательность
K2(P1(1),0)=5*7+5*6*0=35
K2(P1(1),1)=5*7+5*6*1=65
K2(P1(1),2)=5*7+5*6*2=95
...

Для i=2 и P2(соответствующее простое число 7 ):
"Положительная" последовательность
K1(P2(1),0)=7*7+7*6*0=49
K1(P2(1),1)=7*7+7*6*1=91
K1(P2(1),2)=7*7+7*6*2=133
...
"Отрицательная" последовательность
K2(P2(1),0)=7*11+7*6*0=77
K2(P2(1),1)=7*11+7*6*1=119
K2(P2(1),2)=7*11+7*6*2=161
...

Числа , которые учавствуют в "положительной" и "отрицательной" последовательностях вычёркиваются из последовательностей P1 и P2. Например, число 25 - первое число последовательности K1(P1(1),0), значит мы его вычёркиваем из ряда - число P2(4).
И так далее.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39601525
кибальчиш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот и код. Прошу не пинать сильно - код сырой. Я его только вчера написал. Но в общем рабочий. :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39601558
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кибальчишПервые три миллиарда находит за 7 часов 10 минут. Хотелось бы ослышать оценку по скорости генерации по сравнению с решетом Эратосфена.
В первом посте писал:
Dima Tасинхронный до 3 млрд. за 15 сек считает
Окончательный вариант быстрее в 3 раза.

Ссылки в первом посте на исходники умерли, залил на гитхаб.
next_prime32.h
next_prime64.h
Генератор простых чисел в заданном диапазоне

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

Надо-бы сравнить результат.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39601603
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ одном из prime-топиков у нас были контрольные таблицы с точным подсчетом
primes на интервалах целых чисел. Правда не могу вспомнить ссылку.

Надо-бы сравнить результат.
У меня генератор считает количество в диапазоне.
Проверил выборочно, эти сходятся:
кибальчиш982451653 cnt:50000000
2038074743 cnt:100000000
11037271757 cnt:500000000
22801763489 cnt:1000000000
47055833459 cnt:2000000000
71856445751 cnt:3000000000
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39602433
кибальчиш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
Спасибо. Ещё не мог бы ты сообщить время за которое твой генератор находит первые 3 миллиарда простых чисел ?
В общем, похоже что метод рабочий, перспективный, но в моей реализации на ассоциативном массиве не достаточно быстро пока получается. Если бы этот принцип переделать по аналогии с решетом на битовые операции - возможно он бы и решето с аткинами по скорости обогнал.
Да и возможности для распараллеливания здесь есть. Таблица считается один раз , а дальше запустить параллельные процессы на количество под-диапазонов равных количеству доступных процессоров . Должно дать линейное увеличение по скорости.
Как считаете ?
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39602508
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кибальчишDima T,
Спасибо. Ещё не мог бы ты сообщить время за которое твой генератор находит первые 3 миллиарда простых чисел ?
В один поток 142 сек. Проц i7-6700K 4 ГГц
Код: plaintext
Count 3000000000 primes. Time: 142155 msec. Speed: 21103K/sec

Можешь сам скомпилировать, если позапускать есть желание, проект для MSVC . Могу собранный exe дать сюда если надо.

кибальчишВ общем, похоже что метод рабочий, перспективный, но в моей реализации на ассоциативном массиве не достаточно быстро пока получается. Если бы этот принцип переделать по аналогии с решетом на битовые операции - возможно он бы и решето с аткинами по скорости обогнал.
Поизучал твой алгоритм. По сути алгоритм похож на Эратосфена: имеем исходный набор потенциальных простых чисел и с помощью очередного простого числа вычеркиваем непростые.
ИМХО Эратосфен выглядит проще, т.е. операций меньше надо сделать. Сомневаюсь что обогнать его сможешь.

Главный тормоз у тебя в ассоциативном массиве. Я биткарту использовал вместо него.

кибальчишДа и возможности для распараллеливания здесь есть. Таблица считается один раз , а дальше запустить параллельные процессы на количество под-диапазонов равных количеству доступных процессоров . Должно дать линейное увеличение по скорости.
Как считаете ?
Эратосфен тоже хорошо параллелится. В четыре потока вчетверо быстрее.
Код: plaintext
Count 3000000000 primes. Time: 35602 msec. Speed: 84262K/sec
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39602588
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кибальчишПринцип простой. Все простые числа или их произведения принадлежат двум последовательностям:

1) P1(i)=6*i-1, где i=1,2,....n (n стремится к бесконечности)
2) P2(i)=6*i+1, где i=1,...n
...
Далее, каждое новое простое число генерирует две другие бесконечные последовательности. Так называемые "положительные" последовательности вида (m стремится к бесконечности)
K1(j) = P1(i)*P1(i)+P1(i)*6*j где j=0,1,2,....m
и "отрицаетльные" последовательности вида
K2(j)=P1(i)P2(i)+P1(i)*6*j где j=0,1,2,...m
Долго вникал, но в итоге считаю что это форсированный Эратосфен. В отличии от оригинала тут пропускаются все числа кратные 2 и 3, за счет чего в идеале 6-тикратное ускорение, реально меньше, т.к. доп. операции появляются.

Перечитал свой код - он именно так и работает, пропускает кратные 2 и 3. Правда я своим путем до этого дошел, поэтому код получился слабочитаемым, если мягко сказать :)
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39602694
кибальчиш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Можно назвать этот метод "форсированным Эратосфеном".
Но по моему, это Эратосфен да не совсем.
Я набросал небольшой примерчик в Экселе поиска всех простых чисел до 102.
Посмотри. Группируем числа в группы по 6. Тогда искомые простые числа оказываются в колонках 1 и 5 - и так до бесконечности.
Далее - берём первое простое число 5. Оно образует две последовательности:
Отрицательную - 35, 65, 95, 125,... (жёлтенькая)
Положительную - 25,55,85,115,... (красненькая)
На основании этого - вычёркиваем из зелёных колонок 25,35,55,65,85,95 до конца нашего диапазона в 102.
Берём второе число - 7. Оно образует две последовательности:
Отрицательную - 77,119, 161, 203,... ( коричневая)
Положительную - 49,91, 133,175,... (синяя)
На основании этого - вычёркиваем из зелёных колонок 49,77,91

Итого после вычёркивания четырёх последовательностей остаются :
5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101 - все простые числа.

В общем получается, что весь диапазон до 100 задан всего двумя простыми числами 5 и 7.
Мы применили всего 9 вычёркиваний.
Теперь сравни с количеством вычёркиваний на анимации вот в этой статье на вики:

https://ru.wikipedia.org/wiki/Решето_Эратосфена

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

Посмотри последовательности для 5 и 7 в оригинальном Эратосфене:
Код: plaintext
1.
25 30 35 40 45 50 55 60 65 70 75 80 85 90 95
49 56 63 70 77 84 91 98

Красным выделил те числа что ты использовал. Заметь, все что пропущено кратно 2 или 3.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39603384
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если решето считать кусками равными 2Гб (для удобства) то.
Количество бит (простых чисел) которые можно уложить в интервал равно 17 179 869 184.
Пока без учота четных и кратных тройкам.

На последнем чанке для целых диапазона int64, по формуле плотности вероятности
простых чисел на интервале от 9 223 372 019 674 906 623 до 9 223 372 036 854 775 807
мы получаем примерно 384 408 416 простых чисел. Соотношение primes к общему количеству
целых в чанке будет примерно 0.022.

Грубо говоря на каждые 50 бит целых чисел приходится 1 бит prime. Не очень рациональный
способ укладки данных. Кроме того итератор по данной биткарте будет иметь не очень
хороший КПД.

И хотя сомнительно что кто-то из нас досчитает до последних интервалов, все равно
тема расхода памяти меня интересует.

Какова должна быть структура данных чтобы обеспечить проверку на простоту (prime-test)
а также обеспечение интерфейса итерации.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39603486
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа последнем чанке для целых диапазона int64 , по формуле плотности вероятности
простых чисел на интервале от 9 223 372 019 674 906 623 до 9 223 372 036 854 775 807
мы получаем примерно 384 408 416 простых чисел. Соотношение primes к общему количеству
целых в чанке будет примерно 0.022.

Грубо говоря на каждые 50 бит целых чисел приходится 1 бит prime. Не очень рациональный
способ укладки данных.
Уместить 64 бита в 50 уже компактно. Пропуск четных делается элементарно, поэтому считай не в 50, а 25.
25 бит на значение это очень хороший результат. Лучше чем массив.

Насчет итератора: если нужен последовательный доступ, то удобнее хранить разницу между соседними, тогда 1 байта достаточно на значение.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39603548
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я помню наши эксперименты по хранению. В данной задаче меня интересовало два пункта.
- определение простоты числа
- факторизация большого числа
эти задачи связанны и постоянно перетекают из одной в другую. Задача генерации решета - решает
половину вопроса. Как оптимально хранить результат? Нужно-ли хранить? Как поддержать Iterable<Number>?

Прошло много лет. Я с тех пор периодически возвращаюсь к этой теме.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39603585
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как они так шустренько факторизируют? Здесь https://www.alpertron.com.ar/ECM.HTM

Вбил достаточно толстое число и получил разложение за доли секунды.

999999 139457 198374 509187 352837 465872 364875 628743 (48 digits) = 13 × 71 × 301153 × 740 107003 × 1 019694 655739 × 4 767010 128311 620141

Особенно последний множитель. Он - достаточно велик чтобы просто так его быстро разложить.

Рабин-Миллер? Нет. Он вроде только определяет факт простоты. И то с вероятностью.
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39603690
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот как они так шустренько факторизируют?

Если ткнуть в кнопку "Help", то там будет и описание и ссылка на исходник.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Генератор простых чисел (до 10^9 за 5 сек)
    #39603729
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угум. Читаю.
...
Рейтинг: 0 / 0
402 сообщений из 402, показаны все 17 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Генератор простых чисел (до 10^9 за 5 сек)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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