А как тогда будет работать что-то вроде этого?
ArrGen(100, 2000000000, x -> x + 1).Where(x -> x.IsPrime).Print;
А как тогда будет работать что-то вроде этого?
ArrGen(100, 2000000000, x -> x + 1).Where(x -> x.IsPrime).Print;
// отдельный класс чтоб таблицу инициализировало только при вызове IsPrime
IsPrimeHelper = static class
static first_before_1000: HashSet<integer>;
static constructor;
begin
first_before_1000 := new HashSet<integer>(256);
for var i := 2 to 1000 do
if not first_before_1000.Any(k->i mod k = 0) then
first_before_1000 += i;
end;
end;
function IsPrime(self: integer): boolean; extensionmethod;
begin
if self <= 1 then exit;
if self < 1009 then
begin
Result := IsPrimeHelper.first_before_1000.Contains(self);
exit;
end;
foreach var prev_prime in IsPrimeHelper.first_before_1000 do
if self mod prev_prime = 0 then exit;
var i := 1009;
while i * i <= self do
begin
if self mod i = 0 then exit;
i += 2;
end;
Result := true;
end;
begin end.
Можно пойти ещё дальше и делители брать из таблицы. Если закончатся, добавлять новые простые числа в таблицу. Тогда должно работать очень быстро. Думаю, для integer вполне достаточно.
Нет, это плохо. Это бесконтрольное увеличение буфера, который невозможно отчистить или даже мониторить.
А, до меня только сейчас дошло, если инициализировать готовым списком элементов - они же всё равно загружаются в оперативную память вместе с остальной сборкой. При чём в очень не эффективном виде. Переделал, теперь таблица инициализируется алгоритмом. Не самым эффективным, потому что там не важно, его всё равно только 1 раз выполнит.
Это так и надо. Program1 - плохое имя программы. Давайте более осмысленные имена.
А можно в файл писать. Туда вообще много чисел влезет. А потом сразу файл сканировать
Надеюсь, это сейчас была шутка. Даже если не весь сканировать а сделать структуру вроде содержимого HashSet, чтоб сложность проверки была O(1) - это всё равно того не стоит.
И - лучше скажите что насчёт варианта что я предоставил.
Мы не будем делать эту функцию в стандартную библиотеку
Полагаю, что имеется вариант сделать подобные функции отдельным подключаемым модулем, подобным BlockFileOfT
, поскольку PABCSystem
уже перегружен - в нём имеется много различного функционала. Можно, конечно, добавлять в стандартный модуль, но в конце концов подобная стратегия приведёт к тому, что PABCSystem
станет невозможно поддерживать из-за большого объема кода.
И это методически очень правильно. Ни в одном известном мне языке ядро не содержит подобных вещей - только подключаемые библиотеки. Для какого типа данных включать IsPrime? Для uint64? Чтобы числа подобного размера проверить на простоту по указанному алгоритму понадобится приличное время. И еще, почему включать IsPrime, но не включать, к примеру, IsFibonacci? IsSquare? Можно столько всего понавключать… Но не получится ли, как в известном анекдоте “… А теперь пристегните ремни, пожалуйста, и мы попытаемся со всей этой фигнёй взлететь” ?
Печально, что некоторые даже толковые выпускники школ, гимназий и лицеев не видят проблемы в том, чтобы зная число Х, написать функцию проверки на чётность квадрат этого числа …
А для чего это надо? Четность квадрата числа n совпадает с четностью самого числа n.
Решил я потестить совместимость PABCSystem с C# и вот что обнаружил…
Методы, описание которых скрыто через //--
вообще не видны ни студией, ни декомпилятором. И использовать в C# их тоже не выходит.
Это баг или фича?
procedure Writeln(obj: object); и прочие с //--
недоступны. Документация ведь не должна влиять на уровень доступа?
А, разобрался. В класс PABCSystem добавляются только те методы, которые использованы в паскальном коде. Круто
Об этом уже разработчики писали, оппонируя некоторым любителям оптимизации кода. И @Admin, и @ibond.
@Admin добавьте пожалуйста строчку {$apptype windows}
в снипет wf
, а то не очень хорошо получается. И как я забыл добавить когда пулл для снипетов делал…
Добавил
PABCRtl.dll очень-очень крутая штука!
А можете сделать так, чтобы инициализация модулей находилась в статическом конструкторе класса модуля (к примеру, в модуле PABCSystem в типе PABCSystem.PABCSystem будет статический конструктор, вызывающий __ InitModule__)? Самому PascalABC.NET я не знаю как поможет это, но вот использовать модули паскаля на других .NET языках станет невероятно удобно!
Как когда-то сказал @Admin, модули PascalABC.NET - не рассчитаны на использование вне данного языка. И я поддерживаю данную точку зрения, поскольку при использовании вне PascalABC.NET (в C#
, например), на глаза попадаются детали реализации модулей (которые для начинающих не очевидны, и нигде не описаны).
Вспоминая о том, что PascalABC.NET - учебный язык, удобнее всего использовать учебные модули, заточенные под него, на нём же, ибо, повторюсь, в PascalABC.NET это делается максимально просто, без нужды объявлять класс и метод Main
, а для новичков лишние “заморочки” - не нужны.
Насколько востребована будет предлагаемая разработчикам фишка модулей? Вы же не поспорите с тем, что разработчики не делают ничего просто так?