2015-05-14 22:35:07 +03:00
|
|
|
|
uses
|
|
|
|
|
|
System, System.Net, System.Threading.Tasks, System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
ListSimple = class
|
|
|
|
|
|
l := new List<int64>();
|
|
|
|
|
|
procedure AddSimple(N: int64);
|
|
|
|
|
|
begin
|
|
|
|
|
|
var Result := True;
|
|
|
|
|
|
for var i: int64 := 2 to round(sqrt(N)) do
|
|
|
|
|
|
if N mod i = 0 then
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
break;
|
|
|
|
|
|
end;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// lock не позволяет нескольким потокам одновременно выполнять эту секцию.
|
|
|
|
|
|
// Это обязательно, иначе если несколько потоков одновременно будут пытаться добавить значение в список, список может оказаться испорченным
|
|
|
|
|
|
// Секция, охраняемая lock, называется критической
|
2015-05-14 22:35:07 +03:00
|
|
|
|
lock l do
|
|
|
|
|
|
if Result then
|
|
|
|
|
|
l.Add(N);
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
var hh := 1000;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
var ls := new ListSimple;
|
|
|
|
|
|
|
|
|
|
|
|
var ii: int64 := 1265713689181;
|
|
|
|
|
|
|
|
|
|
|
|
Parallel.For(ii,ii+hh,ls.AddSimple);
|
|
|
|
|
|
|
|
|
|
|
|
writeln(ls.l.Count);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// ls.l := ls.l.OrderBy(x->x).ToList(); - это можно включить для проверки того, что в обоих списках - одинаковые простые числа
|
2015-05-14 22:35:07 +03:00
|
|
|
|
for var i:=0 to ls.l.Count-1 do
|
|
|
|
|
|
write(ls.l[i],' ');
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Надо обратить внимание, что выводится неупорядоченная последовательность простых чисел !
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
writeln;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Время выполнения = ',Milliseconds);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// То же, но непараллельно
|
2015-05-14 22:35:07 +03:00
|
|
|
|
var ls1 := new ListSimple;
|
|
|
|
|
|
|
|
|
|
|
|
var t := Milliseconds;
|
|
|
|
|
|
for var i:=ii to ii+hh-1 do
|
|
|
|
|
|
ls1.AddSimple(i);
|
|
|
|
|
|
writeln(ls1.l.Count);
|
|
|
|
|
|
for var i:=0 to ls1.l.Count-1 do
|
|
|
|
|
|
write(ls1.l[i],' ');
|
|
|
|
|
|
writeln;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Время выполнения = ',Milliseconds-t);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Проверка того, что списки простых как множества совпадают
|
|
|
|
|
|
writeln('Количество элементов в разности множеств = ',ls.l.Except(ls1.l).Count());
|
2015-05-14 22:35:07 +03:00
|
|
|
|
end.
|