login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

Edit detail for SandBoxAlgfunc revision 1 of 3

1 2 3
Editor: Bill Page
Time: 2015/02/27 13:09:26 GMT+0
Note:

changed:
-
\begin{spad}
)abbrev category ACF AlgebraicallyClosedField
++ Author: Manuel Bronstein
++ Date Created: 22 Mar 1988
++ Date Last Updated: 27 November 1991
++ Description:
++   Model for algebraically closed fields.
++ Keywords: algebraic, closure, field.

AlgebraicallyClosedField() : Category == Join(Field, RadicalCategory) with
    rootOf : Polynomial % -> %
      ++ rootOf(p) returns y such that \spad{p(y) = 0}.
      ++ Error: if p has more than one variable y.
    rootOf : SparseUnivariatePolynomial % -> %
      ++ rootOf(p) returns y such that \spad{p(y) = 0}.
    rootOf : (SparseUnivariatePolynomial %, Symbol) -> %
      ++ rootOf(p, y) returns y such that \spad{p(y) = 0}.
      ++ The object returned displays as \spad{'y}.
    rootsOf : Polynomial % -> List %
      ++ rootsOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ Note: the returned values y1, ..., yn contain new symbols which
      ++ are bound in the interpreter to the respective values.
      ++ Error: if p has more than one variable y.
    rootsOf : SparseUnivariatePolynomial % -> List %
      ++ rootsOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ Note: the returned values y1, ..., yn contain new symbols which
      ++ are bound in the interpreter to the respective values.
    rootsOf : (SparseUnivariatePolynomial %, Symbol) -> List %
      ++ rootsOf(p, z) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0};
      ++ The returned roots contain new symbols \spad{'%z0}, \spad{'%z1} ...;
      ++ Note: the new symbols are bound in the interpreter to the
      ++ respective values.
    zeroOf : Polynomial % -> %
      ++ zeroOf(p) returns y such that \spad{p(y) = 0}.
      ++ If possible, y is expressed in terms of radicals.
      ++ Otherwise it is an implicit algebraic quantity.
      ++ Error: if p has more than one variable y.
    zeroOf : SparseUnivariatePolynomial % -> %
      ++ zeroOf(p) returns y such that \spad{p(y) = 0};
      ++ if possible, y is expressed in terms of radicals.
      ++ Otherwise it is an implicit algebraic quantity.
    zeroOf : (SparseUnivariatePolynomial %, Symbol) -> %
      ++ zeroOf(p, y) returns y such that \spad{p(y) = 0};
      ++ if possible, y is expressed in terms of radicals.
      ++ Otherwise it is an implicit algebraic quantity which
      ++ displays as \spad{'y}.
    zerosOf : Polynomial % -> List %
      ++ zerosOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ The yi's are expressed in radicals if possible.
      ++ Otherwise they are implicit algebraic quantities containing
      ++ new symbols.  The new symbols are bound in the interpreter to the
      ++ respective values.
      ++ Error: if p has more than one variable y.
    zerosOf : SparseUnivariatePolynomial % -> List %
      ++ zerosOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ The yi's are expressed in radicals if possible.
      ++ Otherwise they are implicit algebraic quantities containing
      ++ new symbols.  The new symbols are bound in the interpreter to the
      ++ respective values.
    zerosOf : (SparseUnivariatePolynomial %, Symbol) -> List %
      ++ zerosOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ The yi's are expressed in radicals if possible, and otherwise
      ++ as implicit algebraic quantities containing
      ++ new symbols which display as \spad{'%z0}, \spad{'%z1}, ...;
      ++ The new symbols are bound in the interpreter
      ++ to respective values.
 add
    SUP ==> SparseUnivariatePolynomial %

    import from List(Symbol)

    assign  : (Symbol, %) -> %
    allroots : (SUP, Symbol, (SUP, Symbol) -> %) -> List %
    binomialRoots : (SUP, Symbol, (SUP, Symbol) -> %) -> List %

    zeroOf(p : SUP)            == assign(x := new(), zeroOf(p, x))
    rootOf(p : SUP)            == assign(x := new(), rootOf(p, x))
    zerosOf(p : SUP)           == zerosOf(p, new())
    rootsOf(p : SUP)           == rootsOf(p, new())
    rootsOf(p : SUP, y : Symbol) == allroots(p, y, rootOf)
    zerosOf(p : SUP, y : Symbol) == allroots(p, y, zeroOf)
    assign(x, f)             == (assignSymbol(x, f, %)$Lisp; f)

    zeroOf(p : Polynomial %) ==
      empty?(l := variables p) => error "zeroOf: constant polynomial"
      zeroOf(univariate p, first l)

    rootOf(p : Polynomial %) ==
      empty?(l := variables p) => error "rootOf: constant polynomial"
      rootOf(univariate p, first l)

    zerosOf(p : Polynomial %) ==
      empty?(l := variables p) => error "zerosOf: constant polynomial"
      zerosOf(univariate p, first l)

    rootsOf(p : Polynomial %) ==
      empty?(l := variables p) => error "rootsOf: constant polynomial"
      rootsOf(univariate p, first l)

    zeroOf(p : SUP, y : Symbol) ==
      zero?(d := degree p) => error "zeroOf: constant polynomial"
      zero? coefficient(p, 0) => 0
      a := leadingCoefficient p
      d = 2 =>
        b := coefficient(p, 1)
        (sqrt(b^2 - 4 * a * coefficient(p, 0)) - b) / (2 * a)
      (r := retractIfCan(reductum p)@Union(%,"failed")) case "failed" =>
        rootOf(p, y)
      nthRoot(- (r::% / a), d)

    binomialRoots(p, y, fn) ==
     -- p = a * x^n + b
      alpha := assign(x := new(y)$Symbol, fn(p, x))
--      one?(n := degree p) =>  [ alpha ]
      ((n := degree p) = 1) =>  [ alpha ]
      cyclo := cyclotomic(n, monomial(1, 1)$SUP)$NumberTheoreticPolynomialFunctions(SUP)
      beta := assign(x := new(y)$Symbol, fn(cyclo, x))
      [alpha*beta^i for i in 0..(n-1)::NonNegativeInteger]

    import from PolynomialDecomposition(SUP, %)

    allroots(p, y, fn) ==
      zero? p => error "allroots: polynomial must be nonzero"
      zero? coefficient(p, 0) =>
         concat(0, allroots(p quo monomial(1, 1), y, fn))
      zero?(p1 := reductum p) => empty()
      zero? reductum p1 => binomialRoots(p, y, fn)
      decompList := decompose(p)
      # decompList > 1 =>
          h := last decompList
          g := leftFactor(p, h) :: SUP
          groots := allroots(g, y, fn)
          "append"/[allroots(h-r::SUP, y, fn) for r in groots]
      ans := nil()$List(%)
      while not ground? p repeat
        alpha := assign(x := new(y)$Symbol, fn(p, x))
        q     := monomial(1, 1)$SUP - alpha::SUP
        if not zero?(p alpha) then
          p   := p quo q
          ans := concat(alpha, ans)
        else while zero?(p alpha) repeat
          p   := (p exquo q)::SUP
          ans := concat(alpha, ans)
      reverse! ans

)abbrev category ACFS AlgebraicallyClosedFunctionSpace
++ Author: Manuel Bronstein
++ Date Created: 31 October 1988
++ Date Last Updated: 7 October 1991
++ Description:
++   Model for algebraically closed function spaces.
++ Keywords: algebraic, closure, field.
AlgebraicallyClosedFunctionSpace(R : Join(Comparable, IntegralDomain)):
 Category == Join(AlgebraicallyClosedField, FunctionSpace R) with
    rootOf : % -> %
      ++ rootOf(p) returns y such that \spad{p(y) = 0}.
      ++ Error: if p has more than one variable y.
    rootsOf : % -> List %
      ++ rootsOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0};
      ++ Note: the returned values y1, ..., yn contain new symbols which
      ++ are bound in the interpreter to the respective values.
      ++ Error: if p has more than one variable y.
    rootOf : (%, Symbol) -> %
      ++ rootOf(p, y) returns y such that \spad{p(y) = 0}.
      ++ The object returned displays as \spad{'y}.
    rootsOf : (%, Symbol) -> List %
      ++ rootsOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0};
      ++ The returned roots contain new symbols \spad{'%z0}, \spad{'%z1} ...;
      ++ Note: the new symbols are bound in the interpreter to the
      ++ respective values.
    zeroOf : % -> %
      ++ zeroOf(p) returns y such that \spad{p(y) = 0}.
      ++ The value y is expressed in terms of radicals if possible, and otherwise
      ++ as an implicit algebraic quantity.
      ++ Error: if p has more than one variable.
    zerosOf : % -> List %
      ++ zerosOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ The yi's are expressed in radicals if possible.
      ++ Note: the returned values y1, ..., yn contain new symbols which
      ++ are bound in the interpreter to the respective values.
      ++ Error: if p has more than one variable.
    zeroOf : (%, Symbol) -> %
      ++ zeroOf(p, y) returns y such that \spad{p(y) = 0}.
      ++ The value y is expressed in terms of radicals if possible, and otherwise
      ++ as an implicit algebraic quantity
      ++ which displays as \spad{'y}.
    zerosOf : (%, Symbol) -> List %
      ++ zerosOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}.
      ++ The yi's are expressed in radicals if possible, and otherwise
      ++ as implicit algebraic quantities containing
      ++ new symbols which display as \spad{'%z0}, \spad{'%z1}, ...;
      ++ The new symbols are bound in the interpreter
      ++ to the respective values.
    rootSum : (%, SparseUnivariatePolynomial %, Symbol) -> %
  add

    import from Integer
    import from List(Symbol)
    import from SparseUnivariatePolynomial(%)
    import from Fraction(SparseUnivariatePolynomial(%))

    rootOf(p : %) ==
      empty?(l := variables p) => error "rootOf: constant expression"
      rootOf(p, first l)

    rootsOf(p : %) ==
      empty?(l := variables p) => error "rootsOf: constant expression"
      rootsOf(p, first l)

    zeroOf(p : %) ==
      empty?(l := variables p) => error "zeroOf: constant expression"
      zeroOf(p, first l)

    zerosOf(p : %) ==
      empty?(l := variables p) => error "zerosOf: constant expression"
      zerosOf(p, first l)

    zeroOf(p : %, x : Symbol) ==
      n := numer(f := univariate(p, kernel(x)$Kernel(%)))
      degree denom f > 0 => error "zeroOf: variable appears in denom"
      degree n = 0 => error "zeroOf: constant expression"
      zeroOf(n, x)

    rootOf(p : %, x : Symbol) ==
      n := numer(f := univariate(p, kernel(x)$Kernel(%)))
      degree denom f > 0 => error "roofOf: variable appears in denom"
      degree n = 0 => error "rootOf: constant expression"
      rootOf(n, x)

    zerosOf(p : %, x : Symbol) ==
      n := numer(f := univariate(p, kernel(x)$Kernel(%)))
      degree denom f > 0 => error "zerosOf: variable appears in denom"
      degree n = 0 => empty()
      zerosOf(n, x)

    rootsOf(p : %, x : Symbol) ==
      n := numer(f := univariate(p, kernel(x)$Kernel(%)))
      degree denom f > 0 => error "roofsOf: variable appears in denom"
      degree n = 0 => empty()
      rootsOf(n, x)

    rootsOf(p : SparseUnivariatePolynomial %, y : Symbol) ==
      (r := retractIfCan(p)@Union(%,"failed")) case % => rootsOf(r::%,y)
      rootsOf(p, y)$AlgebraicallyClosedField_&(%)

    zerosOf(p : SparseUnivariatePolynomial %, y : Symbol) ==
      (r := retractIfCan(p)@Union(%,"failed")) case % => zerosOf(r::%,y)
      zerosOf(p, y)$AlgebraicallyClosedField_&(%)

    zeroOf(p : SparseUnivariatePolynomial %, y : Symbol) ==
      (r := retractIfCan(p)@Union(%,"failed")) case % => zeroOf(r::%, y)
      zeroOf(p, y)$AlgebraicallyClosedField_&(%)



)abbrev package AF AlgebraicFunction
++ Author: Manuel Bronstein
++ Date Created: 21 March 1988
++ Date Last Updated: 11 November 1993
++ Description:
++   This package provides algebraic functions over an integral domain.
++ Keywords: algebraic, function.

