Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2016, 16:36   #11
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
За прошлый день у меня обработалось больше 17 000 000 чисел, из которых больше 1 000 000 оказалось простыми
За целый день??? Обалдеть... Вы на арифмометре "Феликс" их вычисляете?
У меня старенький ноутбук и вот результаты (правда я своим способом это делала, причем вывод шел непрерывно, а я в это время спокойно пользовалась интернетом и играла в "Косынку"):
Изображения
Тип файла: png Снимок1.png (4.9 Кб, 79 просмотров)

Последний раз редактировалось kropotkina-alice; 08.12.2016 в 16:38.
kropotkina-alice вне форума Ответить с цитированием
Старый 08.12.2016, 16:36   #12
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Аватар Ниффигасе скорость... 0.12 сек. до 1 000 000 000...
Но это же хитрым путём сделанная продвинутая программка Жаль, числа не выводит.
Если я реализую решето в изначальном виде, модифицированном только началом с квадрата, мне всё равно до такого будет как черепахе до ракеты ) Но уже стало ещё интереснее всё-таки хоть как-то реализовать этот метод. Путём, доступным моему текущему пониманию.
Ship_1 вне форума Ответить с цитированием
Старый 08.12.2016, 16:39   #13
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

kropotkina-alice Ключевая фраза:
Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
(правда я своим способом это делала):
Каким способом делал я - вы видите. Не думаю, чтобы этим же (моим) способом Вы достигли бы своих скоростей. Если не жалко, поделитесь своим.

Последний раз редактировалось Ship_1; 08.12.2016 в 16:43.
Ship_1 вне форума Ответить с цитированием
Старый 08.12.2016, 16:50   #14
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Конечно не жалко...
Ни потоков, ни каких-либо малодоступных для понимания хитрых приемов - все решается "в лоб":
Код:
  tb,te: TTime;

implementation

{$R *.dfm}

function prostoe_chislo (n : Int64) : boolean;
var  r: Int64;
begin
if n<2 then
 result:=false
else
 begin
  r:=2;
  result:=true;
  while (r*r<=n)and result do
  if n mod r=0 then
   result:=false else
    inc(r);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.ScrollBars:=ssVertical;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: longint;
begin
Memo1.Clear;
tb:=Time;
for i:=2 to StrToInt(Edit2.Text) do
 if prostoe_chislo(i) then
  Memo1.Lines.Add(IntToStr(i));
te:=Time;
ShowMessage('На вычисление'+IntToStr(Memo1.Lines.Count)+' простых чисел из '+Edit2.Text+' затрачено '+IntToStr(Round(100000*(te-tb)))+' секунд');
end;

Последний раз редактировалось kropotkina-alice; 08.12.2016 в 17:06.
kropotkina-alice вне форума Ответить с цитированием
Старый 08.12.2016, 16:58   #15
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

kropotkina-alice Спасибо! Поанализирую по дороге домой что тут происходит и почему я до такого не додумался
Хотя после 50 000 у меня окно зависло пока не доделало всё до конца.
UPD:
Подумал. Получается, что вы каждое число просто делите на каждое число, меньшее его половины? Не удивительно, что я не догадался до этого способа. Вроде, у меня практически то же, но я делю только на простые числа. Не думал, что обращение к списку настолько тормозит процесс, что простой перебор всех чисел подряд будет намного быстрее...
Кстати, добавляя к TStringList найденные числа, а не выводя их сразу в Memo у меня результат поиска до 17 000 000 составил 67 секунд.
Спасибо Вам!
Вот дела-то...

Последний раз редактировалось Ship_1; 08.12.2016 в 18:00.
Ship_1 вне форума Ответить с цитированием
Старый 08.12.2016, 19:25   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а попробуйте ещё такой алгоритм:
Код:

function isPrime(X: LongInt): boolean;
var i, lim: integer;
Begin
     isPrime:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     lim := trunc(sqrt(x));
     while i <= lim do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrime:=true;
End;
просто для сравнения.

p.s. ну а решето должно быть ещё намного быстрее
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.12.2016, 14:00   #17
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Serge_Bliznykov Спасибо, тоже попробую.
По методу kropotkina-alice за пару часов проходит около 500 млн.

