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`