AlgebraicFunction(R, F) : Exports == Implementation where
  R : Join(Comparable, IntegralDomain)
  F : FunctionSpace R

  SE  ==> Symbol
  Z   ==> Integer
  Q   ==> Fraction Z
  OP  ==> BasicOperator
  K   ==> Kernel F
  P   ==> SparseMultivariatePolynomial(R, K)
  UP  ==> SparseUnivariatePolynomial F
  UPR ==> SparseUnivariatePolynomial R
  SPECIALDISP ==> '%specialDisp
  SPECIALDIFF ==> '%specialDiff
  SPECIALEQUAL ==> '%specialEqual

  Exports ==> with
    rootOf  : (UP, SE) -> F
      ++ rootOf(p, y) returns y such that \spad{p(y) = 0}.
      ++ The object returned displays as \spad{'y}.
    rootSum : (F, UP, SE) -> F
      ++ rootSum(expr, p, s)
    operator : OP -> OP
      ++ operator(op) returns a copy of \spad{op} with the domain-dependent
      ++ properties appropriate for \spad{F}.
      ++ Error: if op is not an algebraic operator, that is,
      ++ an nth root or implicit algebraic operator.
    belong? : OP -> Boolean
      ++ belong?(op) is true if \spad{op} is an algebraic operator, that is,
      ++ an nth root or implicit algebraic operator.
    inrootof : (UP, F) -> F
      ++ inrootof(p, x) should be a non-exported function.
      -- un-export when the compiler accepts conditional local functions!
    droot : List F -> OutputForm
      ++ droot(l) should be a non-exported function.
      -- un-export when the compiler accepts conditional local functions!
    if R has RetractableTo Integer then
      "^"   : (F, Q) -> F
        ++ x ^ q is \spad{x} raised to the rational power \spad{q}.
      minPoly : K  -> UP
        ++ minPoly(k) returns the defining polynomial of \spad{k}.
      definingPolynomial : F -> F
        ++ definingPolynomial(f) returns the defining polynomial of \spad{f}
        ++ as an element of \spad{F}.
        ++ Error: if f is not a kernel.
      iroot : (R, Z) -> F
        ++ iroot(p, n) should be a non-exported function.
        -- un-export when the compiler accepts conditional local functions!

  Implementation ==> add

    ALGOP       := '%alg

    ialg : List F -> F
    dvalg : (List F, SE) -> F
    dalg : List F -> OutputForm

    opalg  := operator('rootOf)$CommonOperators
    oproot := operator('nthRoot)$CommonOperators
    oprootsum := operator('%root_sum)$CommonOperators

    belong? op == has?(op, ALGOP) or is?(op, '%root_sum)
    dalg l     == second(l)::OutputForm

    rootOf(p, x) ==
      k := kernel(x)$K
      (r := retractIfCan(p)@Union(F, "failed")) case "failed" =>
        inrootof(p, k::F)
      n := numer(f := univariate(r::F, k))
      degree denom f > 0 => error "roofOf: variable appears in denom"
      inrootof(n, k::F)

    dvalg(l, x) ==
      p := numer univariate(first l, retract(second l)@K)
      alpha := kernel(opalg, l)
      - (map((s : F) : F +-> differentiate(s, x), p) alpha) _
          / ((differentiate p) alpha)

    ialg l ==
      f := univariate(p := first l, retract(x := second l)@K)
      degree denom f > 0 => error "roofOf: variable appears in denom"
      inrootof(numer f, x)

    operator op ==
      is?(op,  'rootOf) => opalg
      is?(op, 'nthRoot) => oproot
      is?(op, '%root_sum) => oprootsum
      error "Unknown operator"

    if R has AlgebraicallyClosedField then
      UP2R : UP -> Union(UPR, "failed")

      inrootof(q, x) ==
        monomial? q => 0

        (d := degree q) <= 0 => error "rootOf: constant polynomial"
--        one? d=> - leadingCoefficient(reductum q) / leadingCoefficient q
        (d = 1) => - leadingCoefficient(reductum q) / leadingCoefficient q
        ((rx := retractIfCan(x)@Union(SE, "failed")) case SE) and
          ((r := UP2R q) case UPR) => rootOf(r::UPR, rx::SE)::F
        kernel(opalg, [q x, x])

      UP2R p ==
        ans : UPR := 0
        while p ~= 0 repeat
          (r := retractIfCan(leadingCoefficient p)@Union(R, "failed"))
            case "failed" => return "failed"
          ans := ans + monomial(r::R, degree p)
          p   := reductum p
        ans

    else
      inrootof(q, x) ==
        monomial? q => 0
        (d := degree q) <= 0 => error "rootOf: constant polynomial"
--        one? d => - leadingCoefficient(reductum q) /leadingCoefficient q
        (d = 1) => - leadingCoefficient(reductum q) /leadingCoefficient q
        kernel(opalg, [q x, x])

    eqopalg(k1 : K, k2 : K) : Boolean ==
        al1 := argument(k1)
        al2 := argument(k2)
        dv1 := retract(al1.2)@K
        dv2 := retract(al2.2)@K
        pe1 := al1.1
        pe2 := al2.1
        dv1 = dv2 => pe1 = pe2
        p1 := univariate(numer(pe1), dv1)
        p2 := univariate(numer(pe2), dv2)
        lc1 := leadingCoefficient(p1)
        lc2 := leadingCoefficient(p2)
        lc1 = lc2 => p1 = p2
        lc2*p1 = lc1*p2

    evaluate(opalg, ialg)$BasicOperatorFunctions1(F)
    setProperty(opalg, SPECIALDIFF,
                              dvalg@((List F, SE) -> F) pretend None)
    setProperty(opalg, SPECIALDISP,
                              dalg@(List F -> OutputForm) pretend None)
    setProperty(opalg, SPECIALEQUAL, eqopalg@((K, K) -> Boolean) pretend None)

    POLYCATQ ==> PolynomialCategoryQuotientFunctions(IndexedExponents(K),
                                                     K, R, P, F)

    root_sum1(expr : F, p : UP, x : F) : F ==
        expr = 0 => 0
        nexpr := univariate(expr, (k := retract(x)@K), p)$POLYCATQ
        xs := retract(x)@SE
        every?((c : F) : Boolean +-> D(c, xs) = 0, coefficients(nexpr)) =>
            res : F := 0
            for i in 0..(degree(p) - 1) repeat
                nexpr := nexpr rem p
                res := res + coefficient(nexpr, i)
                nexpr := monomial(1, 1)$UP*nexpr
            res
        kernel(oprootsum, [nexpr(x), x, p(x)])

    rootSum(expr : F, p : UP, s : SE) : F ==
        k := kernel(s)$K
        root_sum1(expr, p, k::F)

    irootsum(l : List F) : F ==
        p := univariate(p := l.3, retract(x := l.2)@K)
        degree denom p > 0 => error "roofSum: variable appears in denom of p"
        root_sum1(l.1, numer(p), x)

    drootsum(l : List F) : OutputForm ==
        dv := retract(l.2)@K
        p := univariate(numer(l.3), dv)
        sum((l.1)::OutputForm,
            outputForm(p, dv::OutputForm) = (0$Z)::OutputForm)

    dvrootsum(l : List F, x : SE) : F ==
        print("dvrootsum"::OutputForm)
        print(l::OutputForm)
        dv := retract(alpha := l.2)@K
        dvs := retract(alpha)@SE
        p : UP := numer(univariate(l.3, dv))
        print(p::OutputForm)
        dalpha := - (map((s : F) : F +-> differentiate(s, x), p) alpha)
            / ((differentiate p) alpha)
        expr := l.1
        nexpr := dalpha*differentiate(expr, dvs) +
                 differentiate(expr, x)
        print(nexpr::OutputForm)
        nexpr = 0 => 0
        root_sum1(nexpr, p, alpha)

    evaluate(oprootsum, irootsum)$BasicOperatorFunctions1(F)

    setProperty(oprootsum, SPECIALDIFF,
                        dvrootsum@((List F, SE) -> F) pretend None)
    setProperty(oprootsum, SPECIALDISP,
                        drootsum@(List F -> OutputForm) pretend None)

    if R has RetractableTo Integer then
      import from PolynomialRoots(IndexedExponents K, K, R, P, F)

      dumvar := '%%var::F

      lzero   : List F -> F
      dvroot  : List F -> F
      inroot  : List F -> F
      hackroot : (F, Z) -> F
      inroot0 : (F, Z, Boolean, Boolean) -> F

      lzero l == 0

      droot l ==
        x := first(l)::OutputForm
        (n := retract(second l)@Z) = 2 => root x
        root(x, n::OutputForm)

      dvroot l ==
        n := retract(second l)@Z
        (first(l) ^ ((1 - n) / n)) / (n::F)

      x ^ q ==
        qr := divide(numer q, denom q)
        x ^ qr.quotient * inroot([x, (denom q)::F]) ^ qr.remainder

      hackroot(x, n) ==
        (n = 1) or (x = 1) => x
        (((dx := denom x) ~= 1) and
           ((rx := retractIfCan(dx)@Union(Integer,"failed")) case Integer) and
               positive?(rx)) =>
                   hackroot((numer x)::F, n)/hackroot(rx::Integer::F, n)
        (x = -1) and n = 4 =>
          ((-1::F) ^ (1::Q / 2::Q) + 1) / ((2::F) ^ (1::Q / 2::Q))
        kernel(oproot, [x, n::F])

      inroot l ==
        zero?(n := retract(second l)@Z) => error "root: exponent = 0"
--        one?(x := first l) or one? n => x
        ((x := first l) = 1) or (n = 1) => x
        (r := retractIfCan(x)@Union(R,"failed")) case R => iroot(r::R,n)
        (u := isExpt(x)) case Record(var : K, exponent : Z) =>
          pr := u::Record(var : K, exponent : Z)
          is?(pr.var, oproot) and #argument(pr.var) = 2 =>
              (first argument(pr.var)) ^
                  (pr.exponent /$Fraction(Z)
                      (n * retract(second argument(pr.var))@Z))
          inroot0(x, n, false, false)
        inroot0(x, n, false, false)

-- removes powers of positive integers from numer and denom
-- num? or den? is true if numer or denom already processed
      inroot0(x, n, num?, den?) ==
        rn:Union(Z, "failed") := (num? => "failed"; retractIfCan numer x)
        rd:Union(Z, "failed") := (den? => "failed"; retractIfCan denom x)
        (rn case Z) and (rd case Z) =>
          rec := qroot(rn::Z / rd::Z, n::NonNegativeInteger)
          rec.coef * hackroot(rec.radicand, rec.exponent)
        rn case Z =>
          rec := qroot(rn::Z::Fraction(Z), n::NonNegativeInteger)
          rec.coef * inroot0((rec.radicand^(n exquo rec.exponent)::Z)
                                / (denom(x)::F), n, true, den?)
        rd case Z =>
          rec := qroot(rd::Z::Fraction(Z), n::NonNegativeInteger)
          inroot0((numer(x)::F) /
                  (rec.radicand ^ (n exquo rec.exponent)::Z),
                   n, num?, true) / rec.coef
        hackroot(x, n)

      if R has AlgebraicallyClosedField then iroot(r, n) == nthRoot(r, n)::F
      else
        iroot0 : (R, Z) -> F

        if R has RadicalCategory then
          if R has imaginary : () -> R then iroot(r, n) == nthRoot(r, n)::F
          else
            iroot(r, n) ==
              odd? n or not(smaller?(r, 0)) => nthRoot(r, n)::F
              iroot0(r, n)

        else iroot(r, n) == iroot0(r, n)

        iroot0(r, n) ==
          rec := rroot(r, n::NonNegativeInteger)
          rec.coef * hackroot(rec.radicand, rec.exponent)

      definingPolynomial x ==
        (r := retractIfCan(x)@Union(K, "failed")) case K =>
          is?(k := r::K, opalg) => first argument k
          is?(k, oproot) =>
            dumvar ^ retract(second argument k)@Z - first argument k
          dumvar - x
        dumvar - x

      minPoly k ==
        is?(k, opalg)  =>
           numer univariate(first argument k,
                                           retract(second argument k)@K)
        is?(k, oproot) =>
           monomial(1, retract(second argument k)@Z :: NonNegativeInteger)
             - first(argument k)::UP
        monomial(1, 1) - k::F::UP

      evaluate(oproot, inroot)$BasicOperatorFunctions1(F)
      derivative(oproot, [dvroot, lzero])

    else   -- R is not retractable to Integer
      droot l ==
        x := first(l)::OutputForm
        (n := second l) = 2::F => root x
        root(x, n::OutputForm)

      minPoly k ==
        is?(k, opalg)  =>
           numer univariate(first argument k,
                                           retract(second argument k)@K)
        monomial(1, 1) - k::F::UP

    setProperty(oproot, SPECIALDISP,
                              droot@(List F -> OutputForm) pretend None)

--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
--All rights reserved.
--
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are
--met:
--
--    - Redistributions of source code must retain the above copyright
--      notice, this list of conditions and the following disclaimer.
--
--    - Redistributions in binary form must reproduce the above copyright
--      notice, this list of conditions and the following disclaimer in
--      the documentation and/or other materials provided with the
--      distribution.
--
--    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
--      names of its contributors may be used to endorse or promote products
--      derived from this software without specific prior written permission.
--
--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-- SPAD files for the functional world should be compiled in the
-- following order:
--
--   op  kl  fspace ALGFUNC expr
\end{spad}

spad
)abbrev category ACF AlgebraicallyClosedField
++ Author: Manuel Bronstein
++ Date Created: 22 Mar 1988
++ Date Last Updated: 27 November 1991
++ Description:
++   Model for algebraically closed fields.
++ Keywords: algebraic, closure, field.
AlgebraicallyClosedField() : Category == Join(Field, RadicalCategory) with rootOf : Polynomial % -> % ++ rootOf(p) returns y such that \spad{p(y) = 0}. ++ Error: if p has more than one variable y. rootOf : SparseUnivariatePolynomial % -> % ++ rootOf(p) returns y such that \spad{p(y) = 0}. rootOf : (SparseUnivariatePolynomial %, Symbol) -> % ++ rootOf(p, y) returns y such that \spad{p(y) = 0}. ++ The object returned displays as \spad{'y}. rootsOf : Polynomial % -> List % ++ rootsOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ Note: the returned values y1, ..., yn contain new symbols which ++ are bound in the interpreter to the respective values. ++ Error: if p has more than one variable y. rootsOf : SparseUnivariatePolynomial % -> List % ++ rootsOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ Note: the returned values y1, ..., yn contain new symbols which ++ are bound in the interpreter to the respective values. rootsOf : (SparseUnivariatePolynomial %, Symbol) -> List % ++ rootsOf(p, z) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}; ++ The returned roots contain new symbols \spad{'%z0}, \spad{'%z1} ...; ++ Note: the new symbols are bound in the interpreter to the ++ respective values. zeroOf : Polynomial % -> % ++ zeroOf(p) returns y such that \spad{p(y) = 0}. ++ If possible, y is expressed in terms of radicals. ++ Otherwise it is an implicit algebraic quantity. ++ Error: if p has more than one variable y. zeroOf : SparseUnivariatePolynomial % -> % ++ zeroOf(p) returns y such that \spad{p(y) = 0}; ++ if possible, y is expressed in terms of radicals. ++ Otherwise it is an implicit algebraic quantity. zeroOf : (SparseUnivariatePolynomial %, Symbol) -> % ++ zeroOf(p, y) returns y such that \spad{p(y) = 0}; ++ if possible, y is expressed in terms of radicals. ++ Otherwise it is an implicit algebraic quantity which ++ displays as \spad{'y}. zerosOf : Polynomial % -> List % ++ zerosOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ The yi's are expressed in radicals if possible. ++ Otherwise they are implicit algebraic quantities containing ++ new symbols. The new symbols are bound in the interpreter to the ++ respective values. ++ Error: if p has more than one variable y. zerosOf : SparseUnivariatePolynomial % -> List % ++ zerosOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ The yi's are expressed in radicals if possible. ++ Otherwise they are implicit algebraic quantities containing ++ new symbols. The new symbols are bound in the interpreter to the ++ respective values. zerosOf : (SparseUnivariatePolynomial %, Symbol) -> List % ++ zerosOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ The yi's are expressed in radicals if possible, and otherwise ++ as implicit algebraic quantities containing ++ new symbols which display as \spad{'%z0}, \spad{'%z1}, ...; ++ The new symbols are bound in the interpreter ++ to respective values. add SUP ==> SparseUnivariatePolynomial %
import from List(Symbol)
assign : (Symbol, %) -> % allroots : (SUP, Symbol, (SUP, Symbol) -> %) -> List % binomialRoots : (SUP, Symbol, (SUP, Symbol) -> %) -> List %
zeroOf(p : SUP) == assign(x := new(), zeroOf(p, x)) rootOf(p : SUP) == assign(x := new(), rootOf(p, x)) zerosOf(p : SUP) == zerosOf(p, new()) rootsOf(p : SUP) == rootsOf(p, new()) rootsOf(p : SUP, y : Symbol) == allroots(p, y, rootOf) zerosOf(p : SUP, y : Symbol) == allroots(p, y, zeroOf) assign(x, f) == (assignSymbol(x, f, %)$Lisp; f)
zeroOf(p : Polynomial %) == empty?(l := variables p) => error "zeroOf: constant polynomial" zeroOf(univariate p, first l)
rootOf(p : Polynomial %) == empty?(l := variables p) => error "rootOf: constant polynomial" rootOf(univariate p, first l)
zerosOf(p : Polynomial %) == empty?(l := variables p) => error "zerosOf: constant polynomial" zerosOf(univariate p, first l)
rootsOf(p : Polynomial %) == empty?(l := variables p) => error "rootsOf: constant polynomial" rootsOf(univariate p, first l)
zeroOf(p : SUP, y : Symbol) == zero?(d := degree p) => error "zeroOf: constant polynomial" zero? coefficient(p, 0) => 0 a := leadingCoefficient p d = 2 => b := coefficient(p, 1) (sqrt(b^2 - 4 * a * coefficient(p, 0)) - b) / (2 * a) (r := retractIfCan(reductum p)@Union(%,"failed")) case "failed" => rootOf(p, y) nthRoot(- (r::% / a), d)
binomialRoots(p, y, fn) == -- p = a * x^n + b alpha := assign(x := new(y)$Symbol, fn(p, x)) -- one?(n := degree p) => [ alpha ] ((n := degree p) = 1) => [ alpha ] cyclo := cyclotomic(n, monomial(1, 1)$SUP)$NumberTheoreticPolynomialFunctions(SUP) beta := assign(x := new(y)$Symbol, fn(cyclo, x)) [alpha*beta^i for i in 0..(n-1)::NonNegativeInteger]
import from PolynomialDecomposition(SUP, %)
allroots(p, y, fn) == zero? p => error "allroots: polynomial must be nonzero" zero? coefficient(p, 0) => concat(0, allroots(p quo monomial(1, 1), y, fn)) zero?(p1 := reductum p) => empty() zero? reductum p1 => binomialRoots(p, y, fn) decompList := decompose(p) # decompList > 1 => h := last decompList g := leftFactor(p, h) :: SUP groots := allroots(g, y, fn) "append"/[allroots(h-r::SUP, y, fn) for r in groots] ans := nil()$List(%) while not ground? p repeat alpha := assign(x := new(y)$Symbol, fn(p, x)) q := monomial(1, 1)$SUP - alpha::SUP if not zero?(p alpha) then p := p quo q ans := concat(alpha, ans) else while zero?(p alpha) repeat p := (p exquo q)::SUP ans := concat(alpha, ans) reverse! ans
)abbrev category ACFS AlgebraicallyClosedFunctionSpace ++ Author: Manuel Bronstein ++ Date Created: 31 October 1988 ++ Date Last Updated: 7 October 1991 ++ Description: ++ Model for algebraically closed function spaces. ++ Keywords: algebraic, closure, field. AlgebraicallyClosedFunctionSpace(R : Join(Comparable, IntegralDomain)): Category == Join(AlgebraicallyClosedField, FunctionSpace R) with rootOf : % -> % ++ rootOf(p) returns y such that \spad{p(y) = 0}. ++ Error: if p has more than one variable y. rootsOf : % -> List % ++ rootsOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}; ++ Note: the returned values y1, ..., yn contain new symbols which ++ are bound in the interpreter to the respective values. ++ Error: if p has more than one variable y. rootOf : (%, Symbol) -> % ++ rootOf(p, y) returns y such that \spad{p(y) = 0}. ++ The object returned displays as \spad{'y}. rootsOf : (%, Symbol) -> List % ++ rootsOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}; ++ The returned roots contain new symbols \spad{'%z0}, \spad{'%z1} ...; ++ Note: the new symbols are bound in the interpreter to the ++ respective values. zeroOf : % -> % ++ zeroOf(p) returns y such that \spad{p(y) = 0}. ++ The value y is expressed in terms of radicals if possible, and otherwise ++ as an implicit algebraic quantity. ++ Error: if p has more than one variable. zerosOf : % -> List % ++ zerosOf(p) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ The yi's are expressed in radicals if possible. ++ Note: the returned values y1, ..., yn contain new symbols which ++ are bound in the interpreter to the respective values. ++ Error: if p has more than one variable. zeroOf : (%, Symbol) -> % ++ zeroOf(p, y) returns y such that \spad{p(y) = 0}. ++ The value y is expressed in terms of radicals if possible, and otherwise ++ as an implicit algebraic quantity ++ which displays as \spad{'y}. zerosOf : (%, Symbol) -> List % ++ zerosOf(p, y) returns \spad{[y1, ..., yn]} such that \spad{p(yi) = 0}. ++ The yi's are expressed in radicals if possible, and otherwise ++ as implicit algebraic quantities containing ++ new symbols which display as \spad{'%z0}, \spad{'%z1}, ...; ++ The new symbols are bound in the interpreter ++ to the respective values. rootSum : (%, SparseUnivariatePolynomial %, Symbol) -> % add
import from Integer import from List(Symbol) import from SparseUnivariatePolynomial(%) import from Fraction(SparseUnivariatePolynomial(%))
rootOf(p : %) == empty?(l := variables p) => error "rootOf: constant expression" rootOf(p, first l)
rootsOf(p : %) == empty?(l := variables p) => error "rootsOf: constant expression" rootsOf(p, first l)
zeroOf(p : %) == empty?(l := variables p) => error "zeroOf: constant expression" zeroOf(p, first l)
zerosOf(p : %) == empty?(l := variables p) => error "zerosOf: constant expression" zerosOf(p, first l)
zeroOf(p : %, x : Symbol) == n := numer(f := univariate(p, kernel(x)$Kernel(%))) degree denom f > 0 => error "zeroOf: variable appears in denom" degree n = 0 => error "zeroOf: constant expression" zeroOf(n, x)
rootOf(p : %, x : Symbol) == n := numer(f := univariate(p, kernel(x)$Kernel(%))) degree denom f > 0 => error "roofOf: variable appears in denom" degree n = 0 => error "rootOf: constant expression" rootOf(n, x)
zerosOf(p : %, x : Symbol) == n := numer(f := univariate(p, kernel(x)$Kernel(%))) degree denom f > 0 => error "zerosOf: variable appears in denom" degree n = 0 => empty() zerosOf(n, x)
rootsOf(p : %, x : Symbol) == n := numer(f := univariate(p, kernel(x)$Kernel(%))) degree denom f > 0 => error "roofsOf: variable appears in denom" degree n = 0 => empty() rootsOf(n, x)
rootsOf(p : SparseUnivariatePolynomial %, y : Symbol) == (r := retractIfCan(p)@Union(%,"failed")) case % => rootsOf(r::%,y) rootsOf(p, y)$AlgebraicallyClosedField_&(%)
zerosOf(p : SparseUnivariatePolynomial %, y : Symbol) == (r := retractIfCan(p)@Union(%,"failed")) case % => zerosOf(r::%,y) zerosOf(p, y)$AlgebraicallyClosedField_&(%)
zeroOf(p : SparseUnivariatePolynomial %, y : Symbol) == (r := retractIfCan(p)@Union(%,"failed")) case % => zeroOf(r::%, y) zeroOf(p, y)$AlgebraicallyClosedField_&(%)
)abbrev package AF AlgebraicFunction ++ Author: Manuel Bronstein ++ Date Created: 21 March 1988 ++ Date Last Updated: 11 November 1993 ++ Description: ++ This package provides algebraic functions over an integral domain. ++ Keywords: algebraic, function.
AlgebraicFunction(R, F) : Exports == Implementation where R : Join(Comparable, IntegralDomain) F : FunctionSpace R
SE ==> Symbol Z ==> Integer Q ==> Fraction Z OP ==> BasicOperator K ==> Kernel F P ==> SparseMultivariatePolynomial(R, K) UP ==> SparseUnivariatePolynomial F UPR ==> SparseUnivariatePolynomial R SPECIALDISP ==> '%specialDisp SPECIALDIFF ==> '%specialDiff SPECIALEQUAL ==> '%specialEqual
Exports ==> with rootOf : (UP, SE) -> F ++ rootOf(p, y) returns y such that \spad{p(y) = 0}. ++ The object returned displays as \spad{'y}. rootSum : (F, UP, SE) -> F ++ rootSum(expr, p, s) operator : OP -> OP ++ operator(op) returns a copy of \spad{op} with the domain-dependent ++ properties appropriate for \spad{F}. ++ Error: if op is not an algebraic operator, that is, ++ an nth root or implicit algebraic operator. belong? : OP -> Boolean ++ belong?(op) is true if \spad{op} is an algebraic operator, that is, ++ an nth root or implicit algebraic operator. inrootof : (UP, F) -> F ++ inrootof(p, x) should be a non-exported function. -- un-export when the compiler accepts conditional local functions! droot : List F -> OutputForm ++ droot(l) should be a non-exported function. -- un-export when the compiler accepts conditional local functions! if R has RetractableTo Integer then "^" : (F, Q) -> F ++ x ^ q is \spad{x} raised to the rational power \spad{q}. minPoly : K -> UP ++ minPoly(k) returns the defining polynomial of \spad{k}. definingPolynomial : F -> F ++ definingPolynomial(f) returns the defining polynomial of \spad{f} ++ as an element of \spad{F}. ++ Error: if f is not a kernel. iroot : (R, Z) -> F ++ iroot(p, n) should be a non-exported function. -- un-export when the compiler accepts conditional local functions!
Implementation ==> add
ALGOP := '%alg
ialg : List F -> F dvalg : (List F, SE) -> F dalg : List F -> OutputForm
opalg := operator('rootOf)$CommonOperators oproot := operator('nthRoot)$CommonOperators oprootsum := operator('%root_sum)$CommonOperators
belong? op == has?(op, ALGOP) or is?(op, '%root_sum) dalg l == second(l)::OutputForm
rootOf(p, x) == k := kernel(x)$K (r := retractIfCan(p)@Union(F, "failed")) case "failed" => inrootof(p, k::F) n := numer(f := univariate(r::F, k)) degree denom f > 0 => error "roofOf: variable appears in denom" inrootof(n, k::F)
dvalg(l, x) == p := numer univariate(first l, retract(second l)@K) alpha := kernel(opalg, l) - (map((s : F) : F +-> differentiate(s, x), p) alpha) _ / ((differentiate p) alpha)
ialg l == f := univariate(p := first l, retract(x := second l)@K) degree denom f > 0 => error "roofOf: variable appears in denom" inrootof(numer f, x)
operator op == is?(op, 'rootOf) => opalg is?(op, 'nthRoot) => oproot is?(op, '%root_sum) => oprootsum error "Unknown operator"
if R has AlgebraicallyClosedField then UP2R : UP -> Union(UPR, "failed")
inrootof(q, x) == monomial? q => 0
(d := degree q) <= 0 => error "rootOf: constant polynomial" -- one? d=> - leadingCoefficient(reductum q) / leadingCoefficient q (d = 1) => - leadingCoefficient(reductum q) / leadingCoefficient q ((rx := retractIfCan(x)@Union(SE, "failed")) case SE) and ((r := UP2R q) case UPR) => rootOf(r::UPR, rx::SE)::F kernel(opalg, [q x, x])
UP2R p == ans : UPR := 0 while p ~= 0 repeat (r := retractIfCan(leadingCoefficient p)@Union(R, "failed")) case "failed" => return "failed" ans := ans + monomial(r::R, degree p) p := reductum p ans
else inrootof(q, x) == monomial? q => 0 (d := degree q) <= 0 => error "rootOf: constant polynomial" -- one? d => - leadingCoefficient(reductum q) /leadingCoefficient q (d = 1) => - leadingCoefficient(reductum q) /leadingCoefficient q kernel(opalg, [q x, x])
eqopalg(k1 : K, k2 : K) : Boolean == al1 := argument(k1) al2 := argument(k2) dv1 := retract(al1.2)@K dv2 := retract(al2.2)@K pe1 := al1.1 pe2 := al2.1 dv1 = dv2 => pe1 = pe2 p1 := univariate(numer(pe1), dv1) p2 := univariate(numer(pe2), dv2) lc1 := leadingCoefficient(p1) lc2 := leadingCoefficient(p2) lc1 = lc2 => p1 = p2 lc2*p1 = lc1*p2
evaluate(opalg, ialg)$BasicOperatorFunctions1(F) setProperty(opalg, SPECIALDIFF, dvalg@((List F, SE) -> F) pretend None) setProperty(opalg, SPECIALDISP, dalg@(List F -> OutputForm) pretend None) setProperty(opalg, SPECIALEQUAL, eqopalg@((K, K) -> Boolean) pretend None)
POLYCATQ ==> PolynomialCategoryQuotientFunctions(IndexedExponents(K), K, R, P, F)
root_sum1(expr : F, p : UP, x : F) : F == expr = 0 => 0 nexpr := univariate(expr, (k := retract(x)@K), p)$POLYCATQ xs := retract(x)@SE every?((c : F) : Boolean +-> D(c, xs) = 0, coefficients(nexpr)) => res : F := 0 for i in 0..(degree(p) - 1) repeat nexpr := nexpr rem p res := res + coefficient(nexpr, i) nexpr := monomial(1, 1)$UP*nexpr res kernel(oprootsum, [nexpr(x), x, p(x)])
rootSum(expr : F, p : UP, s : SE) : F == k := kernel(s)$K root_sum1(expr, p, k::F)
irootsum(l : List F) : F == p := univariate(p := l.3, retract(x := l.2)@K) degree denom p > 0 => error "roofSum: variable appears in denom of p" root_sum1(l.1, numer(p), x)
drootsum(l : List F) : OutputForm == dv := retract(l.2)@K p := univariate(numer(l.3), dv) sum((l.1)::OutputForm, outputForm(p, dv::OutputForm) = (0$Z)::OutputForm)
dvrootsum(l : List F, x : SE) : F == print("dvrootsum"::OutputForm) print(l::OutputForm) dv := retract(alpha := l.2)@K dvs := retract(alpha)@SE p : UP := numer(univariate(l.3, dv)) print(p::OutputForm) dalpha := - (map((s : F) : F +-> differentiate(s, x), p) alpha) / ((differentiate p) alpha) expr := l.1 nexpr := dalpha*differentiate(expr, dvs) + differentiate(expr, x) print(nexpr::OutputForm) nexpr = 0 => 0 root_sum1(nexpr, p, alpha)
evaluate(oprootsum, irootsum)$BasicOperatorFunctions1(F)
setProperty(oprootsum, SPECIALDIFF, dvrootsum@((List F, SE) -> F) pretend None) setProperty(oprootsum, SPECIALDISP, drootsum@(List F -> OutputForm) pretend None)
if R has RetractableTo Integer then import from PolynomialRoots(IndexedExponents K, K, R, P, F)
dumvar := '%%var::F
lzero : List F -> F dvroot : List F -> F inroot : List F -> F hackroot : (F, Z) -> F inroot0 : (F, Z, Boolean, Boolean) -> F
lzero l == 0
droot l == x := first(l)::OutputForm (n := retract(second l)@Z) = 2 => root x root(x, n::OutputForm)
dvroot l == n := retract(second l)@Z (first(l) ^ ((1 - n) / n)) / (n::F)
x ^ q == qr := divide(numer q, denom q) x ^ qr.quotient * inroot([x, (denom q)::F]) ^ qr.remainder
hackroot(x, n) == (n = 1) or (x = 1) => x (((dx := denom x) ~= 1) and ((rx := retractIfCan(dx)@Union(Integer,"failed")) case Integer) and positive?(rx)) => hackroot((numer x)::F, n)/hackroot(rx::Integer::F, n) (x = -1) and n = 4 => ((-1::F) ^ (1::Q / 2::Q) + 1) / ((2::F) ^ (1::Q / 2::Q)) kernel(oproot, [x, n::F])
inroot l == zero?(n := retract(second l)@Z) => error "root: exponent = 0" -- one?(x := first l) or one? n => x ((x := first l) = 1) or (n = 1) => x (r := retractIfCan(x)@Union(R,"failed")) case R => iroot(r::R,n) (u := isExpt(x)) case Record(var : K, exponent : Z) => pr := u::Record(var : K, exponent : Z) is?(pr.var, oproot) and #argument(pr.var) = 2 => (first argument(pr.var)) ^ (pr.exponent /$Fraction(Z) (n * retract(second argument(pr.var))@Z)) inroot0(x, n, false, false) inroot0(x, n, false, false)
-- removes powers of positive integers from numer and denom -- num? or den? is true if numer or denom already processed inroot0(x, n, num?, den?) == rn:Union(Z, "failed") := (num? => "failed"; retractIfCan numer x) rd:Union(Z, "failed") := (den? => "failed"; retractIfCan denom x) (rn case Z) and (rd case Z) => rec := qroot(rn::Z / rd::Z, n::NonNegativeInteger) rec.coef * hackroot(rec.radicand, rec.exponent) rn case Z => rec := qroot(rn::Z::Fraction(Z), n::NonNegativeInteger) rec.coef * inroot0((rec.radicand^(n exquo rec.exponent)::Z) / (denom(x)::F), n, true, den?) rd case Z => rec := qroot(rd::Z::Fraction(Z), n::NonNegativeInteger) inroot0((numer(x)::F) / (rec.radicand ^ (n exquo rec.exponent)::Z), n, num?, true) / rec.coef hackroot(x, n)
if R has AlgebraicallyClosedField then iroot(r, n) == nthRoot(r, n)::F else iroot0 : (R, Z) -> F
if R has RadicalCategory then if R has imaginary : () -> R then iroot(r, n) == nthRoot(r, n)::F else iroot(r, n) == odd? n or not(smaller?(r, 0)) => nthRoot(r, n)::F iroot0(r, n)
else iroot(r, n) == iroot0(r, n)
iroot0(r, n) == rec := rroot(r, n::NonNegativeInteger) rec.coef * hackroot(rec.radicand, rec.exponent)
definingPolynomial x == (r := retractIfCan(x)@Union(K, "failed")) case K => is?(k := r::K, opalg) => first argument k is?(k, oproot) => dumvar ^ retract(second argument k)@Z - first argument k dumvar - x dumvar - x
minPoly k == is?(k, opalg) => numer univariate(first argument k, retract(second argument k)@K) is?(k, oproot) => monomial(1, retract(second argument k)@Z :: NonNegativeInteger) - first(argument k)::UP monomial(1, 1) - k::F::UP
evaluate(oproot, inroot)$BasicOperatorFunctions1(F) derivative(oproot, [dvroot, lzero])
else -- R is not retractable to Integer droot l == x := first(l)::OutputForm (n := second l) = 2::F => root x root(x, n::OutputForm)
minPoly k == is?(k, opalg) => numer univariate(first argument k, retract(second argument k)@K) monomial(1, 1) - k::F::UP
setProperty(oproot, SPECIALDISP, droot@(List F -> OutputForm) pretend None)
--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. --All rights reserved. -- --Redistribution and use in source and binary forms, with or without --modification, are permitted provided that the following conditions are --met: -- -- - Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- -- - Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in -- the documentation and/or other materials provided with the -- distribution. -- -- - Neither the name of The Numerical ALgorithms Group Ltd. nor the -- names of its contributors may be used to endorse or promote products -- derived from this software without specific prior written permission. -- --THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS --IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED --TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A --PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER --OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, --EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, --PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR --PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF --LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING --NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS --SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- SPAD files for the functional world should be compiled in the -- following order: -- -- op kl fspace ALGFUNC expr
spad
   Compiling FriCAS source code from file 
      /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/1569004914938216007-25px001.spad
      using old system compiler.
   ACF abbreviates category AlgebraicallyClosedField 
------------------------------------------------------------------------
   initializing NRLIB ACF for AlgebraicallyClosedField 
   compiling into NRLIB ACF 
;;; *** |AlgebraicallyClosedField| REDEFINED Time: 0 SEC.
ACF- abbreviates domain AlgebraicallyClosedField& ------------------------------------------------------------------------ initializing NRLIB ACF- for AlgebraicallyClosedField& compiling into NRLIB ACF- processing macro definition SUP ==> SparseUnivariatePolynomial S importing List Symbol compiling exported zeroOf : SparseUnivariatePolynomial S -> S Time: 0.06 SEC.
compiling exported rootOf : SparseUnivariatePolynomial S -> S Time: 0 SEC.
compiling exported zerosOf : SparseUnivariatePolynomial S -> List S Time: 0 SEC.
compiling exported rootsOf : SparseUnivariatePolynomial S -> List S Time: 0 SEC.
compiling exported rootsOf : (SparseUnivariatePolynomial S,Symbol) -> List S Time: 0.01 SEC.
compiling exported zerosOf : (SparseUnivariatePolynomial S,Symbol) -> List S Time: 0 SEC.
compiling local assign : (Symbol,S) -> S Time: 0 SEC.
compiling exported zeroOf : Polynomial S -> S Time: 0 SEC.
compiling exported rootOf : Polynomial S -> S Time: 0.01 SEC.
compiling exported zerosOf : Polynomial S -> List S Time: 0 SEC.
compiling exported rootsOf : Polynomial S -> List S Time: 0 SEC.
compiling exported zeroOf : (SparseUnivariatePolynomial S,Symbol) -> S Time: 0.01 SEC.
compiling local binomialRoots : (SparseUnivariatePolynomial S,Symbol,(SparseUnivariatePolynomial S,Symbol) -> S) -> List S Time: 0.03 SEC.
importing PolynomialDecomposition(SparseUnivariatePolynomial S,S) compiling local allroots : (SparseUnivariatePolynomial S,Symbol,(SparseUnivariatePolynomial S,Symbol) -> S) -> List S Time: 0.03 SEC.
(time taken in buildFunctor: 0)
;;; *** |AlgebraicallyClosedField&| REDEFINED Time: 0 SEC.
Warnings: [1] zeroOf: not known that (Ring) is of mode (CATEGORY domain (SIGNATURE zerosOf ((List S) (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE zerosOf ((List S) (SparseUnivariatePolynomial S))) (SIGNATURE zerosOf ((List S) (Polynomial S))) (SIGNATURE zeroOf (S (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE zeroOf (S (SparseUnivariatePolynomial S))) (SIGNATURE zeroOf (S (Polynomial S))) (SIGNATURE rootsOf ((List S) (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE rootsOf ((List S) (SparseUnivariatePolynomial S))) (SIGNATURE rootsOf ((List S) (Polynomial S))) (SIGNATURE rootOf (S (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE rootOf (S (SparseUnivariatePolynomial S))) (SIGNATURE rootOf (S (Polynomial S))))
Cumulative Statistics for Constructor AlgebraicallyClosedField& Time: 0.15 seconds
finalizing NRLIB ACF- Processing AlgebraicallyClosedField& for Browser database: --------constructor--------- --------(rootOf (% (Polynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(rootsOf ((List %) (Polynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zeroOf (% (Polynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zerosOf ((List %) (Polynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- ; compiling file "/var/aw/var/LatexWiki/ACF-.NRLIB/ACF-.lsp" (written 27 FEB 2015 01:09:26 PM):
; /var/aw/var/LatexWiki/ACF-.NRLIB/ACF-.fasl written ; compilation finished in 0:00:00.119 ------------------------------------------------------------------------ AlgebraicallyClosedField& is now explicitly exposed in frame initial
AlgebraicallyClosedField& will be automatically loaded when needed from /var/aw/var/LatexWiki/ACF-.NRLIB/ACF- finalizing NRLIB ACF Processing AlgebraicallyClosedField for Browser database: --------constructor--------- --------(rootOf (% (Polynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(rootsOf ((List %) (Polynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zeroOf (% (Polynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zerosOf ((List %) (Polynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- ; compiling file "/var/aw/var/LatexWiki/ACF.NRLIB/ACF.lsp" (written 27 FEB 2015 01:09:26 PM):
; /var/aw/var/LatexWiki/ACF.NRLIB/ACF.fasl written ; compilation finished in 0:00:00.004 ------------------------------------------------------------------------ AlgebraicallyClosedField is now explicitly exposed in frame initial AlgebraicallyClosedField will be automatically loaded when needed from /var/aw/var/LatexWiki/ACF.NRLIB/ACF
ACFS abbreviates category AlgebraicallyClosedFunctionSpace ------------------------------------------------------------------------ initializing NRLIB ACFS for AlgebraicallyClosedFunctionSpace compiling into NRLIB ACFS
;;; *** |AlgebraicallyClosedFunctionSpace| REDEFINED Time: 0 SEC.
ACFS- abbreviates domain AlgebraicallyClosedFunctionSpace& ------------------------------------------------------------------------ initializing NRLIB ACFS- for AlgebraicallyClosedFunctionSpace& compiling into NRLIB ACFS- ****** Domain: R already in scope importing Integer importing List Symbol importing SparseUnivariatePolynomial S importing Fraction SparseUnivariatePolynomial S compiling exported rootOf : S -> S Time: 0.02 SEC.
compiling exported rootsOf : S -> List S Time: 0.01 SEC.
compiling exported zeroOf : S -> S Time: 0 SEC.
compiling exported zerosOf : S -> List S Time: 0 SEC.
compiling exported zeroOf : (S,Symbol) -> S Time: 0.02 SEC.
compiling exported rootOf : (S,Symbol) -> S Time: 0 SEC.
compiling exported zerosOf : (S,Symbol) -> List S Time: 0.01 SEC.
compiling exported rootsOf : (S,Symbol) -> List S Time: 0 SEC.
compiling exported rootsOf : (SparseUnivariatePolynomial S,Symbol) -> List S Time: 0 SEC.
compiling exported zerosOf : (SparseUnivariatePolynomial S,Symbol) -> List S Time: 0.01 SEC.
compiling exported zeroOf : (SparseUnivariatePolynomial S,Symbol) -> S Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |AlgebraicallyClosedFunctionSpace&| REDEFINED Time: 0 SEC.
Warnings: [1] not known that (Ring) is of mode (CATEGORY domain (SIGNATURE zerosOf ((List S) S (Symbol))) (SIGNATURE zeroOf (S S (Symbol))) (SIGNATURE zerosOf ((List S) S)) (SIGNATURE zeroOf (S S)) (SIGNATURE rootsOf ((List S) S (Symbol))) (SIGNATURE rootOf (S S (Symbol))) (SIGNATURE rootsOf ((List S) S)) (SIGNATURE rootOf (S S)) (SIGNATURE zerosOf ((List S) (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE zerosOf ((List S) (SparseUnivariatePolynomial S))) (SIGNATURE zerosOf ((List S) (Polynomial S))) (SIGNATURE zeroOf (S (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE zeroOf (S (SparseUnivariatePolynomial S))) (SIGNATURE zeroOf (S (Polynomial S))) (SIGNATURE rootsOf ((List S) (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE rootsOf ((List S) (SparseUnivariatePolynomial S))) (SIGNATURE rootsOf ((List S) (Polynomial S))) (SIGNATURE rootOf (S (SparseUnivariatePolynomial S) (Symbol))) (SIGNATURE rootOf (S (SparseUnivariatePolynomial S))) (SIGNATURE rootOf (S (Polynomial S))))
Cumulative Statistics for Constructor AlgebraicallyClosedFunctionSpace& Time: 0.07 seconds
finalizing NRLIB ACFS- Processing AlgebraicallyClosedFunctionSpace& for Browser database: --------constructor--------- --------(rootOf (% (Polynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(rootsOf ((List %) (Polynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zeroOf (% (Polynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zerosOf ((List %) (Polynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------constructor--------- --------(rootOf (% %))--------- --------(rootsOf ((List %) %))--------- --------(rootOf (% % (Symbol)))--------- --------(rootsOf ((List %) % (Symbol)))--------- --------(zeroOf (% %))--------- --------(zerosOf ((List %) %))--------- --------(zeroOf (% % (Symbol)))--------- --------(zerosOf ((List %) % (Symbol)))--------- --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/ACFS.spad-->AlgebraicallyClosedFunctionSpace&((rootSum (% % (SparseUnivariatePolynomial %) (Symbol)))): Not documented!!!! --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/ACFS.spad-->AlgebraicallyClosedFunctionSpace&(): Spurious comments: Model for algebraically closed function spaces. ; compiling file "/var/aw/var/LatexWiki/ACFS-.NRLIB/ACFS-.lsp" (written 27 FEB 2015 01:09:26 PM):
; /var/aw/var/LatexWiki/ACFS-.NRLIB/ACFS-.fasl written ; compilation finished in 0:00:00.041 ------------------------------------------------------------------------ AlgebraicallyClosedFunctionSpace& is now explicitly exposed in frame initial AlgebraicallyClosedFunctionSpace& will be automatically loaded when needed from /var/aw/var/LatexWiki/ACFS-.NRLIB/ACFS- finalizing NRLIB ACFS Processing AlgebraicallyClosedFunctionSpace for Browser database: --------constructor--------- --------(rootOf (% (Polynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(rootsOf ((List %) (Polynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zeroOf (% (Polynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zerosOf ((List %) (Polynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------constructor--------- --------(rootOf (% %))--------- --------(rootsOf ((List %) %))--------- --------(rootOf (% % (Symbol)))--------- --------(rootsOf ((List %) % (Symbol)))--------- --------(zeroOf (% %))--------- --------(zerosOf ((List %) %))--------- --------(zeroOf (% % (Symbol)))--------- --------(zerosOf ((List %) % (Symbol)))--------- --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/ACFS.spad-->AlgebraicallyClosedFunctionSpace((rootSum (% % (SparseUnivariatePolynomial %) (Symbol)))): Not documented!!!! --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/ACFS.spad-->AlgebraicallyClosedFunctionSpace(): Spurious comments: Model for algebraically closed function spaces. ; compiling file "/var/aw/var/LatexWiki/ACFS.NRLIB/ACFS.lsp" (written 27 FEB 2015 01:09:26 PM):
; /var/aw/var/LatexWiki/ACFS.NRLIB/ACFS.fasl written ; compilation finished in 0:00:00.003 ------------------------------------------------------------------------ AlgebraicallyClosedFunctionSpace is now explicitly exposed in frame initial AlgebraicallyClosedFunctionSpace will be automatically loaded when needed from /var/aw/var/LatexWiki/ACFS.NRLIB/ACFS
AF abbreviates package AlgebraicFunction ------------------------------------------------------------------------ initializing NRLIB AF for AlgebraicFunction compiling into NRLIB AF ****** Domain: R already in scope compiling exported belong? : BasicOperator -> Boolean Time: 0 SEC.
compiling local dalg : List F -> OutputForm Time: 0.01 SEC.
compiling exported rootOf : (SparseUnivariatePolynomial F,Symbol) -> F Time: 0.01 SEC.
compiling local dvalg : (List F,Symbol) -> F Time: 0.02 SEC.
compiling local ialg : List F -> F Time: 0 SEC.
compiling exported operator : BasicOperator -> BasicOperator Time: 0.01 SEC.
****** Domain: R already in scope augmenting R: (AlgebraicallyClosedField) compiling exported inrootof : (SparseUnivariatePolynomial F,F) -> F Time: 0.01 SEC.
compiling local UP2R : SparseUnivariatePolynomial F -> Union(SparseUnivariatePolynomial R,failed) Time: 0.01 SEC.
compiling exported inrootof : (SparseUnivariatePolynomial F,F) -> F Time: 0 SEC.
compiling local eqopalg : (Kernel F,Kernel F) -> Boolean Time: 0.03 SEC.
processing macro definition POLYCATQ ==> PolynomialCategoryQuotientFunctions(IndexedExponents Kernel F,Kernel F,R,SparseMultivariatePolynomial(R,Kernel F),F) compiling local root_sum1 : (F,SparseUnivariatePolynomial F,F) -> F Time: 0.03 SEC.
compiling exported rootSum : (F,SparseUnivariatePolynomial F,Symbol) -> F Time: 0.01 SEC.
compiling local irootsum : List F -> F Local variable p type redefined: (Fraction (SparseUnivariatePolynomial F)) to (F) Time: 0 SEC.
compiling local drootsum : List F -> OutputForm Time: 0.02 SEC.
compiling local dvrootsum : (List F,Symbol) -> F Time: 0.08 SEC.
****** Domain: R already in scope augmenting R: (RetractableTo (Integer)) augmenting $: (SIGNATURE $ ^ (F F (Fraction (Integer)))) augmenting $: (SIGNATURE $ minPoly ((SparseUnivariatePolynomial F) (Kernel F))) augmenting $: (SIGNATURE $ definingPolynomial (F F)) augmenting $: (SIGNATURE $ iroot (F R (Integer))) importing PolynomialRoots(IndexedExponents Kernel F,Kernel F,R,SparseMultivariatePolynomial(R,Kernel F),F) compiling local lzero : List F -> F Time: 0 SEC.
compiling exported droot : List F -> OutputForm Time: 0.01 SEC.
compiling local dvroot : List F -> F Time: 0.02 SEC.
compiling exported ^ : (F,Fraction Integer) -> F Time: 0.04 SEC.
compiling local hackroot : (F,Integer) -> F Time: 0.03 SEC.
compiling local inroot : List F -> F Time: 0.01 SEC.
compiling local inroot0 : (F,Integer,Boolean,Boolean) -> F Time: 0.07 SEC.
****** Domain: R already in scope augmenting R: (AlgebraicallyClosedField) compiling exported iroot : (R,Integer) -> F Time: 0 SEC.
****** Domain: R already in scope augmenting R: (RadicalCategory) augmenting R: (SIGNATURE R imaginary (R)) compiling exported iroot : (R,Integer) -> F Time: 0 SEC.
compiling exported iroot : (R,Integer) -> F Time: 0 SEC.
compiling exported iroot : (R,Integer) -> F Time: 0 SEC.
compiling local iroot0 : (R,Integer) -> F Time: 0.01 SEC.
compiling exported definingPolynomial : F -> F Time: 0.01 SEC.
compiling exported minPoly : Kernel F -> SparseUnivariatePolynomial F Time: 0 SEC.
compiling exported droot : List F -> OutputForm Time: 0.01 SEC.
compiling exported minPoly : Kernel F -> SparseUnivariatePolynomial F Time: 0.01 SEC.
****** Domain: R already in scope augmenting R: (RetractableTo (Integer)) augmenting $: (SIGNATURE $ ^ (F F (Fraction (Integer)))) augmenting $: (SIGNATURE $ minPoly ((SparseUnivariatePolynomial F) (Kernel F))) augmenting $: (SIGNATURE $ definingPolynomial (F F)) augmenting $: (SIGNATURE $ iroot (F R (Integer))) (time taken in buildFunctor: 0)
;;; *** |AlgebraicFunction| REDEFINED
;;; *** |AlgebraicFunction| REDEFINED Time: 0 SEC.
Warnings: [1] rootOf: not known that (Comparable) is of mode (CATEGORY package (SIGNATURE rootOf (F (SparseUnivariatePolynomial F) (Symbol))) (SIGNATURE rootSum (F F (SparseUnivariatePolynomial F) (Symbol))) (SIGNATURE operator ((BasicOperator) (BasicOperator))) (SIGNATURE belong? ((Boolean) (BasicOperator))) (SIGNATURE inrootof (F (SparseUnivariatePolynomial F) F)) (SIGNATURE droot ((OutputForm) (List F))) (IF (has R (RetractableTo (Integer))) (PROGN (SIGNATURE ^ (F F (Fraction (Integer)))) (SIGNATURE minPoly ((SparseUnivariatePolynomial F) (Kernel F))) (SIGNATURE definingPolynomial (F F)) (SIGNATURE iroot (F R (Integer)))) noBranch)) [2] ^: quotient has no value [3] ^: remainder has no value [4] inroot: var has no value [5] inroot: exponent has no value [6] inroot0: coef has no value [7] inroot0: radicand has no value [8] inroot0: exponent has no value [9] inroot0: rd has no value [10] iroot0: coef has no value [11] iroot0: radicand has no value [12] iroot0: exponent has no value
Cumulative Statistics for Constructor AlgebraicFunction Time: 0.46 seconds
finalizing NRLIB AF Processing AlgebraicFunction for Browser database: --------constructor--------- --------(rootOf (% (Polynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %)))--------- --------(rootOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(rootsOf ((List %) (Polynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(rootsOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zeroOf (% (Polynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %)))--------- --------(zeroOf (% (SparseUnivariatePolynomial %) (Symbol)))--------- --------(zerosOf ((List %) (Polynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %)))--------- --------(zerosOf ((List %) (SparseUnivariatePolynomial %) (Symbol)))--------- --------constructor--------- --------(rootOf (% %))--------- --------(rootsOf ((List %) %))--------- --------(rootOf (% % (Symbol)))--------- --------(rootsOf ((List %) % (Symbol)))--------- --------(zeroOf (% %))--------- --------(zerosOf ((List %) %))--------- --------(zeroOf (% % (Symbol)))--------- --------(zerosOf ((List %) % (Symbol)))--------- --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/AF.spad-->AlgebraicFunction((rootSum (% % (SparseUnivariatePolynomial %) (Symbol)))): Not documented!!!! --------constructor--------- --------(rootOf (F (SparseUnivariatePolynomial F) (Symbol)))--------- --------(rootSum (F F (SparseUnivariatePolynomial F) (Symbol)))--------- --------(operator ((BasicOperator) (BasicOperator)))--------- --------(belong? ((Boolean) (BasicOperator)))--------- --------(inrootof (F (SparseUnivariatePolynomial F) F))--------- --------(droot ((OutputForm) (List F)))--------- --------(^ (F F (Fraction (Integer))))--------- --------(minPoly ((SparseUnivariatePolynomial F) (Kernel F)))--------- --------(definingPolynomial (F F))--------- --------(iroot (F R (Integer)))--------- --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/AF.spad-->AlgebraicFunction(): Spurious comments: Model for algebraically closed function spaces. --->/usr/local/lib/fricas/target/x86_64-unknown-linux/../../src/algebra/AF.spad-->AlgebraicFunction(): Spurious comments: This package provides algebraic functions over an integral domain. ; compiling file "/var/aw/var/LatexWiki/AF.NRLIB/AF.lsp" (written 27 FEB 2015 01:09:27 PM):
; /var/aw/var/LatexWiki/AF.NRLIB/AF.fasl written ; compilation finished in 0:00:00.272 ------------------------------------------------------------------------ AlgebraicFunction is now explicitly exposed in frame initial AlgebraicFunction will be automatically loaded when needed from /var/aw/var/LatexWiki/AF.NRLIB/AF