Но я таки реализовал решето Эратосфена!
Разбил процесс на этапы:
1. формирование булевской матрицы
2. само вычисление
До 17 млн второй этап занял пол секунды!
Т.к. вывод простых чисел до 17 млн уже подтормаживал - решил и его выделить в отдельный этап:
3. вывод результата.

Ввёл в Edit миллиард.
Формирование матрицы заняло пол секунды.
Поиск простых чисел занял 12.3 секунды!!
А вот на выводе в Memo выкинулась проблема с памятью...
Тогда решил выводить прямо в текстовый файл (AssignFile -> Rewrite -> Writeln -> CloseFile). На всякий случай подцепил ProgressBar (меняя его раз в 10 тыс.циклов).
Вывод в файл занял практически 34 секунды

Теперь вот не знаю чем этот файл открыть. ) Блокнот зависает. Ворд вообще сказал, что не работает с файлами, большими 512 МБ. А мой файлик получился 527 МБ.

Вопрос на засыпку: а как, всё-таки, вывести их теперь в программке для просмотра?
Ship_1 вне форума Ответить с цитированием
Старый 09.12.2016, 14:27   #18
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего в нем интересного, чтобы пялиться на него? А вообще можно не целиком его в память, а кусками читать. Все равно сразу все не увидеть. А если смотреть на них, то интересно смотреть как-то графически, что бы визуально подмечать закономерности распределения. Например разворачивая их по спирали или еще как. Глядишь и закономерность распределения найдешь. Это покруче теоремы Ферма будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.12.2016, 15:33   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

хотите поднять скорость НЕ меняя алгоритма программы? конечно это не будет так кардинально, как при смене алгоритма, но все же...

избавляемся от постоянных StrToint.

1.
Цитата:
Код:
  while (i <= StrToInt(Form1.Edit1.Text)) and IsWork do
Код:
TOneMoreThread=class(tthread)
  public
    FmaxProvChis: integer; //будем хранить в потоке верхнюю границу нашего поиска
....

  while (i <= FmaxProvChis) and IsWork do
ну и кнопочка на форме где будет задание этой границы (можно конечно обойтись и БЕЗ кнопки, но пусть будет кнопка)
Код:
 OneMoreThread.FmaxProvChis:=strtoint(Edit1.Text);
и не забывать задать(или изменить) эту границу при запуске потока.

P.S. заодно исключили одно использование Form1 в потоке.

2.
Цитата:
Код:
     if i mod StrToInt(prochis[j]) = 0 then
TStringList имеет свойство для хранения "личных" данных каждой строки Objects[].
правда оно имеет не совсем тот тип данных, но да это не беда.

Код:
     if i mod integer(prochis.Objects[j]) = 0 then
и конечно же если мы этим хотим пользоваться, то его надо и заполнять.

Код:
      prochis.Add(IntToStr(i));
      prochis.AddObject(Inttostr(i), TObject(i));
заполнять надо не только при нахождении нового числа, но и при старте программы (чтении из файла).
и в этом случае без цикла чтения уже никак не обойдешься.
LoadFromFile не будет этого делать(заполнять свойство Objects[]).
хотя можно сначала сделать LoadFromFile а потом пройтись в цикле и cделать
Код:
prochis.LoadFromfile(...);
for j:=0 to prochis.count-1 do 
   prochis.Objects[j]:=TObject(strtoint(prochis.Strings[j]));
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.12.2016 в 15:51.
evg_m вне форума Ответить с цитированием
Старый 27.12.2016, 16:26   #20
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Вот только не пойму как теперь шагнуть за пределы integer.
С int64 не хочет работать for и скорость создания первичной матрицы уменьшилась в 4 раза при переходе на while.

Последний раз редактировалось Ship_1; 27.12.2016 в 17:23.
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно обезопаситься от этого faarigia Безопасность, Шифрование 2 11.02.2015 20:08
FileMapping. Работа с большим количеством страниц munthrekosh Общие вопросы Delphi 1 25.05.2012 22:26
Работа с большим массивом данных Freimaks Общие вопросы Delphi 21 20.04.2012 18:37
Работа с большим количеством текста в String иTextbox Дмитрий999 Visual C++ 0 20.02.2012 20:07
работа с большим объемом данных Ckif Microsoft Office Excel 1 14.09.2010 17:05