| 1196 | def Kaehler_cone(self): |
| 1197 | r""" |
| 1198 | Return the closure of the Kähler cone of ``self``. |
| 1199 | |
| 1200 | OUTPUT: |
| 1201 | |
| 1202 | - :class:`cone <sage.geometry.cone.ConvexRationalPolyhedralCone>`. |
| 1203 | |
| 1204 | .. NOTE:: |
| 1205 | |
| 1206 | This cone sits in the rational divisor class group of ``self`` and |
| 1207 | the choice of coordinates agrees with |
| 1208 | :meth:`rational_divisor_class_group`. |
| 1209 | |
| 1210 | EXAMPLES:: |
| 1211 | |
| 1212 | sage: fan = FaceFan(lattice_polytope.octahedron(2)) |
| 1213 | sage: P1xP1 = ToricVariety(fan) |
| 1214 | sage: Kc = P1xP1.Kaehler_cone() |
| 1215 | sage: Kc |
| 1216 | 2-d cone in 2-d lattice |
| 1217 | sage: Kc.rays() |
| 1218 | ((0, 1), (1, 0)) |
| 1219 | sage: Kc.lattice() |
| 1220 | Vector space of dimension 2 over Rational Field |
| 1221 | """ |
| 1222 | if "_Kaehler_cone" not in self.__dict__: |
| 1223 | fan = self.fan() |
| 1224 | GT = fan.gale_transform().columns() |
| 1225 | n = fan.nrays() |
| 1226 | K = None |
| 1227 | for cone in fan: |
| 1228 | sigma = Cone([GT[i] for i in range(n) |
| 1229 | if i not in cone.ambient_ray_indices()], |
| 1230 | lattice = self.rational_divisor_class_group()) |
| 1231 | K = K.intersection(sigma) if K is not None else sigma |
| 1232 | self._Kaehler_cone = K |
| 1233 | return self._Kaehler_cone |
| 1234 | |
| 1235 | def Mori_vectors(self): |
| 1236 | """ |
| 1237 | Returns the rays of the Mori cone. |
| 1238 | |
| 1239 | OUTPUT: |
| 1240 | |
| 1241 | - The rays of the Mori cone, that is, the dual of the Kähler cone. |
| 1242 | |
| 1243 | - The points in the Mori cone are the effective curves in the variety. |
| 1244 | |
| 1245 | - The first ``self.fan().nrays()`` integer entries in each |
| 1246 | Mori vector are the intersection numbers of the curve |
| 1247 | corresponding to the generator of the ray with the divisors |
| 1248 | of the toric variety in the same order as :meth:`divisors`. |
| 1249 | |
| 1250 | - The last entry is associated to the orgin of the N-lattice. |
| 1251 | |
| 1252 | - The Mori vectors are also known as the gauged linear sigma |
| 1253 | model charge vectors. |
| 1254 | |
| 1255 | EXAMPLES:: |
| 1256 | |
| 1257 | sage: P4_11169 = toric_varieties.P4_11169_resolved() |
| 1258 | sage: P4_11169.Mori_vectors() |
| 1259 | [(3, 2, 0, 0, 0, 1, -6), (0, 0, 1, 1, 1, -3, 0)] |
| 1260 | """ |
| 1261 | Mc = [ facet_normal * self._fan.gale_transform() |
| 1262 | for facet_normal in self.Kaehler_cone().facet_normals() ] |
| 1263 | return Mc; |
| 1264 | |
| 1265 | def rational_divisor_class_group(self): |
| 1266 | r""" |
| 1267 | Return the rational divisor class group of ``self``. |
| 1268 | |
| 1269 | Let `X` be a toric variety. |
| 1270 | |
| 1271 | The **Weil divisor class group** `\mathop{Cl}(X)` is a finitely |
| 1272 | generated abelian group and can contain torsion. Its rank equals the |
| 1273 | number of rays in the fan of `X` minus the dimension of `X`. |
| 1274 | |
| 1275 | The **rational divisor class group** is |
| 1276 | `\mathop{Cl}(X) \otimes_\ZZ \QQ` and never includes torsion. If `X` is |
| 1277 | *smooth*, this equals the **Picard group** of `X`, whose elements are |
| 1278 | the isomorphism classes of line bundles on `X`. The group law (which |
| 1279 | we write as addition) is the tensor product of the line bundles. The |
| 1280 | Picard group of a toric variety is always torsion-free. |
| 1281 | |
| 1282 | OUTPUT: |
| 1283 | |
| 1284 | - rational divisor class group, represented as `\ZZ^n`. |
| 1285 | |
| 1286 | .. NOTE:: |
| 1287 | |
| 1288 | * Coordinates correspond to the rows of |
| 1289 | ``self.fan().gale_transform()``. |
| 1290 | |
| 1291 | * :meth:`Kaehler_cone` yields a cone in this group. |
| 1292 | |
| 1293 | EXAMPLES:: |
| 1294 | |
| 1295 | sage: fan = FaceFan(lattice_polytope.octahedron(2)) |
| 1296 | sage: P1xP1 = ToricVariety(fan) |
| 1297 | sage: P1xP1.rational_divisor_class_group() |
| 1298 | Vector space of dimension 2 over Rational Field |
| 1299 | """ |
| 1300 | if "_rational_divisor_class_group" not in self.__dict__: |
| 1301 | self._rational_divisor_class_group = \ |
| 1302 | QQ**(self.fan().nrays() - self.fan().lattice_dim()) |
| 1303 | return self._rational_divisor_class_group |
| 1304 | |