powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Генератор простых чисел (до 10^9 за 5 сек)
25 сообщений из 402, страница 6 из 17
Генератор простых чисел (до 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
25 сообщений из 402, страница 6 из 17
Форумы / C++ [игнор отключен] [закрыт для гостей] / Генератор простых чисел (до 10^9 за 5 сек)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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