Login
Поиск простого числа
NEW 08.11.06 12:21
in Antwort barmaglot 08.11.06 12:04
Теперь положим, что
------
Там, при делении, примерно 350 тактов, против 16 при сложении. Но, там не только деление...
Ну а вычеркивание (рассылка) - одна машинная команда, плюс еще три на подготовку следующей...
Видишь ли, во времена первого пня я прогнал оба варианта, предварительно оптимизировав их до предела...
------
Там, при делении, примерно 350 тактов, против 16 при сложении. Но, там не только деление...
Ну а вычеркивание (рассылка) - одна машинная команда, плюс еще три на подготовку следующей...
Видишь ли, во времена первого пня я прогнал оба варианта, предварительно оптимизировав их до предела...

NEW 08.11.06 12:27
Фактор четыре не спасёт гиганта мысли. Где мой Гиннес
?
in Antwort Murr 08.11.06 12:21
В ответ на:
... одна машинная команда, плюс еще три на подготовку следующей
... одна машинная команда, плюс еще три на подготовку следующей
Фактор четыре не спасёт гиганта мысли. Где мой Гиннес

08.11.06 12:49
in Antwort barmaglot 08.11.06 12:27
Фактор четыре...
------
Ну хорошо.
Требование - найти простые числа в пределах... ну скажем... хммм... 2^82
Пиши оба варианта. Оптимизируй. Выставляй на общее обозрение для убивания неэффективностей... результаты - сравним, оценим, так сказать, фактор...
P.S. 2^82 дано с учем того, что какой-то из компайлеров поддерживает тип 2^80
------
Ну хорошо.
Требование - найти простые числа в пределах... ну скажем... хммм... 2^82

Пиши оба варианта. Оптимизируй. Выставляй на общее обозрение для убивания неэффективностей... результаты - сравним, оценим, так сказать, фактор...

P.S. 2^82 дано с учем того, что какой-то из компайлеров поддерживает тип 2^80

NEW 08.11.06 12:50
in Antwort Murr 08.11.06 09:57
Отправитель: Murr
Заголовок: Re: Поиск простого числа
if prov(num)=true then a:=num;
-----
??? - что такое 'a' в этом контексте?
опечатка, там должно стоять a
мне пока не до идеальности алгоритма, хочу добиться чтобы он работал
я программированием занимаюсь с гулькин нос, так что не ругайте сильно
Заголовок: Re: Поиск простого числа
if prov(num)=true then a:=num;
-----
??? - что такое 'a' в этом контексте?
опечатка, там должно стоять a
мне пока не до идеальности алгоритма, хочу добиться чтобы он работал
я программированием занимаюсь с гулькин нос, так что не ругайте сильно
NEW 08.11.06 12:53
in Antwort Murr 08.11.06 12:49
Батюшки, Любезный, до Вас не ещё дошло? Спор был о том, что в рамках типа интеджер четыре порядка -- гон. Убедительно доказано. Спор окончен, трёп прродолжается. А пиво -- где?
Прямой вопрос:: пиво -- будет? Или словоблудство одно?
Прямой вопрос:: пиво -- будет? Или словоблудство одно?
NEW 08.11.06 12:56
if prov(num)=true then a:=num;
-----
??? - что такое 'a' в этом контексте?
опечатка, там должно стоять a
=====
???
Думай снова над этой же строкой. И посмотри на замечание Скорпи - по поводу 4-й строки.
in Antwort taksos 08.11.06 12:50
if prov(num)=true then a:=num;
-----
??? - что такое 'a' в этом контексте?
опечатка, там должно стоять a
=====
???
Думай снова над этой же строкой. И посмотри на замечание Скорпи - по поводу 4-й строки.

NEW 08.11.06 12:59
in Antwort barmaglot 08.11.06 12:53
Так оно, любезный, ОДИНАКОВО, что для 32-х, что для 82-х... в последнем случае только лишь эффективно подчеркивается разница во времени вычислений...
Прямой вопрос:: пиво -- будет?
------
А код?

Прямой вопрос:: пиво -- будет?
------
А код?

NEW 08.11.06 13:00
in Antwort barmaglot 08.11.06 12:53
ясно, уменьшим порядок числа, можно тогда использовать extended
п.с. это была не лпечатка форум не отбражает квадратные скобки и что в них (а "квадратная скобка" b "квадратная скобка" )
п.с. это была не лпечатка форум не отбражает квадратные скобки и что в них (а "квадратная скобка" b "квадратная скобка" )
NEW 08.11.06 13:04
in Antwort Murr 08.11.06 12:59
Код не требуется, была приведена оценка количества операций сверху.
Считаю Вас неблагородным человеком, не умеющим держать слово и от дальнейшей полемики отказываюсь. Ящик пива "Гиннес", который Вы мне проиграли, дарю любому из участников этого форума, который сможет его из Вас выдоить
.
Считаю Вас неблагородным человеком, не умеющим держать слово и от дальнейшей полемики отказываюсь. Ящик пива "Гиннес", который Вы мне проиграли, дарю любому из участников этого форума, который сможет его из Вас выдоить

NEW 08.11.06 13:11
in Antwort taksos 08.11.06 13:00
В том же месте тебе нужно использовать не b, а отдельную переменную, которая увеличивается после добавления числа в массив.
NEW 08.11.06 13:17
in Antwort barmaglot 08.11.06 13:04
Код не требуется, была приведена оценка количества операций сверху.
-----
на первом пне, для 32-битных целых, де факто, время счета при помощи деления - более двух месяцев, а Решетом - менее пяти дней... разница таки более трех порядков... хотя и двоичных...
P.S. Если не сложно - где именно было принято пари? Бо, в заведомо выигрышных(проигрышных) ситуациях Я не спорю...
-----
на первом пне, для 32-битных целых, де факто, время счета при помощи деления - более двух месяцев, а Решетом - менее пяти дней... разница таки более трех порядков... хотя и двоичных...

