Замечания и предложения


#1471

А как тогда будет работать что-то вроде этого?

ArrGen(100, 2000000000, x -> x + 1).Where(x -> x.IsPrime).Print;

#1472
  // отдельный класс чтоб таблицу инициализировало только при вызове 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.

#1473

Можно пойти ещё дальше и делители брать из таблицы. Если закончатся, добавлять новые простые числа в таблицу. Тогда должно работать очень быстро. Думаю, для integer вполне достаточно.


#1474

Нет, это плохо. Это бесконтрольное увеличение буфера, который невозможно отчистить или даже мониторить.


#1475

А, до меня только сейчас дошло, если инициализировать готовым списком элементов - они же всё равно загружаются в оперативную память вместе с остальной сборкой. При чём в очень не эффективном виде. Переделал, теперь таблица инициализируется алгоритмом. Не самым эффективным, потому что там не важно, его всё равно только 1 раз выполнит.


#1476

Это так и надо. Program1 - плохое имя программы. Давайте более осмысленные имена.


#1477

А можно в файл писать. Туда вообще много чисел влезет. А потом сразу файл сканировать


#1478

Надеюсь, это сейчас была шутка. Даже если не весь сканировать а сделать структуру вроде содержимого HashSet, чтоб сложность проверки была O(1) - это всё равно того не стоит.

И - лучше скажите что насчёт варианта что я предоставил.


#1479

Мы не будем делать эту функцию в стандартную библиотеку


#1480

Полагаю, что имеется вариант сделать подобные функции отдельным подключаемым модулем, подобным BlockFileOfT, поскольку PABCSystem уже перегружен - в нём имеется много различного функционала. Можно, конечно, добавлять в стандартный модуль, но в конце концов подобная стратегия приведёт к тому, что PABCSystem станет невозможно поддерживать из-за большого объема кода.


#1481

И это методически очень правильно. Ни в одном известном мне языке ядро не содержит подобных вещей - только подключаемые библиотеки. Для какого типа данных включать IsPrime? Для uint64? Чтобы числа подобного размера проверить на простоту по указанному алгоритму понадобится приличное время. И еще, почему включать IsPrime, но не включать, к примеру, IsFibonacci? IsSquare? Можно столько всего понавключать… Но не получится ли, как в известном анекдоте “… А теперь пристегните ремни, пожалуйста, и мы попытаемся со всей этой фигнёй взлететь” ?


#1482

Печально, что некоторые даже толковые выпускники школ, гимназий и лицеев не видят проблемы в том, чтобы зная число Х, написать функцию проверки на чётность квадрат этого числа …


#1483

А для чего это надо? Четность квадрата числа n совпадает с четностью самого числа n.