)abbrev category SNTSCAT SquareFreeNormalizedTriangularSetCategory
++ Author: Marc Moreno Maza
++ Date Created: 10/07/1998
++ Basic Functions:
++ Related Constructors:
++ Also See: essai Graphisme
++ AMS Classifications:
++ Keywords: polynomial, multivariate, ordered variables set
++ Description:
++ The category of square-free and normalized triangular sets.
++ Thus, up to the primitivity axiom of [1], these sets are Lazard
++ triangular sets.\newline
++ References:
++  [1] D. LAZARD "A new method for solving algebraic systems of
++      positive dimension" Discr. App. Math. 33:147-160,1991
SquareFreeNormalizedTriangularSetCategory(R : GcdDomain, E : OrderedAbelianMonoidSup, _
 V : OrderedSet, P : RecursivePolynomialCategory(R, E, V)):
         Category ==
   Join(SquareFreeRegularTriangularSetCategory(R, E, V, P), NormalizedTriangularSetCategory(R, E, V, P))

)abbrev package LAZM3PK LazardSetSolvingPackage
++ Author: Marc Moreno Maza
++ Date Created: 10/02/1998
++ Basic Functions:
++ Related Constructors:
++ Also See:
++ AMS Classifications:
++ Keywords:
++ Description:
++ A package for solving polynomial systems by means of Lazard triangular
++ sets [1].
++ This package provides two operations. One for solving in the sense
++ of the regular zeros, and the other for solving in the sense of
++ the Zariski closure. Both produce square-free regular sets.
++ Moreover, the decompositions do not contain any redundant component.
++ However, only zero-dimensional regular sets are normalized, since
++ normalization may be time consumming in positive dimension.
++ The decomposition process is that of [2].\newline
++ References:
++  [1] D. LAZARD "A new method for solving algebraic systems of
++      positive dimension" Discr. App. Math. 33:147-160,1991
++  [2] M. MORENO MAZA "A new algorithm for computing triangular
++      decomposition of algebraic varieties" NAG Tech. Rep. 4/98.
++ Version: 1.

LazardSetSolvingPackage(R, E, V, P, TS, ST) : Exports == Implementation where

  R : GcdDomain
  E : OrderedAbelianMonoidSup
  V : OrderedSet
  P : RecursivePolynomialCategory(R, E, V)
  TS : RegularTriangularSetCategory(R, E, V, P)
  ST : SquareFreeRegularTriangularSetCategory(R, E, V, P)
  N ==> NonNegativeInteger
  Z ==> Integer
  B ==> Boolean
  S ==> String
  K ==> Fraction R
  LP ==> List P
  PWT ==> Record(val : P, tower : TS)
  BWT ==> Record(val : Boolean, tower : TS)
  LpWT ==> Record(val : (List P), tower : TS)
  Split ==> List TS
  --KeyGcd ==> Record(arg1: P, arg2: P, arg3: TS, arg4: B)
  --EntryGcd ==> List PWT
  --HGcd ==> TabulatedComputationPackage(KeyGcd, EntryGcd)
  --KeyInvSet ==> Record(arg1: P, arg3: TS)
  --EntryInvSet ==> List TS
  --HInvSet ==> TabulatedComputationPackage(KeyInvSet, EntryInvSet)
  polsetpack ==> PolynomialSetUtilitiesPackage(R, E, V, P)
  regsetgcdpack ==> SquareFreeRegularTriangularSetGcdPackage(R, E, V, P, ST)
  quasicomppack ==> SquareFreeQuasiComponentPackage(R, E, V, P, ST)
  normalizpack ==> NormalizationPackage(R, E, V, P, ST)

  Exports ==  with

     normalizeIfCan : ST -> ST
       ++ \spad{normalizeIfCan(ts)} returns \spad{ts} in an normalized shape
       ++ if \spad{ts} is zero-dimensional.
     zeroSetSplit : (LP, B) -> List ST
       ++ \spad{zeroSetSplit(lp, clos?)} has the same specifications as
       ++ \spadopFrom{zeroSetSplit(lp, clos?)}{RegularTriangularSetCategory}.

  Implementation == add

     convert(st : ST) : TS ==
       ts : TS := empty()
       lp : LP := members(st)$ST
       lp := sort(infRittWu?, lp)
       for p in lp repeat
         ts := internalAugment(p, ts)$TS
       ts

     squareFree(ts : TS) : List ST ==
       empty? ts => [empty()$ST]
       lp : LP := members(ts)$TS
       lp := sort(infRittWu?, lp)
       newts : ST := empty()$ST
       toSee : List ST := [newts]
       toSave : List ST
       for p in lp repeat
         toSave := []
         while (not empty? toSee) repeat
           us := first toSee; toSee := rest toSee
           lpwt := stoseSquareFreePart(p, us)$regsetgcdpack
           for pwt in lpwt repeat
             newus := internalAugment(pwt.val, pwt.tower)$ST
             toSave := cons(newus, toSave)
         toSee := toSave
       toSave

     normalizeIfCan(ts : ST) : ST ==
       empty? ts => ts
       lp : LP := members(ts)$ST
       lp := sort(infRittWu?, lp)
       p : P := first lp
       not univariate?(p)$polsetpack => ts
       lp := rest lp
       newts : ST := empty()$ST
       newts := internalAugment(p, newts)$ST
       while (not empty? lp) repeat
         p := first lp
         lv := variables(p)
         for v in lv repeat
           v = mvar(p) => "leave"
           not algebraic?(v, newts) => return internalAugment(lp, newts)$ST
         lp := rest lp
         p := normalizedAssociate(p, newts)$normalizpack
         newts := internalAugment(p, newts)$ST
       newts

     zeroSetSplit(lp : List(P), clos? : B) : List ST ==
       -- if clos? then SOLVE in the closure sense
       toSee : Split := zeroSetSplit(lp, clos?)$TS
       toSave : List ST := []
       for ts in toSee repeat
         toSave := concat(squareFree(ts), toSave)
       toSave := removeSuperfluousQuasiComponents(toSave)$quasicomppack
       [normalizeIfCan(ts) for ts in toSave]

--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.
