Часто суммирование можно преобразовать в замкнутое решение формы.Преобразование условного суммирования в решение закрытой формы
Например
for (int i=0;i<n;i++)
result += i;
эквивалентно result += max(0, n * (n - 1)/2)
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
result += i;
эквивалентно result += max(0, m * n * (n - 1)/2)
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
if (i < j)
result += i;
эквивалентно
for (int i=0;i<n;i++)
for (int j=i+1;j<m;j++)
result += i;
и, таким образом, эквивалентна
for (int i=0;i<n;i++)
if (i+1 < m)
result += i * (m-i);
и, таким образом, эквивалентна
for (int i=0;i<min(n,m-1);i++)
result += m * i - i * i;
и, таким образом, наконец, что эквивалентно result += max(0, m * min(n,m-1) * (min(n,m-1) - 1)/2 - (min(n,m-1) - 1) * ((min(n,m-1) - 1) + 1) * (2 * (min(n,m-1) - 1) + 1)/6)
или, возможно, легче записать как result += max(0, m <= n ? m * (m-1) * ((m-1) - 1)/2 - ((m-1) - 1) * (((m-1) - 1) + 1) * (2 * ((m-1) - 1) + 1)/6) : m * n * (n - 1)/2 - (n - 1) * ((n - 1) + 1) * (2 * (n - 1) + 1)/6)
Когда такое преобразование к закрытым возможно ли решение формы?
Кажется, что допускаются только условия, сложение и умножение (т. Е. Полиномы), всегда можно начинать с самого внутреннего цикла, отслеживать диапазон разрешенных min/max и добавленный многочлен.
Однако выполнение этого преобразования вручную является довольно склонным к ошибкам и потреблению времени, поскольку диапазоны разделены на каждый цикл и растут экспоненциально.
Есть ли инструмент для автоматического создания решения закрытой формы из итеративной версии?
Насколько тяжелее это становится, когда разрешено разделение?
for (int i=2;i<n;i++)
if (i % 2 == 0)
result += 1;
довольно легко, как for (int i=2;i<n;i+=2) result += 1;
и эквивалентно max(0, (n/2) * (n/2 + 1))
С другой стороны
for (int i=2;i<n;i++)
if (n % i == 0)
result += 1;
, кажется, очень трудно преобразовать.
Итак, что представляет собой хороший простой инструмент для конечного исчисления? Стандартный CAS? Но он, вероятно, не мог взять код C как входной – BeniBela