Если вы раскладываете части и распечатываете их, вы заметите, что это просто термины, созданные с использованием кратких векторизованных терминов:
! given: (/(expr, start, end)/)
!
! (/(-1, i1=1, m-1)/) = vector, -1 repeated m-1 times
!
! (/(i1, i1=2, m)/) = vector, 2..m
!
! Both are vectors with m-1 terms
Еще одна вещь, которую стоит отметить, - product()
не требует 3 аргументов,Второй аргумент (используемое измерение) и третий аргумент (маска массива) не требуются.
На этом этапе становится ясно, что первый продукт на самом деле -1
m-1
и вторым произведением является m!
.
Таким образом, правильный (но не обязательно эффективный) перевод может быть:
// product((/(-1,i1=1,m-1)/)) => -1^m-1
double i = (m % 2 == 0 ? -1 : 1);
// product((/(i1,i1=2,m)/)) => m!
double mfact = i;
for (int jj = 2; jj < m; ++jj)
{
mfact *= jj;
} // C1 = mfact;
Сжатый, близкий по «духу» с F90, но вряд ли эффективен:
double i = (m % 2 == 0 ? -1 : 1);
double C1 = Enumerable.Range(2, m)
.Aggregate(i, (x, y) => x * y);