/usr/share/axiom-20170501/src/algebra/SCELL.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | )abbrev domain SCELL SimpleCell
SimpleCell(TheField,ThePols) : SIG == CODE where
TheField : RealClosedField
ThePols : UnivariatePolynomialCategory(TheField)
O ==> OutputForm
B ==> Boolean
Z ==> Integer
N ==> NonNegativeInteger
VARS ==> RealPolynomialUtilitiesPackage(TheField,ThePols)
LF ==> List(TheField)
SIG ==> CoercibleTo(O) with
allSimpleCells : (ThePols,Symbol) -> List %
allSimpleCells : (List(ThePols),Symbol) -> List %
hasDimension? : % -> B
samplePoint : % -> TheField
stablePol : % -> ThePols
variableOf : % -> Symbol
separe : (LF,TheField,TheField) -> LF
pointToCell : (TheField,B,Symbol) -> %
CODE ==> add
Rep := Record(samplePoint:TheField,
hasDim:B,
varOf:Symbol)
samplePoint(c) == c.samplePoint
stablePol(c) == error "Prout"
hasDimension?(c) == c.hasDim
variableOf(c) == c.varOf
coerce(c:%):O ==
o : O := ((c.varOf)::O) = ((c.samplePoint)::O)
brace [o,(c.hasDim)::O]
separe(liste,gauche,droite) ==
milieu : TheField := (gauche + droite) / (2::TheField)
liste = [] => [milieu]
#liste = 1 => [gauche,first(liste),droite]
nbe := first(liste)
lg :List(TheField) := []
ld :List(TheField) := rest(liste)
sg := sign(milieu-nbe)
while sg > 0 repeat
lg := cons(nbe,lg)
ld = [] => return(separe(reverse(lg),gauche,milieu))
nbe := first(ld)
sg := sign(milieu-nbe)
ld := rest(ld)
sg < 0 =>
append(separe(reverse(lg),gauche,milieu),
rest(separe(cons(nbe,ld),milieu,droite)))
newDroite := (gauche+milieu)/(2::TheField)
null lg =>
newGauche := (milieu+droite)/(2::TheField)
while newGauche >= first(ld) repeat
newGauche := (milieu+newGauche)/(2::TheField)
append([gauche,milieu],separe(ld,newGauche,droite))
while newDroite <= first(lg) repeat
newDroite := (newDroite+milieu)/(2::TheField)
newGauche := (milieu+droite)/(2::TheField)
null ld => append(separe(reverse(lg),gauche,newDroite),[milieu,droite])
while newGauche >= first(ld) repeat
newGauche := (milieu+newGauche)/(2::TheField)
append(separe(reverse(lg),gauche,newDroite),
cons(milieu,separe(ld,newGauche,droite)))
pointToCell(sp,hasDim?,varName) ==
[sp,hasDim?,varName]$Rep
allSimpleCells(p:ThePols,var:Symbol) ==
allSimpleCells([p],var)
PACK ==> CylindricalAlgebraicDecompositionUtilities(TheField,ThePols)
allSimpleCells(lp:List(ThePols),var:Symbol) ==
lp1 := gcdBasis(lp)$PACK
null(lp1) => [pointToCell(0,true,var)]
b := ("max" / [ boundOfCauchy(p)$VARS for p in lp1 ])::TheField
l := "append" / [allRootsOf(makeSUP(unitCanonical(p))) for p in lp1]
l := sort(l)
l1 := separe(l,-b,b)
res : List(%) := [pointToCell(first(l1),true,var)]
l1 := rest(l1)
while not(null(l1)) repeat
res := cons(pointToCell(first(l1),false,var),res)
l1 := rest(l1)
l1 = [] => return(error "Liste vide")
res := cons(pointToCell(first(l1),true,var),res)
l1 := rest(l1)
reverse! res
|