русский
Germany.ruForen → Архив Досок→ Programmierung

Поиск простого числа

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

Фактор четыре не спасёт гиганта мысли. Где мой Гиннес ?
#22 
Murr коренной житель08.11.06 12:49
Murr
NEW 08.11.06 12:49 
in Antwort barmaglot 08.11.06 12:27
Фактор четыре...
------
Ну хорошо.
Требование - найти простые числа в пределах... ну скажем... хммм... 2^82
Пиши оба варианта. Оптимизируй. Выставляй на общее обозрение для убивания неэффективностей... результаты - сравним, оценим, так сказать, фактор...
P.S. 2^82 дано с учем того, что какой-то из компайлеров поддерживает тип 2^80
#23 
taksos завсегдатай08.11.06 12:50
taksos
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
мне пока не до идеальности алгоритма, хочу добиться чтобы он работал
я программированием занимаюсь с гулькин нос, так что не ругайте сильно
#24 
barmaglot местный житель08.11.06 12:53
barmaglot
NEW 08.11.06 12:53 
in Antwort Murr 08.11.06 12:49
Батюшки, Любезный, до Вас не ещё дошло? Спор был о том, что в рамках типа интеджер четыре порядка -- гон. Убедительно доказано. Спор окончен, трёп прродолжается. А пиво -- где?
Прямой вопрос:: пиво -- будет? Или словоблудство одно?
#25 
Murr коренной житель08.11.06 12:56
Murr
NEW 08.11.06 12:56 
in Antwort taksos 08.11.06 12:50

if prov(num)=true then a:=num;
-----
??? - что такое 'a' в этом контексте?
опечатка, там должно стоять a
=====
???
Думай снова над этой же строкой. И посмотри на замечание Скорпи - по поводу 4-й строки.
#26 
Murr коренной житель08.11.06 12:59
Murr
NEW 08.11.06 12:59 
in Antwort barmaglot 08.11.06 12:53
Так оно, любезный, ОДИНАКОВО, что для 32-х, что для 82-х... в последнем случае только лишь эффективно подчеркивается разница во времени вычислений...
Прямой вопрос:: пиво -- будет?
------
А код?
#27 
taksos завсегдатай08.11.06 13:00
taksos
NEW 08.11.06 13:00 
in Antwort barmaglot 08.11.06 12:53
ясно, уменьшим порядок числа, можно тогда использовать extended
п.с. это была не лпечатка форум не отбражает квадратные скобки и что в них (а "квадратная скобка" b "квадратная скобка" )
#28 
barmaglot местный житель08.11.06 13:04
barmaglot
NEW 08.11.06 13:04 
in Antwort Murr 08.11.06 12:59
Код не требуется, была приведена оценка количества операций сверху.
Считаю Вас неблагородным человеком, не умеющим держать слово и от дальнейшей полемики отказываюсь. Ящик пива "Гиннес", который Вы мне проиграли, дарю любому из участников этого форума, который сможет его из Вас выдоить .
#29 
Simple Nothing is f*cked08.11.06 13:05
Simple
NEW 08.11.06 13:05 
in Antwort taksos 08.11.06 13:00
Пользуйся тэгом pre.
#30 
Murr коренной житель08.11.06 13:11
Murr
NEW 08.11.06 13:11 
in Antwort taksos 08.11.06 13:00
В том же месте тебе нужно использовать не b, а отдельную переменную, которая увеличивается после добавления числа в массив.
#31 
Murr коренной житель08.11.06 13:17
Murr
NEW 08.11.06 13:17 
in Antwort barmaglot 08.11.06 13:04
Код не требуется, была приведена оценка количества операций сверху.
-----
на первом пне, для 32-битных целых, де факто, время счета при помощи деления - более двух месяцев, а Решетом - менее пяти дней... разница таки более трех порядков... хотя и двоичных...
P.S. Если не сложно - где именно было принято пари? Бо, в заведомо выигрышных(проигрышных) ситуациях Я не спорю...
#32 
taksos завсегдатай08.11.06 15:44
taksos
NEW 08.11.06 15:44 
in Antwort Murr 08.11.06 13:11
Murr, спасибо доделал, теперь нормально работает, сейчас буду делать с решетом Эратосфена
#33 
  scorpi_ скептик08.11.06 17:24
08.11.06 17:24 
in Antwort Murr 08.11.06 13:17
Результат щас будет. Я тут решил миллионное простое число посчитать. Решетом - 0.92с (на Athlon64 3000+), а вот когда будет готова бармаглотова версия... минут 5 она уже считает. Пиво пополам?
#34 
Murr коренной житель08.11.06 17:26
Murr
08.11.06 17:26 
in Antwort scorpi_ 08.11.06 17:24, Zuletzt geändert 08.11.06 17:28 (Murr)
Забирай целиком - я пиво не пользую, а Хеннесси он не предлагал...
Когда? Думаю, что не ранее послезавтра...
#35 
  scorpi_ скептик08.11.06 17:33
NEW 08.11.06 17:33 
in Antwort Murr 08.11.06 17:26
Ну, если за час не кончит, поставлю число поменьше... Или на ночь запущу. Три порядка - 16 минут, четыре - 3 часа. Но судя по расходу памяти она только к 400 тысячам подбирается Это за 14 минут. А дальше ведь только хуже будет...
#36 
Murr коренной житель08.11.06 17:43
Murr
NEW 08.11.06 17:43 
in Antwort scorpi_ 08.11.06 17:33
Я ведь реальные цифирьки по времени приводил.
#37 
Murr коренной житель08.11.06 17:50
Murr
NEW 08.11.06 17:50 
in Antwort scorpi_ 08.11.06 17:24
Решетом - 0.92с
----
Эээ... если ты шел "снизу", т.е. от 0 к 10^6, то можно еще примерно 0.10-0.15 снять идя"сверху", от миллиона... чисто за счет отсутствия сравнения с верхним пределом... и нулем...
#38 
  scorpi_ скептик08.11.06 17:55
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;
}

#39 
  scorpi_ скептик08.11.06 18:04
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-битовый
#40 
1 2 3 alle