\documentclass{article}
\usepackage{open-axiom}
\begin{document}
\title{\$SPAD/src/algebra nsregset.spad}
\author{Marc Moreno Maza}
\maketitle
\begin{abstract}
\end{abstract}
\eject
\tableofcontents
\eject
\section{category SNTSCAT SquareFreeNormalizedTriangularSetCategory}
<<category SNTSCAT SquareFreeNormalizedTriangularSetCategory>>=
)abbrev category SNTSCAT SquareFreeNormalizedTriangularSetCategory
++ Author: Marc Moreno Maza
++ Date Created: 10/07/1998
++ Date Last Updated: 12/16/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))

@
\section{package LAZM3PK LazardSetSolvingPackage}
<<package LAZM3PK LazardSetSolvingPackage>>=
)abbrev package LAZM3PK LazardSetSolvingPackage
++ Author: Marc Moreno Maza
++ Date Created: 10/02/1998
++ Date Last Updated: 12/16/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
       ++ \axiom{normalizeIfCan(ts)} returns \axiom{ts} in an normalized shape
       ++ if \axiom{ts} is zero-dimensional.
     zeroSetSplit: (LP, B) -> List ST
       ++ \axiom{zeroSetSplit(lp,clos?)} has the same specifications as
       ++ \axiomOpFrom{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]

@
\section{License}
<<license>>=
--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.
@
<<*>>=
<<license>>

<<category SNTSCAT SquareFreeNormalizedTriangularSetCategory>>
<<package LAZM3PK LazardSetSolvingPackage>>
@
\eject
\begin{thebibliography}{99}
\bibitem{1} nothing
\end{thebibliography}
\end{document}