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

NEW 08.11.06 12:49
в ответ 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
в ответ 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 13:04
в ответ Murr 08.11.06 12:59
Код не требуется, была приведена оценка количества операций сверху.
Считаю Вас неблагородным человеком, не умеющим держать слово и от дальнейшей полемики отказываюсь. Ящик пива "Гиннес", который Вы мне проиграли, дарю любому из участников этого форума, который сможет его из Вас выдоить
.
Считаю Вас неблагородным человеком, не умеющим держать слово и от дальнейшей полемики отказываюсь. Ящик пива "Гиннес", который Вы мне проиграли, дарю любому из участников этого форума, который сможет его из Вас выдоить

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

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

NEW 08.11.06 17:55
Каким образом? Мы генерируем простые числа начиная с трёх...
Вот собственно -
Вот собственно -
В ответ на:
#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
Итого:: если бы песня про четыре порядка была правильной, то решето в этом случае потребовало бы меньше, чем 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 сидишь?

