use application 'polytope'; sub ct_invariant { my ($P, $t) = @_; my $v = $P->VERTICES; my $hd = $P->HASSE_DIAGRAM; my $sign = 1; my $c = new Integer(0); for (my $d = $P->DIM; $d > 0; --$d) { foreach (@{$hd->nodes_of_dim($d)}) { my $F = new Polytope(VERTICES=> $v->minor($hd->FACES->[$_],All)); my $vol = $F->LATTICE_VOLUME; $c += $sign*fac($d+$t)/fac($d)*$vol; } $sign = -$sign; } $c += $sign*fac($t)*$P->N_VERTICES; return $c; } sub f_poly_coeff { my ($P) = @_; my $d = $P->DIM; my $v = $P->VERTICES; my $hd = $P->HASSE_DIAGRAM; my $sign = 1; my $f = new Vector($d+1); for (my $k = $d; $k > 0; --$k) { foreach (@{$hd->nodes_of_dim($k)}) { my $q = new Polytope(VERTICES=> $v->minor($hd->FACES->[$_],All)); my $h = (zero_vector($d-$k)) |$q->EHRHART_POLYNOMIAL_COEFF; $f += $sign*fac($k+1)*$h; } $sign = -$sign; } $f += $sign*$P->N_VERTICES *unit_vector($d+1,$d); return $f; } sub r_fold_pyr { my ($P, $r) = @_; for (; $r>0; --$r) { $P = lattice_pyramid($P); } return $P; }