Funciones y variables para simplificación
=========================================

 -- Variable del sistema: askexp
     Cuando se invoca a asksign, la expresión que se va a analizar es precisamente askexp.

 -- Función: askinteger (EXPR, integer)
 -- Función: askinteger (EXPR)
 -- Función: askinteger (EXPR, even)
 -- Función: askinteger (EXPR, odd)

     La llamada askinteger (EXPR, integer) intenta determinar a partir de la base de datos de assume si EXPR es un entero. La función askinteger pide más información al usuario si no encuentra la respuesta, tratando de almacenar la nueva información en la base de datos si es posible. La llamada askinteger (EXPR) equivale a askinteger (EXPR, integer).

     La llamadas askinteger (EXPR, even) ay askinteger (EXPR, odd) intentan determinar si EXPR es un entero par o impar, respectivamente.

 -- Función: asksign (EXPR)
     Primero intenta determinar si la expresión especificada es positiva, negativa o cero.  Si no lo consigue, planteará al usuario preguntas que le ayuden a conpletar la deducción. Las respuestas del usuario son almacenadas en la base de datos durante el tiempo que dure este cálculo. El valor que al final devuelva asksign será pos, neg o zero.

 -- Función: demoivre (EXPR)
 -- Variable opcional: demoivre

     La función demoivre (expr) convierte una expresión sin modificar la variable global demoivre.

     Cuando demoivre vale true, los exponenciales complejos se convierten en expresiones equivalentes pero en términos de las funciones trigonométricas: exp (a + b*%i) se reduce a %e^a * (cos(b) + %i*sin(b)) si b no contiene a %i. Las expresiones a y b no se expanden.

     El valor por defecto de demoivre es false.

     La función exponentialize convierte funciones trigonométricas e hiperbólicas a la forma exponencial, por lo que  demoivre y exponentialize no pueden valer true al mismo tiempo.

 -- Variable opcional: domain
     Valor por defecto: real

     Si domain vale complex, sqrt (x^2) permanecerá como sqrt (x^2) en lugar de devolver abs(x).

 -- Función: expand (EXPR)
 -- Función: expand (EXPR, P, N)
     Expande la expresión EXPR. Los productos de sumas y de sumas con exponentes se multiplican, los numeradores de las expresiones racionales que son sumas se separan en sus respectivos términos, y las multiplicaciones (tanto las que son conmutativas como las que no) se distribuyen sobre las sumas en todos los niveles de EXPR.

     En el caso de los polinomios es más aconsejable utilizar ratexpand, que utiliza un algoritmo más eficiente.

     Las variables maxnegex y maxposex controlan los máximos exponentes negativos y positivos que se van a expandir.

     La llamada expand (EXPR, P, N) expande EXPR asignando a maxposex el valor P y a maxnegex el N. Esto es útil para expandir sólo parte de la expresión.

     La variable expon guarda el mayor exponente negativo que será expandido automáticamente, independientemente de expand. Por ejemplo, si expon vale 4 entonces (x+1)^(-5) no se expandirá automáticamente.

     La variable expop guarda el mayor exponente positivo que será expandido automáticamente.  Así, (x+1)^3 se expandirá automáticamente sólo si expop es mayor o igual que 3. Si se quiere expandir (x+1)^n, siendo n mayor que expop, entonces expand ((x+1)^n) se desarrollará sólo si maxposex no es menor que n.

     La variable expand utilizada con ev provocará una expansión.

     El fichero simplification/facexp.mac contiene algunas funciones relacionadas con expand (en concreto, facsum, factorfacsum y collectterms, que se cargan automáticamente) y variables (nextlayerfactor y facsum_combine) que permiten al usuario estructurar las expresiones controlando la expansión. En  simplification/facexp.usg se pueden encontrar breves descripciones de estas funciones. Se accederá a una demostración con la instrucción demo("facexp").

 -- Función: expandwrt (EXPR, X_1, ..., X_N)
     Expande la expresión expr con respecto a las variables X_1, ..., X_N. Todos los productos que contengan a las variables aparecen explícitamente. El resultado que se obtenga no tendr'a productos de sumas de expresiones que contengan a las variables. Los argumentos  X_1, ..., X_N pueden ser variables, operadores o expresiones.

     Por defecto, no se expanden los denominadores, pero esto puede cambiarse mediante el uso de la variable expandwrt_denom.

     Esta función se carga automáticamente de simplification/stopex.mac.

 -- Variable opcional: expandwrt_denom
     Valor por defecto: false

     La variable expandwrt_denom controla el tratamiento de las expresiones racinales por parte de expandwrt. Si vale true, se expandirán tanto el numerador como el denominador de la expresión respecto de los argumentos de expandwrt, pero si expandwrt_denom vale false, sólo se expandirá el numerador.

 -- Función: expandwrt_factored (EXPR, X_1, ..., X_N)
     Es similar a expandwrt, pero trata a las expresiones que son productos de una forma algo diferente. La función expandwrt_factored expande sólo aquellos factores de expr que contienen a las variables X_1, ..., X_N.

     Esta función se carga automáticamente de simplification/stopex.mac.

 -- Variable opcional: expon
     Valor por defecto: 0

     La variable expon guarda el mayor exponente negativo que será expandido automáticamente, independientemente de expand. Por ejemplo, si expon vale 4 entonces (x+1)^(-5) no se expandirá automáticamente.

 -- Función: exponentialize (EXPR)
 -- Variable opcional: exponentialize

     La función exponentialize (expr) convierte las funciones trigonométricas e hiperbólicas de EXPR a exponenciales, sin alterar la variable global exponentialize.

     Cuando la variable exponentialize vale true, todas las funciones trigonométricas e hiperbólicas se convierten a forma exponencial. El valor por defecto es false.

     La función demoivre convierte funciones trigonométricas e hiperbólicas a la forma exponencial, por lo que  demoivre y exponentialize no pueden valer true al mismo tiempo.

 -- Variable opcional: expop
     Valor por defecto: 0

     La variable expop guarda el mayor exponente positivo que será expandido automáticamente.  Así, (x+1)^3 se expandirá automáticamente sólo si expop es mayor o igual que 3. Si se quiere expandir (x+1)^n, siendo n mayor que expop, entonces expand ((x+1)^n) se desarrollará sólo si maxposex no es menor que n.

 -- Variable opcional: factlim
     Valor por defecto: -1

     La variable factlim especifica el mayor factorial que será expandido automáticamente.  Si su valor es -1, entonces se expandirán todos los enteros.

 -- Función: intosum (EXPR)
     Mueve los factores multiplicativos que están fuera de un sumatorio hacia dentro de éste. Si el índice aparece en la expresión exterior, entonce intosum busca un índice razonable, lo mismo que hace con sumcontract. Se trata de la operación contraria a extraer factores comunes de los sumatorios.

     En algunos caos puede ser necesario hacer scanmap (multthru, EXPR) antes que intosum.

 -- Declaración: lassociative
     La instrucción declare (g, lassociative) le indica al simplificador de Maxima que g es asociativo por la izquierda.  Por ejemplo, g (g (a, b), g (c, d))se reduce a g (g (g (a, b), c), d).

 -- Declaración: linear
     Es una de las propiedades de operadores de Maxima. Si la función univariante f se declara lineal, la expansión de  f(x + y) produce f(x) + f(y), f(a*x) produce a*f(x) si a es una constante.  Si la función tiene dos o más argumentos, la linealidad se interpreta como la de sum o integrate, esto es, f (a*x + b, x) produce a*f(x,x) + b*f(1,x) si a y b no contienen a x.

     linear equivale a additive y outative. Véase también opproperties.

 -- Declaración: mainvar
     Se pueden declarar variables de tipo mainvar.  El orden de los átomos es: números < constantes (como %e o %pi) < escalares < otras variables < "mainvars".  Por ejemplo, compárese expand ((X+Y)^4) con (declare (x, mainvar), expand ((x+y)^4)).  (Nota: Se debe tener cuidado si se quiere hacer uso de esta declaración. Por ejemplo, si se resta una expresión en la que x ha sido declarada como mainvar de otra en la que x no es mainvar, puede ser necesario volver a simplificar, ev (expr, simp), a fin de obtener cancelaciones.  Además, si se guarda una expresión en la que x es mainvar, quizás sea necesario guardar también x.)

 -- Variable opcional: maxapplydepth
     Valor por defecto: 10000

     La variable maxapplydepth es la máxima profundidad a la que van a introducirse apply1 y  apply2.

 -- Variable opcional: maxapplyheight
     Valor por defecto: 10000

     La variable maxapplyheight es la m2'axima altura a la que escalará applyb1 antes de detenerse.

 -- Variable opcional: maxnegex
     Valor por defecto: 1000

     La variable maxnegex es el mayor exponente negativo que expandirá la función expand. Véase también maxposex.

 -- Variable opcional: maxposex
     Valor por defecto: 1000

     La variable maxposex es el mayor exponenteque expandirá la función expand. Véase también maxnegex.

 -- Declaración: multiplicative
     La instrucción declare (f, multiplicative) indica al simplificador de Maxima que f is multiplicativa.

      1. Si f es univariante, cada vez que el simplificador encuentre a f aplicad a un producto, f se distribuirá sobre ese producto.  Por ejemplo, f(x*y) se reduciría a f(x)*f(y).

      2. Si f es una función de 2 o más argumentos, la multiplicabilidad se define como multiplicabilidad para el primer argumento de f, de modo que f (g(x) * h(x), x) se reduciría a f (g(x) ,x) * f (h(x), x).

     Esta transformación no se realiza cuando f se aplica a expresiones de la forma product (x[i], i, m, n).

 -- Variable opcional: negdistrib
     Valor por defecto: true

     Si negdistrib vale true, -1 se distribuye sobre una expresión.  Por ejemplo, -(x + y) se transforma en - y - x.  Dándole el valor false se mostrará - (x + y) tal cual. Esto puede ser útil, pero también peligroso; al igual que el indicador simp, no conviene asignarle el valor false.

 -- Variable opcional: negsumdispflag
     Valor por defecto: true

     Si negsumdispflag vale true, x - y se muestra como x - y en lugar de - y + x.  Dándole el valor false se realiza un análisis adicional para que no se representen de forma muy diferente dos expresiones similares.  Una aplicación puede ser para que a + %i*b y a - %i*b se representen ambas de la misma manera.

 -- Símbolo especial: noeval
     El símbolo noeval evita la fase de evaluación de ev. Es útil conjuntamente con otras variables globales y para poder volver a simplificar expresiones sin tener que evaluarlas otra vez.

 -- Declaración: noun
     El símbolo noun es una de las opciones de la instrucción declare. Hace que una función se declare como "nombre", lo que significa que no se evaluará automáticamente.

 -- Variable opcional: noundisp
     Valor por defecto: false

     Si noundisp vale true, los nombres se muestran precedidos de un apóstrofo. Siempre debe valer true cuando se quiera representar la definición de funciones.

 -- Símbolo especial: nouns
     El símbolo nouns es una evflag, lo que significa que cuando se utilice como una opción de la instrucción ev, todas las formas nominales que aparezcan en una expresión las convierte en verbales, esto es, las evalúa.  Véanse también noun, nounify, verb y verbify.

 -- Símbolo especial: numer

     El símbolo numer hace algunas funciones matemáticas con argumentos numéricos se evalúen como decimales de punto flotante. También hace que las variables de una expresión a las cuales se les ha asignado un número sean sustituidas por sus valores. Además, activa la variable float.

 -- Función: numerval (X_1, EXPR_1, ..., VAR_N, EXPR_N)
     Declara las variables x_1, ..., X_N asignándoles los valores numéricos expr_1, ..., expr_n. El valor numérico se evalúa y sustituye a la variable en cualquier expresión en la que ésta aparezca si numer toma el valor true. Véase también ev.

     Las expresiones expr_1, ..., expr_n pueden ser expresiones no necesariamente numéricas.

 -- Variable del sistema: opproperties

     La variable opproperties es la lista con las propiedades especiales de los operadores reconocidas por el simplificador de Maxima: linear, additive, multiplicative, outative, evenfun, oddfun, commutative, symmetric, antisymmetric, nary, lassociative, rassociative.

 -- Variable opcional: opsubst
     Valor por defecto: true

     Si opsubst vale false, subst no sustituye el operdor de una expresión, de manera que (opsubst: false, subst (x^2, r, r+r[0])) trabajará correctamente.

 -- Declaración: outative
     La instrucción declare (f, outative) le indica al simplificador de Maxima que los factores constantes del argumento de la función f pueden ser extraídos.

      1. Si f es univariante, cada vez que el simplificador se encuentra con f aplicada a un producto, éste será particionado en factores que son constantes y factores que no lo son, siendo entonces los constantes extraídos de la función.  Por ejemplo, f(a*x) se reducirá a a*f(x) siendo a una constante. Las constantes no atómicas no serán extraídas.

      2. Si f es una función de 2 o más argumentos, esta propiedad se define como en  sum o integrate, esto es, f (a*g(x), x) se reducirá a a * f(g(x), x) si a no contiene a x.

     Las funciones sum, integrate y limit han sido todas declaradas con la propiedad outative.

 -- Declaración: posfun
     La instrucción declare (f, posfun) declara a f como función positiva, de forma que is (f(x) > 0) devolverá true.

 -- Función: radcan (EXPR)
     Simplifica la expresión EXPR, que puede contener logaritmos, exponenciales y radicales, convirtiéndola a una forma canónica, lo que significa que todas las expresiones funcionalmente equivalentes se reducen a una forma única.  Ciertas expresiones, sin embargo, son reducidas por radcan a una forma regular, lo que significa que dos expresiones equivalentes no tienen necesariamente el mismo aspecto, pero su diferencia puede ser reducida por radcan a cero.

     Con algunas expresiones radcan puede consunir mucho tiempo. Este es el coste por explorar ciertas relaciones entre las componentes de la expresión para simplificaciones basadas en factorizaciones y expansiones parciales de fracciones de exponentes.

     Si %e_to_numlog vale true, %e^(r*log(expr)) se reduce a expr^r si r  es un número racional.

     Si radexpand vale false, ciertas transformaciones se inhiben; radcan (sqrt (1-x)) se mantiene como sqrt (1-x) y no se reduce a %i sqrt (x-1), o radcan (sqrt (x^2 - 2*x + 11)) se mantiene como  sqrt (x^2 - 2*x + 1) sin reducirse ax - 1.

     La instrucción example (radcan) muestra algunos ejemplos.

 -- Variable opcional: radexpand
     Valor por defecto: true

     La variable radexpand controla algunas simplificaciones de radicales.

     Si radexpand vale all, las raíces N-ésimas de los factores de un producto que sean potencias de N se extraen del símbolo radical. Por ejemplo, si radexpand vale all, sqrt (16*x^2) se reduce a 4*x.

     Más concretamente, considérese sqrt (x^2).

       * Si radexpand vale all o se ha ejecutado assume (x > 0), sqrt(x^2) se reduce a x.

       * Si radexpand vale true y domain es real (su valor por defecto), sqrt(x^2) se reduce a abs(x).

       * Si radexpand vale false o radexpand vale true y domain es complex, sqrt(x^2) no se simplifica.

     Nótese que  domain sólo se tiene en cuenta si radexpand vale true.

 -- Variable opcional: radsubstflag
     Valor por defecto: false

     Si radsubstflag vale true se permite a ratsubst hacer la sustitución u por sqrt (x) in x.

 -- Declaración: rassociative
     La instrucción declare (g, rassociative) le indica al simplificador de Maxima que g es asociativa por la derecha.  Por ejemplo, g(g(a, b), g(c, d)) se reduce a g(a, g(b, g(c, d))).

 -- Función: scsimp (EXPR, RULE_1, ..., RULE_N)
     Es el "Sequential Comparative Simplification" (método debido a Stoute). La función scsimp intenta simplificar EXPR de acuerdo con las reglas RULE_1, ..., RULE_N. Si se obtiene una expresión más pequeña, el proceso se repite. En caso contrario, después de que se hayan intentado todas las simplificaciones, devuelve la respuesta original.

     La instrucción example (scsimp) muestra algunos ejemplos.

 -- Variable opcional: simpsum
     Valor por defecto: false

     Si simpsum vale true, se simplifica el resultado de un sumatorio sum. Esta simplificación podrá producir en ocasiones una expresión compacta.  Si simpsum vale false o si se utiliza la forma apostrofada 'sum, el valor es una forma nominal que representa la notación sigma habitual en matemáticas.

 -- Función: sumcontract (EXPR)
     Combina todos los sumatorios de una suma cuyos límites inferiores y superiores difieren por constantes. El resultado es una expresión que contiene un sumatorio para conjunto de tales sumatorios. La función sumcontract combina todos los sumatorios compatibles y utiliza uno de los índices de uno de los sumatorios si puede, si no formará un índice que sea razonable.

     Puede ser necesario hacer intosum (EXPR) antes que sumcontract.

 -- Variable opcional: sumexpand
     Valor por defecto: false

     Si sumexpand vale true, productos de sumatorios y de sumatorios con exponentes se reducen a sumatorios anidados.

     Véase también cauchysum.

     Ejemplos:

          (%i1) sumexpand: true$
          (%i2) sum (f (i), i, 0, m) * sum (g (j), j, 0, n);
                               m      n
                              ====   ====
                              \      \
          (%o2)                >      >     f(i1) g(i2)
                              /      /
                              ====   ====
                              i1 = 0 i2 = 0
          (%i3) sum (f (i), i, 0, m)^2;
                               m      m
                              ====   ====
                              \      \
          (%o3)                >      >     f(i3) f(i4)
                              /      /
                              ====   ====
                              i3 = 0 i4 = 0

 -- Variable opcional: sumsplitfact
     Valor por defecto: true

     Si sumsplitfact vale false, minfactorial se aplica después de  factcomb.

 -- Declaración: symmetric
     La instrucción declare (h, symmetric) le indica al simplificador de  Maxima que h es una función simétrica.  Por ejemplo, h (x, z, y)  se reduce a h (x, y, z).

     El nombre commutative es sinónimo de symmetric.

 -- Función: unknown (EXPR)
     Devuelve true si y sólo si EXPR contiene un operador o función no reconocido por el simplificador de Maxima.