/solve_rec.texi/1.7/Tue Jan 16 15:15:10 2007//
@c /solve_rec.texi/1.7/Tue Jan 16 15:15:10 2007//
@menu
* Introdução a solve_rec::
* Definições para solve_rec::
@end menu

@node Introdução a solve_rec, Definições para solve_rec, solve_rec, solve_rec
@section Introdução a solve_rec

@code{solve_rec} é um pacote para resolver recorrências lineares com coeficientes
polinomiais.

Um ficheiro de domostração está disponivel com @code{demo(solve_rec);}.

Exemplo:

@example
(%i1) load("solve_rec")$
(%i2) solve_rec((n+4)*s[n+2] + s[n+1] - (n+1)*s[n], s[n]);
                                    n
                 %k  (2 n + 3) (- 1)          %k
                   1                            2
(%o2)       s  = -------------------- + ---------------
             n     (n + 1) (n + 2)      (n + 1) (n + 2)
@end example

@node Definições para solve_rec,  , Introdução a solve_rec, solve_rec
@section Definições para solve_rec

@deffn {Função} reduce_order (@var{rec}, @var{sol}, @var{var})

Reduz a ordem de recorrência linear @var{rec} quando uma solução particular
@var{sol} for conhecida. A recorrência reduzida pode ser usada para pegar outras soluções.

Exemplo:

@example
(%i3) rec: x[n+2] = x[n+1] + x[n]/n;
                                      x
                                       n
(%o3)               x      = x      + --
                     n + 2    n + 1   n
(%i4) solve_rec(rec, x[n]);
WARNING: found some hypergeometrical solutions! 
(%o4)                    x  = %k  n
                          n     1
(%i5) reduce_order(rec, n, x[n]);
(%t5)                    x  = n %z
                          n       n

                           n - 1
                           ====
                           \
(%t6)                %z  =  >     %u
                       n   /        %j
                           ====
                           %j = 0

(%o6)             (- n - 2) %u     - %u
                              n + 1     n
(%i6) solve_rec((n+2)*%u[n+1] + %u[n], %u[n]);
                                     n
                            %k  (- 1)
                              1
(%o6)                 %u  = ----------
                        n    (n + 1)!

So the general solution is

             n - 1
             ====        n
             \      (- 1)
       %k  n  >    -------- + %k  n
         2   /     (n + 1)!     1
             ====
             n = 0
@end example

@end deffn

@defvr {Variável de opção} simplify_products
Valor por omissão: @code{true}

Se @code{simplify_products} for @code{true}, @code{solve_rec} irá tentar
simplificar produtos no resultado.

Veja também: @code{solve_rec}.

@end defvr

@deffn {Função} simplify_sum (@var{expr})

Tenta simplificar todos os somatórios que aparecem na @var{expr} para uma forma a mais simplificada possível.

@code{simplify_sum} usa os algoritmos de Gosper e de Zeilberger para simplificar somatórios.

Para usar essa função primeiramente chame o pacote @code{simplify_sum} com
@code{load(simplify_sum)}.

Exemplo:

@example
(%i1) load("simplify_sum")$
(%i2) sum(binom(n+k,k)/2^k, k, 0, n) + sum(binom(2*n, 2*k), k, 0, n);
         n                            n
        ====                         ====
        \      binomial(n + k, k)    \
(%o2)    >     ------------------ +   >    binomial(2 n, 2 k)
        /               k            /
        ====           2             ====
        k = 0                        k = 0
(%i3) simplify_sum(%);
                               n
                              4     n
(%o3)                         -- + 2
                              2
@end example

@end deffn

@deffn {Função} solve_rec (@var{eqn}, @var{var}, [@var{init}])
Encontra soluções hipergeométricas para a recorrência linear @var{eqn} com
coeficientes polinomiais na variável @var{var}. Argumentos opcionais @var{init}
são as condições iniciais.

@code{solve_rec} pode resolver recorrências lineares com coeficientes constantes,
encontrando soluções hipergeométricas para recorrências lineares homogêneas com
coeficientes polinomiais, soluções racionais para recorrências lineares com
coeficientes polinomiais e pode resolver recorrências do tipo de Ricatti.

Note que o tempo de execução do algoritmo usado para encontrar soluções
hipergeométricas aumenta exponencialmente com o grau do coeficiente lider e
guia.

