/usr/share/axiom-20170501/src/algebra/INTFRSP.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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | )abbrev package INTFRSP InterpolateFormsPackage
++ Author: Gaetan Hache
++ Date Created: 17 nov 1992
++ Date Last Updated: May 2010 by Tim Daly
++ Description:
++ The following is part of the PAFF package
InterpolateFormsPackage(K,symb,PolyRing,E,ProjPt,PCS,Plc,DIVISOR) :
SIG == CODE where
K:Field
symb: List(Symbol)
OV ==> OrderedVariableList(symb)
E : DirectProductCategory(#symb,NonNegativeInteger)
PolyRing : PolynomialCategory(K,E,OV)
ProjPt : ProjectiveSpaceCategory(K)
PCS : LocalPowerSeriesCategory(K)
Plc : PlacesCategory(K,PCS)
DIVISOR : DivisorCategory(Plc)
INT ==> Integer
NNI ==> NonNegativeInteger
ParamPack ==> ParametrizationPackage(K,symb,PolyRing,E,ProjPt,PCS,Plc)
PackPoly ==> PackageForPoly(K,PolyRing,E,#symb)
LINPACK ==> LinearSystemFromPowerSeriesPackage(K,PCS)
SIG ==> with
basisOfInterpolateForms : (DIVISOR,List PolyRing) -> List(Vector(K))
basisOfInterpolateFormsForFact : (DIVISOR,List PolyRing) -> List(Vector(K))
interpolateFormsForFact : (DIVISOR,List PolyRing) -> List(PolyRing)
interpolateForms : (DIVISOR,NNI,PolyRing,List PolyRing) -> List(PolyRing)
++ interpolateForms(D,n,pol,base) compute the basis of the sub-vector
++ space W of V = <base>, such that for all G in W, the
++ divisor (G) >= D. All the elements in base must be homogeneous
++ polynomial of degree n. Typicaly, base is the set of all monomial
++ of degree n: in that case, interpolateForms(D,n,pol,base)
++ returns the basis of the vector space of all forms of degree d that
++ interpolated D. The argument pol must be the same polynomial that
++ defined the curve form which the divisor D is defined.
CODE ==> add
import PolyRing
import PCS
sbSpcOfCurve: (NNI,PolyRing) -> List(List(K))
exponant2monomial: List(NNI) -> PolyRing
crtV: (List(K),List(INT),NNI) -> List(K)
createLinSys: (List Plc, List INT,List PolyRing) -> Matrix(K)
createLinSysWOVectorise: (List Plc, List INT,List PolyRing) -> Matrix(K)
basisOfInterpolateFormsForFact(divis,lm)==
-- permet d'intepoler un diviseur qui n'est pas rationnel.
-- La partie non rationel
-- est dans sptdiv (note: une place de sptdiv est une place qui identidie
-- l'ensemble des places qui lui sont conjuguees.
-- Note: On utilise ici la fonction createLinSysWOVectorise
-- qui ne vectorise pas les elements du corps de base.
lstOfPlc:= supp divis
lstOfv:= [coefficient(pl,divis) for pl in lstOfPlc]
-- ppsol contiendra la base des formes interpolant ke diviseur divis
linSys:Matrix(K)
linSysT:Matrix(K)
ll:List Matrix K
^empty?(lstOfPlc) =>
linSys:=createLinSysWOVectorise(lstOfPlc,lstOfv,lm)
nullSpace linSys
zeroMat:Matrix(K):=zero(1,#lm)$Matrix(K)
nullSpace zeroMat
interpolateForms(divis,d,laCrb,lm)==
-- ppsol contiendra la base des formes interpolant le diviseur divis
-- mieux vaut prendre divOfZero de divis ?
ppsol:= basisOfInterpolateForms(divis,lm)
psol:List(List(K)):=[entries(vec) for vec in ppsol]
mpsol:=psol
sbspc:List(List(K))
if ^(totalDegree(laCrb)$PackPoly > d) then
-- retourne une base des formes de degres d
-- qui sont un multiple de la courbe
sbspc:=sbSpcOfCurve(d,laCrb)
mpsol:=quotVecSpaceBasis(psol,sbspc)$LinesOpPack(K)
empty?(mpsol) => [0]
rowEchmpsol:=rowEchelon(matrix(mpsol)$Matrix(K))
npsol:=listOfLists(rowEchmpsol)
[reduce("+",[a*f for a in ll for f in lm]) for ll in npsol]
interpolateFormsForFact(divis,lm)==
-- ppsol contiendra la base des formes interpolant le diviseur divis
ppsol:= basisOfInterpolateFormsForFact(divis,lm)
psol:List(List(K)):=[entries(vec) for vec in ppsol]
mpsol:=psol
empty?(mpsol) => [0]
rowEchmpsol:=rowEchelon matrix(mpsol)$Matrix(K)
npsol:=listOfLists(rowEchmpsol)
[reduce("+",[a*f for a in ll for f in lm]) for ll in npsol]
createLinSys(lstOfPlc,lstOfv,lm)==
lplsT:=[ [parametrize(f,pl)$ParamPack for f in lm]_
for pl in lstOfPlc]
lpls:=[[filterUpTo(s,v) for s in souslplsT] _
for souslplsT in lplsT_
for v in lstOfv]
linSys:=reduce("vertConcat",_
[finiteSeries2LinSys(souslplsT,v)$LINPACK_
for souslplsT in lpls_
for v in lstOfv])
linSys
createLinSysWOVectorise(lstOfPlc,lstOfv,lm)==
lplsT:=[ [parametrize(f,pl)$ParamPack for f in lm]_
for pl in lstOfPlc]
lpls:=[[filterUpTo(s,v) for s in souslplsT] _
for souslplsT in lplsT_
for v in lstOfv]
linSys:=reduce("vertConcat",_
[finiteSeries2LinSysWOVectorise(souslplsT,v)$LINPACK_
for souslplsT in lpls_
for v in lstOfv])
linSys
basisOfInterpolateForms(divis,lm)==
lstOfPlc:= supp divis
lstOfv:= [coefficient(pl,divis) for pl in lstOfPlc]
-- ppsol contiendra la base des formes interpolant ke diviseur divis
linSys:Matrix(K)
^empty?(lstOfPlc) =>
linSys:=createLinSys(lstOfPlc,lstOfv,lm)
-- ppsol contient la base des formes passant par le diviseur divv
nullSpace(linSys)
zeroMat:Matrix(K):=zero(1,#lm)$Matrix(K)
nullSpace zeroMat
listVar:List(OV):= [index(i::PositiveInteger)$OV for i in 1..#symb]
listMonoPols:List(PolyRing):=[monomial(1,vv,1) for vv in listVar]
crtV(lcoef,lpos,l)==
vvv:List(K):=[0 for i in 1..l]
for c in lcoef for p in lpos repeat
setelt(vvv,p,c)
vvv
sbSpcOfCurve(m,laCrb)==
d:=totalDegree(laCrb)$PackPoly
lm:List(PolyRing):=listAllMono(m)$PackPoly
m<d => [[0$K for i in 1..#lm]]
sd:NNI:=((m pretend INT)-(d pretend INT)) pretend NNI
slm:List(PolyRing):=listAllMono(sd)$PackPoly
allPol:=[laCrb*f for f in slm]
lpos:=[[position(m,lm) for m in primitiveMonomials(f)] for f in allPol]
lcoef:=[coefficients(f) for f in allPol]
clm:=#lm
[crtV(lc,lp,clm) for lc in lcoef for lp in lpos]
inVecSpace?: (List(K),List(List(K))) -> Boolean
inVecSpace?(line,basis)==
mat:Matrix(K):=matrix(basis)
rmat:=rank(mat)
augmat:Matrix(K):=matrix(concat(line,basis))
raugmat:=rank(augmat)
rmat=raugmat
exponant2monomial(lexp)==
reduce("*",[m**e for m in listMonoPols for e in lexp])
|