-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmonodromy.m
173 lines (154 loc) · 5.46 KB
/
monodromy.m
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
/*******************************************************************************
Monodromy representation & analytic continuation for Riemann surfaces
Christian Neurohr, June 2019
*******************************************************************************/
import "paths.m": ReversePath;
import "miscellaneous.m": EmbedPolynomial, ModifiedFiber, CompareFldComElt;
procedure AnalyticContinuation( f, Gamma )
/* Assign the permutation induced by f to Gamma */
if not assigned Gamma`Permutation then
CC<I> := Parent(Gamma`StartPt);
Cz<z> := PolynomialRing(CC);
OH := One(CC)/2;
RL := RealField(3);
/* Heuristically estimate number of steps */
st := Ceiling(Gamma`Length) + 1;
if Gamma`Type in ["Arc", "FullCircle"] then
st *:= 4;
end if;
Steps := [ l/st : l in [-st+1..st-1] ];
vprint RS, 1 : "Estimated number of steps to analytically continue path:",#Steps;
vprint RS,1 : "Performing analytic continuation...";
vprint RS,2 : "along:",Gamma;
vprint RS,2 : "of length:",Gamma`Length;
vprint RS,1 : "using steps:",#Steps;
vprint RS,3 : "Starting Interval:",Steps;
/* Analytic continuation */
m := Degree(f,2);
RMV := [ Remove([1..m],j) : j in [1..m] ];
Err := 10^(-Precision(CC)+20);
Err2 := Err^2/4; // Error^2
function DistSquared(Z)
DistsSquared := [];
for k in [1..m] do
for kk in [k+1..m] do
zz := Z[k]-Z[kk];
Append(~DistsSquared,Re(zz)^2+Im(zz)^2);
end for;
end for;
return Min(DistsSquared);
end function;
function ACRecursion(p,x1,x2,Z)
px2 := Evaluate(p,[x2,z]);
px2 *:= 1/LeadingCoefficient(px2);
W := [ Evaluate(px2,Z[j])/ &*[ (Z[j] - Z[k]) : k in RMV[j] ] : j in [1..m] ];
w0 := Max( [ (RL!Re(W[j]))^2+(RL!Im(W[j]))^2 : j in [1..m] ]);
if w0 lt Err2 then
return Z;
end if;
if 16*w0 lt DistSquared(Z) then
repeat
Z := [ Z[j] - W[j] : j in [1..m] ];
W := [ Evaluate(px2,Z[j])/ &*[ (Z[j] - Z[k]) : k in RMV[j] ] : j in [1..m] ];
w0 := Max([ (RL!Re(W[j]))^2+(RL!Im(W[j]))^2 : j in [1..m] ]);
until w0 lt Err2;
return Z;
else
x1x2 := (x1+x2)*OH;
return ACRecursion(p,x1x2,x2,ACRecursion(p,x1,x1x2,Z));
end if;
end function;
/* Run through steps */
xj := Gamma`Evaluate(Steps[1]);
yj := ACRecursion(f,Gamma`StartPt,xj,ModifiedFiber(f,Gamma`StartPt));
for j in [2..#Steps-1] do
nxj := Gamma`Evaluate(Steps[j+1]);
yj := ACRecursion(f,xj,nxj,yj);
xj := nxj;
end for;
yj := ACRecursion(f,xj,Gamma`EndPt,yj);
Ok, Sigma := Sort(yj,CompareFldComElt);
Gamma`Permutation := Inverse(Sigma);
end if;
end procedure;
procedure ChainPermutation(f, Ch)
/* Computes the permutation of the chain Ch */
for p in Ch`Paths do
if not assigned p`Permutation then
AnalyticContinuation(f,p);
end if;
end for;
Ch`Permutation := &*[ p`Permutation : p in Ch`Paths ];
end procedure;
intrinsic MonodromyRepresentation(f::RngMPolElt:BasePoint:="Clever" ) -> SeqEnum[CChain]
{ Computes the local monodromy of the branched covering associated to f(x,y)=0 w.r.t. projecting on the x-plane. }
Kxy := Parent(f);
K := BaseRing(Kxy);
require K eq Rationals() : "Polynomial has to be defined over the rationals.";
K := RationalsAsNumberField();
f := ChangeRing(f,K);
P := InfinitePlaces(K)[1];
return MonodromyRepresentation(f,P:BasePoint:=BasePoint);
end intrinsic;
intrinsic MonodromyRepresentation(f::RngMPolElt,P::PlcNumElt: BasePoint:="Clever" ) -> SeqEnum[CChain]
{ Computes the local monodromy of the branched covering associated to f(x,y)=0 w.r.t. projecting on the x-plane. }
/* Polynomial ring */
Kxy<x,y> := Parent(f);
K := BaseRing(Kxy);
vprint RS,1 : "Defining polynomial:",f;
require Type(K) eq FldNum : "Polynomial has to be defined over a number field.";
require IsInfinite(P) : "PlcNumElt has to be infinite";
/* Discriminant Points */
DP, XYB, BYValues := DiscriminantPoints(f,P);
/* Embed polynomial */
C<I> := Universe(DP);
Cxy<x,y> := PolynomialRing(C,2);
f := EmbedPolynomial(f,P,Cxy);
vprint RS,2 : "Precision:",Precision(C);
/* Symmetric group on N elements (sheets) */
m := Degree(f,2);
Sym := Sym(m);
Id := Id(Sym);
vprint RS,2 : "#Sheets:",m;
/* Compute fundamental group */
vprint RS,2 : "BasePoint:",BasePoint;
BP, ODP, PathPieces, IndexPathLists, SafeRadii := FundamentalGroup(DP : BasePoint := BasePoint);
vprint RS,2 : "BasePoint:",BP;
vprint RS,2 : "Ordered discriminant points:",ChangeUniverse(ODP,ComplexField(10));
/* Construct chains from path pieces */
ClosedChains := [];
vprint RS,1 : "Constructing chains and analytic continuation...";
assert #IndexPathLists eq #ODP;
for l in [1..#IndexPathLists] do
IndexList := IndexPathLists[l];
NextPath := [];
for Index in IndexList do
if Sign(Index) eq 1 then
Append(~NextPath,PathPieces[Index]);
else
Append(~NextPath,ReversePath(PathPieces[-Index]));
end if;
end for;
NextChain := Chain(NextPath:Center:=ODP[l]);
vprint RS,2 : "Continuing chain nr.",l;
ChainPermutation(f,NextChain);
if NextChain`Permutation ne Id then
Append(~ClosedChains,NextChain);
end if;
end for;
vprint RS,1 : "Checking point at infinity...";
/* Compute permutation at infinity by relation */
LocalMonodromy := [ Ch`Permutation : Ch in ClosedChains ];
if #LocalMonodromy gt 0 then
InfPerm := Inverse(&*LocalMonodromy);
vprint RS,2 : "Permutation at infinity:",InfPerm;
/* Chain around infinity */
if InfPerm ne Id then
InfChain := (&*[ Ch : Ch in ClosedChains ])^-1;
InfChain`Center := Infinity();
Append(~ClosedChains,InfChain);
Append(~LocalMonodromy,InfPerm);
end if;
end if;
return ClosedChains;
end intrinsic;