Para usar essa função primeiramente chame o pacote @code{solve_rec} com
@code{load(solve_rec);}.

Exemplo de recorrência linear com coeficientes constantes:

@example
(%i2) solve_rec(a[n]=a[n-1]+a[n-2]+n/2^n, a[n]);
                        n          n
           (sqrt(5) - 1)  %k  (- 1)
                            1           n
(%o2) a  = ------------------------- - ----
       n               n                  n
                      2                5 2
                                                n
                                   (sqrt(5) + 1)  %k
                                                    2    2
                                 + ------------------ - ----
                                            n              n
                                           2            5 2
@end example

Exemplo de recorrência linear com coeficientes polinomiais:

@example
(%i7) 2*x*(x+1)*y[x] - (x^2+3*x-2)*y[x+1] + (x-1)*y[x+2];
                         2
(%o7) (x - 1) y      - (x  + 3 x - 2) y      + 2 x (x + 1) y
               x + 2                   x + 1                x
(%i8) solve_rec(%, y[x], y[1]=1, y[3]=3);
                              x
                           3 2    x!
(%o9)                 y  = ---- - --
                       x    4     2
@end example

Exemplo de recorrência do tipo de Ricatti:

@example
(%i2) x*y[x+1]*y[x] - y[x+1]/(x+2) + y[x]/(x-1) = 0;
                            y         y
                             x + 1     x
(%o2)         x y  y      - ------ + ----- = 0
                 x  x + 1   x + 2    x - 1
(%i3) solve_rec(%, y[x], y[3]=5)$
(%i4) ratsimp(minfactorial(factcomb(%)));
                                   3
                               30 x  - 30 x
(%o4) y  = - -------------------------------------------------
       x        6      5       4       3       2
             5 x  - 3 x  - 25 x  + 15 x  + 20 x  - 12 x - 1584
@end example


Veja também: @code{solve_rec_rat}, @code{simplify_products}, e @code{product_use_gamma}.

@end deffn

@deffn {Função} solve_rec_rat (@var{eqn}, @var{var}, [@var{init}])

Encontra soluções racionais para recorrências lineares. Veja solve_rec para
uma descrição dos argumentos.

Para usar essa função primeirametne chame o pacote @code{solve_rec} com
@code{load(solve_rec);}.

Exemplo:

@example
(%i1) (x+4)*a[x+3] + (x+3)*a[x+2] - x*a[x+1] + (x^2-1)*a[x];
(%o1)  (x + 4) a      + (x + 3) a      - x a
                x + 3            x + 2      x + 1
                                                   2
                                               + (x  - 1) a
                                                            x
(%i2) solve_rec_rat(% = (x+2)/(x+1), a[x]);
                       1
(%o2)      a  = ---------------
            x   (x - 1) (x + 1)
@end example


Veja também: @code{solve_rec}.

@end deffn

@defvr {Variável de opção} product_use_gamma
Valor por omissão: @code{true}

Quando simplificando produtos, @code{solve_rec} introduz a função gama
dentro da expressão se @code{product_use_gamma} for @code{true}.

Veja também: @code{simplify_products}, @code{solve_rec}.

@end defvr

@deffn {Função} summand_to_rec (@var{summand}, @var{k}, @var{n})
@deffnx {Função} summand_to_rec (@var{summand}, [@var{k}, @var{lo}, @var{hi}], @var{n})

Retorna a recorrência satisfeita pelo somatório

@example
     sup
    ====
    \
     >     x
    /
    ====
  k = inf
@end example

onde x é hipergeométrico em @var{k} e @var{n}. SE @var{inf} e @var{sup}
forem omitidos, são assumidos como sendo @code{inf = -inf} e @code{sup = inf}.

Para usar essa função primeiro chame o pacote @code{simplify_sum} com
@code{load(simplify_sum)}.

Exemplo:

@example
(%i1) load("simplify_sum")$
(%i2) summand: binom(n,k);
(%o2)                           binomial(n, k)
(%i3) summand_to_rec(summand,k,n);
(%o3)                      2 sm  - sm      = 0
                               n     n + 1
(%i7) summand: binom(n, k)/(k+1);
                                binomial(n, k)
(%o7)                           --------------
                                    k + 1
(%i8) summand_to_rec(summand, [k, 0, n], n);
(%o8)               2 (n + 1) sm  - (n + 2) sm      = - 1
                                n             n + 1
@end example

@end deffn

