This repository has been archived on 2024-12-25. You can view files and clone it, but cannot push or open issues or pull requests.
2023-06-20 21:52:24 +03:00

57 lines
2.1 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
// lock не позволяет нескольким потокам одновременно выполнять эту секцию.
// Это обязательно, иначе если несколько потоков одновременно будут пытаться добавить значение в список, список может оказаться испорченным
// Секция, охраняемая lock, называется критической
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);
// ls.l := ls.l.OrderBy(x->x).ToList(); - это можно включить для проверки того, что в обоих списках - одинаковые простые числа
for var i:=0 to ls.l.Count-1 do
write(ls.l[i],' ');
// Надо обратить внимание, что выводится неупорядоченная последовательность простых чисел !
writeln;
writeln('Время выполнения = ',Milliseconds);
// То же, но непараллельно
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;
writeln('Время выполнения = ',Milliseconds-t);
// Проверка того, что списки простых как множества совпадают
writeln('Количество элементов в разности множеств = ',ls.l.Except(ls1.l).Count());
end.