Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/ext/magma/sage/basic.m
8815 views
1
// -*- magma -*-
2
3
function PreparseElts(R)
4
if Type(R) eq RngInt then
5
return false;
6
end if;
7
return true;
8
end function;
9
10
intrinsic Sage(X::.) -> MonStgElt, BoolElt
11
{Default way to convert a Magma object to Sage if we haven't
12
written anything better.}
13
return Sprintf("%o", X), true;
14
end intrinsic;
15
16
intrinsic Sage(X::SeqEnum) -> MonStgElt, BoolElt
17
{Convert an enumerated sequence to Sage.}
18
Y := [Sage(z) : z in X];
19
return Sprintf("%o", Y), true;
20
end intrinsic;
21
22
intrinsic Sage(X::Tup) -> MonStgElt, BoolElt
23
{Return a Magma Tuple as a Sage Tuple}
24
if #X eq 0 then
25
return "()", true;
26
elif #X eq 1 then
27
return Sprintf("(%o,)",Sage(X[1])),true;
28
end if;
29
r := Sprintf("%o",[Sage(x) : x in X]);
30
return "(" cat Substring(r,2,#r-2) cat ")",true;
31
end intrinsic;
32
33
intrinsic Sage(X::SetEnum) -> MonStgElt, BoolElt
34
{Convert an enumerated set to Sage.}
35
Y := [Sage(z) : z in X];
36
return Sprintf("Set(%o)", Y), true;
37
end intrinsic;
38
39
intrinsic Sage(X::SetIndx) -> MonStgElt, BoolElt
40
{Convert an indexed set to Sage.
41
WARNING: Sage does not have an analogue of indexed sets (yet!),
42
so we just return a Python list.}
43
Y := [Sage(z) : z in X];
44
return Sprintf("%o", Y), true;
45
end intrinsic;
46
47
intrinsic Sage(X::SetMulti) -> MonStgElt, BoolElt
48
{Convert a multiset to Sage.
49
WARNING: Sage does not have an analogue of multisets yet, so we return a Python list.}
50
Y := [Sage(z) : z in X];
51
return Sprintf("%o", Y), true;
52
end intrinsic;
53
54
intrinsic Sage(X::RngInt) -> MonStgElt, BoolElt
55
{Conver the ring of integers to Sage.}
56
return "ZZ", false;
57
end intrinsic;
58
59
intrinsic Sage(X::FldRat) -> MonStgElt, BoolElt
60
{}
61
return "QQ", false;
62
end intrinsic;
63
64
intrinsic Sage(X::RngIntElt) -> MonStgElt, BoolElt
65
{}
66
return Sprintf("Integer('%h')", X), false;
67
end intrinsic;
68
69
/* Matrices */
70
71
function convert_matrix(X, preparse_entries)
72
if preparse_entries then
73
return Sprintf("matrix(%o, %o, %o, %o)", Sage(BaseRing(X)),
74
Nrows(X), Ncols(X), [Sage(y) : y in Eltseq(X)]);
75
else
76
return Sprintf("matrix(%o, %o, %o, %o)", Sage(BaseRing(X)),
77
Nrows(X), Ncols(X), Eltseq(X));
78
end if;
79
end function;
80
81
intrinsic Sage(X::AlgMatElt) -> MonStgElt, BoolElt
82
{}
83
pp := PreparseElts(BaseRing(X));
84
return convert_matrix(X, pp), pp;
85
end intrinsic;
86
87
intrinsic Sage(X::ModMatRngElt) -> MonStgElt, BoolElt
88
{}
89
pp := PreparseElts(BaseRing(X));
90
return convert_matrix(X, pp), pp;
91
end intrinsic;
92
93
94
intrinsic SageCreateWithNames(X::., names::.) -> .
95
{Assign the given names to the object X, then return X.}
96
AssignNames(~X, names);
97
return X;
98
end intrinsic;
99
100
/* Finite fields */
101
102
intrinsic Sage(X::FldFin) -> MonStgElt, BoolElt
103
{}
104
if IsPrimeField(X) then
105
return Sprintf("GF(%o)", Characteristic(X)), false;
106
else
107
return Sprintf("GF(%o, '%o'.replace('$.', 'x').replace('.', ''), modulus=%o)", #X, X.1, Sage(DefiningPolynomial(X))), false;
108
end if;
109
end intrinsic;
110
111
intrinsic Sage(X::FldFinElt) -> MonStgElt, BoolElt
112
{}
113
P := Parent(X);
114
if IsPrimeField(P) then
115
return Sprintf("%o(%o)", Sage(P), Integers()!X), false;
116
else
117
return Sprintf("%o(%o)", Sage(Parent(X)), Sage(Polynomial(Eltseq(X)))), false;
118
end if;
119
end intrinsic;
120
121
/* Approximate fields */
122
123
intrinsic Sage(X::FldRe) -> MonStgElt, BoolElt
124
{}
125
return Sprintf("RealField(%o)", Precision(X : Bits := true)), false;
126
end intrinsic;
127
128
intrinsic Sage(X::FldCom) -> MonStgElt, BoolElt
129
{}
130
return Sprintf("ComplexField(%o)", Precision(X : Bits := true)), false;
131
end intrinsic;
132
133
intrinsic Sage(X::FldReElt) -> MonStgElt, BoolElt
134
{}
135
return Sprintf("%o(%o)", Sage(Parent(X)), X), true;
136
end intrinsic;
137
138
intrinsic Sage(X::FldComElt) -> MonStgElt, BoolElt
139
{}
140
return Sprintf("%o([%o, %o])", Sage(Parent(X)), Sage(Real(X)), Sage(Imaginary(X))), true;
141
end intrinsic;
142
143
/* Polynomials */
144
145
intrinsic SageNamesHelper(X::.) -> MonStgElt
146
{}
147
/* XXX */
148
i := NumberOfNames(X);
149
if i ge 2 then
150
return (&* [ Sprintf("%o, ", X.j) : j in [ 1..i-1 ] ]) * Sprintf("%o", X.i);
151
else
152
return Sprintf("%o", X.i);
153
end if;
154
end intrinsic;
155
156
intrinsic Sage(X::RngUPol) -> MonStgElt, BoolElt
157
{}
158
return Sprintf("%o['%o'.replace('$.', 'x').replace('.', '')]", Sage(BaseRing(X)), SageNamesHelper(X)), false;
159
end intrinsic;
160
161
intrinsic Sage(X::RngUPolElt) -> MonStgElt, BoolElt
162
{}
163
return Sprintf("%o(%o)", Sage(Parent(X)), Sage(Coefficients(X))), false;
164
end intrinsic;
165
166
intrinsic Sage(X::RngMPol) -> MonStgElt, BoolElt
167
{}
168
return Sprintf("%o['%o'.replace('$.', 'x').replace('.', '')]", Sage(BaseRing(X)), SageNamesHelper(X)), false;
169
end intrinsic;
170
171
intrinsic Sage(X::RngMPolElt) -> MonStgElt, BoolElt
172
{}
173
Y := Sage([ < <e : e in Exponents(t)>, Coefficients(t)[1]> : t in Terms(X)]);
174
R := Sage(Parent(X));
175
return Sprintf("%o(dict(%o))",R,Y),true;
176
end intrinsic;
177
178
/* Number fields */
179
180
intrinsic Sage(K::FldNum) -> MonStgElt, BoolElt
181
{}
182
names := [Sprintf("'%o'.replace('$.', 'a').replace('.', '')", a) : a in GeneratorsSequence(K)];
183
polynomials := DefiningPolynomial(K);
184
return Sprintf("NumberField(%o, %o)", Sage(polynomials), names), false;
185
end intrinsic;
186
187
intrinsic Sage(A::FldNumElt) -> MonStgElt, BoolElt
188
{Converts a number field element to Sage.
189
Only number fields generated by a single element over
190
the base field are supported.
191
It seems that FldNum is always represented by
192
a power basis. Just in case, this function
193
checks whether this is true.}
194
K := Parent(A);
195
gens := GeneratorsSequence(K);
196
if #gens ne 1 then return Sprint(A), true; end if;
197
gen := gens[1];
198
deg := Degree(K);
199
bas := Basis(K);
200
for a in [0..deg-1] do
201
if gen^a ne bas[a+1] then
202
return Sprint(A), true;
203
end if; end for;
204
seq := Eltseq(A);
205
return Sprintf("%o(%o)", Sage(K), Sage(seq)), true;
206
end intrinsic;
207
208
/* Elliptic curves */
209
210
intrinsic Sage(X::CrvEll) -> MonStgElt, BoolElt
211
{}
212
as := aInvariants(X);
213
return Sprintf("EllipticCurve(%o)", Sage(as)), true;
214
end intrinsic;
215
216
/* Hyperelliptic curves */
217
218
intrinsic Sage(X::CrvHyp) -> MonStgElt, BoolElt
219
{}
220
f, g := HyperellipticPolynomials(X);
221
return Sprintf("HyperellipticCurve(%o, %o)", Sage(f), Sage(g)), true;
222
end intrinsic;
223
224
/* Modules and vector spaces */
225
226
intrinsic Sage(X::ModTupRng) -> MonStgElt, BoolElt
227
{}
228
if IsIdentity(InnerProductMatrix(X)) then
229
return Sprintf("FreeModule(%o, %o)", Sage(BaseRing(X)), Sage(Rank(X))), true;
230
else
231
return Sprintf("FreeModule(%o, %o, inner_product_matrix=%o)", Sage(BaseRing(X)), Sage(Rank(X)), Sage(InnerProductMatrix(X))), true;
232
end if;
233
end intrinsic;
234
235
intrinsic Sage(X::ModTupRngElt) -> MonStgElt, BoolElt
236
{}
237
return Sprintf("%o(%o)", Sage(Parent(X)), Sage(ElementToSequence(X))), true;
238
end intrinsic;
239
240