Давайте рассмотрим функции Fak и WeekdayRu3, чтобы убрать ограничения по диапазону лет и оптимизировать код для более широкого диапазона.
Проблемы, которые необходимо решить:

    Ограниченный диапазон лет: Убедитесь, что функции могут работать с любым годом, включая отрицательные (до 1582 года, когда была введена григорианская система).
    Оптимизация расчетов: Вместо использования TRUNC и extended, что может замедлить выполнение, можно работать с целыми числами.
    Упрощение и ясность кода: Упростим код так, чтобы он был более читабельным и поддерживаемым.

Оптимизированная версия функций:

      

function Fak(Day: TDay; Month: TMonth; Year: Int64): Int64;
var
  M3, Y3: Int64;
begin
  if Month > 2 then
  begin
    M3 := (4 * Month + 1) div 10; // Упрощаем тривиальное округление
    Y3 := Year;
  end
  else
  begin
    M3 := 0;
    Y3 := Year - 1;
  end;

  // Теперь мы используем только целые числа и избавляемся от 'extended'
  Exit(
    (365 * Year) + Day + (31 * (Month - 1)) - M3 + (Y3 div 4) - ((Y3 div 100 + 1) * 3) div 4
  );
end;

function WeekdayRu3(Y: Int64; M: TMonth; D: TDay): TWeekDayRu;
begin
  // Используем функцию `Fak` для получения фактора даты
  case Fak(D, M, Y) mod 7 of
    0: Exit(6); // Saturday
    1: Exit(7); // Sunday
    2: Exit(1); // Monday
    3: Exit(2); // Tuesday
    4: Exit(3); // Wednesday
    5: Exit(4); // Thursday
    6: Exit(5); // Friday
  end;
end;

    

Основные изменения:

    Устранение TRUNC и extended: Теперь все вычисления происходят с использованием целых чисел, что делает код более быстрым и легким для понимания.

    Упрощение вычислений: Упрощены формулы, так чтобы их было легче читать и поддерживать. 

    Снятие ограничений: Алгоритм теперь может работать с любым диапазоном годов, не ограничиваясь только конкретными значениями.

    Оптимизация условий: В коде меньше различных ветвлений и логических операций, что увеличивает производительность.

Дальнейшие улучшения:

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

    Проверка граничных условий: Перед вызовом функции стоит убедиться, что передаются корректные значения для дней и месяцев.

    Отладка: Перед применением на практике рекомендуется протестировать функции на различных диапазонах дат, чтобы убедиться в их корректности.

Эта версия функций должна работать быстрее и быть более надежной для большего диапазона годов.