P.S. Если не сложно - где именно было принято пари? Бо, в заведомо выигрышных(проигрышных) ситуациях Я не спорю...

NEW 08.11.06 15:44
in Antwort Murr 08.11.06 13:11
Murr, спасибо доделал, теперь нормально работает, сейчас буду делать с решетом Эратосфена
NEW 08.11.06 17:24
in Antwort Murr 08.11.06 13:17
Результат щас будет. Я тут решил миллионное простое число посчитать. Решетом - 0.92с (на Athlon64 3000+), а вот когда будет готова бармаглотова версия... минут 5 она уже считает. Пиво пополам?

NEW 08.11.06 17:26
in Antwort scorpi_ 08.11.06 17:24, Zuletzt geändert 08.11.06 17:28 (Murr)
Забирай целиком - я пиво не пользую, а Хеннесси он не предлагал...
Когда? Думаю, что не ранее послезавтра...

Когда? Думаю, что не ранее послезавтра...

NEW 08.11.06 17:33
in Antwort Murr 08.11.06 17:26
Ну, если за час не кончит, поставлю число поменьше... Или на ночь запущу. Три порядка - 16 минут, четыре - 3 часа. Но судя по расходу памяти она только к 400 тысячам подбирается
Это за 14 минут. А дальше ведь только хуже будет...

NEW 08.11.06 17:43
in Antwort scorpi_ 08.11.06 17:33
NEW 08.11.06 17:50
in Antwort scorpi_ 08.11.06 17:24
Решетом - 0.92с
----
Эээ... если ты шел "снизу", т.е. от 0 к 10^6, то можно еще примерно 0.10-0.15 снять идя"сверху", от миллиона... чисто за счет отсутствия сравнения с верхним пределом... и нулем...
----
Эээ... если ты шел "снизу", т.е. от 0 к 10^6, то можно еще примерно 0.10-0.15 снять идя"сверху", от миллиона... чисто за счет отсутствия сравнения с верхним пределом... и нулем...

NEW 08.11.06 17:55
in Antwort Murr 08.11.06 17:50, Zuletzt geändert 08.11.06 18:13 (scorpi_)
Каким образом? Мы генерируем простые числа начиная с трёх...
Вот собственно -
Вот собственно -
В ответ на:
#include <iostream>
#include <vector>
#include <ctime>
const unsigned long MAX_PRIME = 0x19999998;
unsigned long get_prime_by_sieve( unsigned long number )
{
if ( number == 1 )
return 2;
std::vector<bool> sieve = std::vector<bool>( number * 10, 0 );
unsigned long i = 0;
size_t sieve_size = 2 * sieve.size();
for( unsigned long counter = 1; counter < number; ++counter )
{
while( sieve[ ++i ] );
unsigned int np = 2 * i + 1;
for( unsigned long j = np * np; j < sieve_size; j += np )
if ( j & 1 )
sieve[ j >> 1 ] = true;
}
return 2 * i + 1;
}
unsigned long get_prime_by_barmaglot( unsigned long number )
{
if ( number == 1 )
return 2;
std::vector<unsigned long> found_primes( 1, 2 );
found_primes.reserve( number * 10 );
unsigned long i = 3;
for( unsigned long counter = 1; counter < number; i += 2 )
{
unsigned long j = 0;
for( ; j < found_primes.size(); ++j )
if ( i % found_primes[j] == 0 )
break;
if ( j == found_primes.size() )
{
found_primes.push_back( i );
++counter;
}
}
return i - 2;
}
int main()
{
std::cout << "Berechnung der millionsten Primzahl" << std::endl;
clock_t start = clock();
unsigned long prime = get_prime_by_sieve( 1000000 );
double elapsed = (double)( clock() - start ) / CLOCKS_PER_SEC;
std::cout << "Sieve, Primzahl: " << prime << " time elapsed: " << elapsed << std::endl;
start = clock();
prime = get_prime_by_barmaglot( 1000000 );
elapsed = (double)( clock() - start ) / CLOCKS_PER_SEC;
std::cout << "Barmaglot, Primzahl: " << prime << " time elapsed: " << elapsed << std::endl;
}
NEW 08.11.06 18:04
in Antwort barmaglot 08.11.06 12:04, Zuletzt geändert 08.11.06 19:54 (scorpi_)
Итого:: если бы песня про четыре порядка была правильной, то решето в этом случае потребовало бы меньше, чем 1312 вычёркиваний.
Гыыыыы, извини, ты о теории сложности хоть какое-нибудь представление имеешь? Решето это O(n*log n), а твой алгоритм O(n^2), поэтому коэффициенты (которые весьма не в твою пользу, ибо в решете сплошь однотактовые операции, а у тебя дорогостоящее деление) считать излишне.
PS Сорри, не заметил ограничения по корням. Тогда O(n^1.5) - всё равно хуже чем O(n*log n).
PPS Я писал о числах, влезающих в интеджер, т. е. до порядка 32 тысяч. - всё ещё на 8086 сидишь?
Бедненьий... У меня так интеджер 64-битовый
Гыыыыы, извини, ты о теории сложности хоть какое-нибудь представление имеешь? Решето это O(n*log n), а твой алгоритм O(n^2), поэтому коэффициенты (которые весьма не в твою пользу, ибо в решете сплошь однотактовые операции, а у тебя дорогостоящее деление) считать излишне.
PS Сорри, не заметил ограничения по корням. Тогда O(n^1.5) - всё равно хуже чем O(n*log n).
PPS Я писал о числах, влезающих в интеджер, т. е. до порядка 32 тысяч. - всё ещё на 8086 сидишь?

