recsercp ============================================== Purpose ---------------- Computes a recursive series involving products. Can be used to compute cumulative products, to evaluate polynomials using Horner's rule, and to convert from base *b* representations of numbers to decimal representations among other things. Format ---------------- .. function:: y = recsercp(x, z) :param x: data :type x: NxK or 1xK matrix :param z: data :type z: NxK or 1xK matrix :return y: Each column is a series generated by a recursion of the form: :: y(1) = x(1) + z(1) y(t) = y(t - 1) * x(t) + z(t), t=2,...N :rtype y: NxK matrix Examples ---------------- :: // Scalar x x = 4; // C c = { 3, 4, -2, 6, 4, 2 } ; // Used to normalize first element in c c1 = c[1, .]; // Compute a recursive series y = recsercp(x, trimr(c ./ c1, 1, 0)); // Last element in p // transformed for normalization n = rows(c) - 1; p = c1 .* y[n, .]; If *x* is a scalar and *c* is an (N+1)x1 vector, the result *p* will contain the value of the polynomial whose coefficients are given in *c*. That is: :: p = c[1,.].*x^n + c[2,.].*x^(n-1) + ... + c[n+1,.]; Note that both *x* and *c* could contain more than 1 column, and then this code would evaluate the entire set of polynomials at the same time. Note also that if *x* = 2, and if *c* contains the digits of the binary representation of a number, then *p* will be the decimal representation of that number. Remarks ------- The following GAUSS code could be used to emulate :func:`recsercp` when the number of rows in *x* and *z* is the same: :: /* assume here that rows(z) is also n */ n = rows(x); y = zeros(n, 1); y[1,.] = x[1,.] + z[1,.]; i = 2; do until i > n; y[i, .] = y[i-1, .] .* x[i, .] + z[i, .]; i = i + 1; endo; Note that :math:`K` series can be computed simultaneously, since *x* and *z* can have :math:`K` columns (they must both have the same number of columns). :func:`recsercp` allows either *x* or *z* to have only 1 row. ``recsercp(x, 0)`` will produce the cumulative products of the elements in *x*. .. seealso:: Functions :func:`recserar`, :func:`recserrc`, :func:`recserVAR`