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
|
# Copyright (c) 1997-2024
# Ewgenij Gawrilow, Michael Joswig, and the polymake team
# Technische Universität Berlin, Germany
# https://polymake.org
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any
# later version: http://www.gnu.org/licenses/gpl.txt.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#-------------------------------------------------------------------------------
# @category Producing a normal toric variety
# Takes one parameter //r// and returns the polyhedral fan corresponding the the
# Hirzebruch surface //H<sub>r</sub>//.
# @param Integer r Parameter
# @return NormalToricVariety
user_function hirzebruch_surface( $ ) {
my $r=shift;
$r >= 0 or die "hirzebruch_surface: index must be non-negative\n";
my $m=new Matrix<Rational>(unit_matrix<Rational>(2) / -unit_matrix<Rational>(2));
$m->elem(2,1)=$r;
my $f=new NormalToricVariety(RAYS=>$m, MAXIMAL_CONES=>[[0,1],[1,2],[2,3],[0,3]],COMPLETE=>1,PROJECTIVE=>1,SIMPLICIAL=>1,DEGENERATE=>0);
$f->description = "Hirzebruch surface of index $r";
return $f;
}
# @category Producing a normal toric variety
# Takes one parameter //d// and returns the fan corresponding to the //d//-dimensional
# projective space.
# @param Int d Dimension
# @return NormalToricVariety
user_function projective_space( $ ) {
my $d=shift;
$d > 0 or die "projective_space: dimension must be positive\n";
my $m=new Matrix<Rational>(unit_matrix<Rational>($d) / -ones_vector<Rational>($d));
my $f=new NormalToricVariety(RAYS=>$m, MAXIMAL_CONES=>all_subsets_of_k(range(0,$d), $d),
COMPLETE=>true, PROJECTIVE=>true, SIMPLICIAL=>true, DEGENERATE=>false);
$f->description = "$d-dimensional projective space";
return $f;
}
# @category Producing a normal toric variety
# Takes a vector //a// and returns the fan corresponding to the weighted
# projective space associated to //a//.
# @param Vector<Int> a the weights
# @return NormalToricVariety
user_function weighted_projective_space( Vector<Int> ) {
my $d = shift;
$d->dim > 2 or die "weighted_projective_space: require at least 3 weights\n";
my $n = $d->dim();
# We use the construction described on p35 of
# Fulton -- Introduction to Toric Varities.
#
# Since we cannot work with lattices finer than ZZ^n, we instead coarsen
# everything accordingly.
my $lcms = new Vector<Integer>(map(lcm($d->[0],$d->[$_]), 1..$n-1));
my $ray_gens = new Matrix<Rational>($n, $n-1);
my $lattice_gens = new Matrix<Integer>($n, $n-1);
$ray_gens->row(0) = -$lcms;
$lattice_gens->row(0) = new Vector<Integer>(map(-div($lcms->[$_], $d->[0])->quot, 0..$n-2));
foreach my $i (0..$n-2){
$lattice_gens->elem($i+1, $i) = div($lcms->[$i], $d->[$i+1])->quot;
$ray_gens->elem($i+1, $i) = $lcms->[$i];
}
$lattice_gens = transpose(hermite_normal_form(transpose($lattice_gens))->hnf);
$lattice_gens = new Matrix<Rational>($lattice_gens->minor(sequence(0,$n-1), All));
my $lginv = inv($lattice_gens);
$ray_gens = $ray_gens * $lginv;
my $maxcones = all_subsets_of_k(sequence(0,$d->dim), $d->dim-1);
my $result = new NormalToricVariety(RAYS=>$ray_gens, MAXIMAL_CONES=>$maxcones, COMPLETE=>true, PROJECTIVE=>true);
$result->description = "weighted projective space for weights $d";
return $result;
}
# Local Variables:
# mode: perl
# cperl-indent-level: 3
# indent-tabs-mode:nil
# End:
|