Parallelism().set(nproc=8)
%display latex
Define manifold:
M = Manifold(2, 'R^2', latex_name=r'\mathbb{R}^2')
X.<x,y> = M.chart()
Algebra of mixed forms:
Ω = M.mixed_form_algebra(); Ω
Ω.category()
f = M.scalar_field(name='f')
ω1 = M.diff_form(1, name='omega_1', latex_name=r'\omega_1')
ω2 = M.diff_form(2, name='omega_2', latex_name=r'\omega_2')
η = M.diff_form(1, name='eta', latex_name=r'\eta')
f.set_expr(x^2)
ω1[:] = y, 2*x
ω2[0,1] = 4*x^3
η [:] = x, y
Consider some predefined forms:
f.display()
ω1.display()
ω2.display()
η.display()
Define a mixed form:
A = M.mixed_form(name='A'); print(A)
Mixed differential form A on the 2-dimensional differentiable manifold R^2
It shall consist of the differential forms $f, \omega_1, \omega_2$. The forms are assigned by using index operations:
A[:] = [f,ω1,ω2]; A.display()
A.display_expansion()
Another mixed form:
B = M.mixed_form([2,η,0], name='B'); B.display_expansion()
The multiplication is executed degree wise:
all((A * B)[k] == sum(A[j].wedge(B[k - j])
for j in range(k + 1))
for k in Ω.irange())
Definition
Let $M$ be a smooth manifold and $R$ be the Riemann tensor w.r.t. to some connection $\nabla$. We define the curvature form matrix $\Omega^\nabla$ w.r.t. the frame $(e_1, \ldots, e_n)$ via:
$$R(X,Y) \, e_i = \sum_{j=1}^n \Omega_{ij}(X,Y) \, e_j.$$
Theorem (Gauß-Bonnet)
Let $M$ be an $2$-dimensional closed oriented Riemannian manifold. Then
$$\int_M \frac{\Omega^g_{12}}{2 \pi} = \chi(M),$$where $\Omega^g$ is the from $g$ induced curvature form matrix w.r.t. an orthonormal oriented frame and $\chi(M)$ is the Euler characteristic of $M$.
S2 = Manifold(2, name='S^2', latex_name=r'\mathbb{S}^2',
structure='Riemannian', start_index=1)
U = S2.open_subset('U') ; V = S2.open_subset('V')
S2.declare_union(U,V) # M is the union of U and V
stereoN.<x,y> = U.chart()
stereoS.<xp,yp> = V.chart("xp:x' yp:y'")
S2
S2.atlas()
stereoN_to_stereoS = stereoN.transition_map(stereoS,
(x/(x^2+y^2), y/(x^2+y^2)),
intersection_name='W',
restrictions1= x^2+y^2!=0,
restrictions2= xp^2+yp^2!=0)
stereoS_to_stereoN = stereoN_to_stereoS.inverse()
stereoN_to_stereoS.display()
E = Manifold(3, 'R^3', latex_name=r'\mathbb{R}^3', start_index=1)
cart.<X,Y,Z> = E.chart()
h = E.metric('h')
h[1,1], h[2,2], h[3, 3] = 1, 1, 1
ι = S2.diff_map(E, {(stereoN, cart):
[2*x/(1+x^2+y^2), 2*y/(1+x^2+y^2),
(1-x^2-y^2)/(1+x^2+y^2)],
(stereoS, cart):
[2*xp/(1+xp^2+yp^2), 2*yp/(1+xp^2+yp^2),
(xp^2+yp^2-1)/(1+xp^2+yp^2)]},
name='iota', latex_name=r'\iota')
g = S2.metric()
g.set(ι.pullback(h))
g[1,1].factor(); g[2,2].factor()
nab = g.connection()
g.display()
ΩU = [[nab.curvature_form(i,j,stereoN.frame()) for j in S2.irange()] for i in S2.irange()]
ΩV = [[nab.curvature_form(i,j,stereoS.frame()) for j in S2.irange()] for i in S2.irange()]
cmatrices = {stereoN.frame(): ΩU, stereoS.frame(): ΩV}; cmatrices
TS2 = S2.tangent_bundle(); TS2
e_class = TS2.characteristic_class('Euler'); e_class
e_class_form = e_class.get_form(nab, cmatrices)
e_class_form.display_expansion()
integrate(integrate(e_class_form[2][[1,2]].expr(), x, -infinity, infinity).simplify_full(), y, -infinity, infinity)
Theorem
If $P\colon \mathfrak{gl}(n, \mathbb{C}) \to \mathbb{C}$ is an (under conjugation) invariant formal power series, then:
- $P(\Omega^\nabla)$ can be globally defined and is closed,
- $\left[ P(\Omega^\nabla) \right] \in H^{2*}(M;\mathbb{C})$ is independent of the choice of $\nabla$.
Proof (sketch):
Definition
We call $\left[ P(\Omega^\nabla) \right]$ a characteristic class of $M$.
Name | Designation | Representative | Regime |
---|---|---|---|
Chern class | $c$ | $\det\!\left( 1 + \frac{\Omega^\nabla}{2 \pi \mathrm{i}} \right)$ | complex |
Chern character | $\mathrm{ch}$ | $\mathrm{tr}\!\left( \exp\!\left( \frac{\Omega^\nabla}{2 \pi \mathrm{i}}\right) \right)$ | complex |
Todd class | $\mathrm{Td}$ | $\det\!\left(\frac{\frac{\Omega^\nabla}{2 \pi \mathrm{i}}}{1-\exp\left(\frac{\Omega^\nabla}{2 \pi \mathrm{i}}\right)}\right)$ | complex |
Pontryagin class | $p$ | $\det\!\left( 1 - \frac{\left(\Omega^\nabla\right)^2}{4 \pi^2} \right)$ | real |
$\hat{A}$ class | $\hat{A}$ | $\det\!\left( \sqrt{\frac{\frac{\mathrm{i}}{4 \pi} \Omega^\nabla}{\sinh\left( \frac{\mathrm{i}}{4 \pi} \Omega^\nabla \right)}}\right)$ | real |
Euler class | $e$ | $\mathrm{Pf}\!\left( \frac{\Omega^\nabla}{2 \pi} \right)$ | real |
$\phantom{\rightarrow}$ Define an affine connection $\nabla$
$\rightarrow$ Compute (or manually plug in) curvature form matrix $\Omega^\nabla$ w.r.t. some frame
$\rightarrow$ Compute $f\left(\frac{\Omega^\nabla}{2 \pi i}\right)$ using functional calculus
$\rightarrow$ Apply $\det$, $\mathrm{tr}$ or $\mathrm{Pf}$
$\Rightarrow$ Repeat until $M$ is covered and patch results together
cdim = 2
n = 2*cdim
M = Manifold(n, name='CP^' + str(cdim), latex_name=r'\mathbb{C}\mathrm{P}^' + str(cdim))
M
U = M.open_subset('U')
cart_coords = tuple(['x_' + str(k) for k in range(cdim)] + ['y_' + str(k) for k in range(cdim)])
comp_coords = tuple(['z_' + str(k) for k in range(cdim)] + ['zb_' + str(k) + r':\bar{z}_' + str(k) for k in range(cdim)])
c_cart = U.chart(names=cart_coords); c_cart
c_comp = U.chart(names=comp_coords); c_comp
to_z = tuple(c_cart[i] + I*c_cart[i+cdim] for i in range(cdim))
to_zb = tuple(c_cart[i] - I*c_cart[i+cdim] for i in range(cdim))
cart_to_comp = c_cart.transition_map(c_comp, to_z + to_zb); cart_to_comp.display()
comp_to_cart = cart_to_comp.inverse()
def simp(expr):
return expr.simplify_rational()
M.set_simplify_function(simp)
h = U.metric('h')
fU = c_comp.frame()
abs_values = [c_comp[i]*c_comp[i+cdim] for i in range(cdim)]
total_abs = sum(a for a in abs_values)
for i in range(cdim):
for j in range(i+1):
if i == j:
h[fU,i,j+cdim] = (1+total_abs-abs_values[i])/(1+total_abs)^2
else:
h[fU,i,j+cdim] = (-c_comp[i+cdim]*c_comp[j])/(1+total_abs)^2
h[fU,i+cdim,j] = (-c_comp[i]*c_comp[j+cdim])/(1+total_abs)^2
h.display(c_comp)
nab = h.connection(); nab
A = U.tangent_bundle().characteristic_class('AHat')
%%time
A_form = A.get_form(nab)
CPU times: user 1min 21s, sys: 4min 23s, total: 5min 45s Wall time: 10min 7s
A_form.disp_exp(fU)
A_genus = A_form[2*cdim][tuple(k for k in range(2*cdim))].expr().simplify_full()
for var in c_cart:
A_genus = A_genus.integrate(var, -oo, oo).simplify_full()
A_genus
$\Rightarrow$ $\mathbb{C}P^2$ is not spin!
Fundamental Theorem of Symmetric Polynomials
For each symmetric polynomial $P \colon \mathfrak{gl}(n, \mathbb{C}) \to \mathbb{C}$ there exists a unique polynomial $Q$ such that
$$ P = Q(\sigma_1, \ldots, \sigma_n), $$where $\sigma_i$ denotes the $i$-th elementary symmetric polynomial.
Remark
$\mathrm{Pf} \colon \mathfrak{so}(2n) \to \mathbb{R}$ is invariant under $\mathrm{SO}(2n)$ conjugation.
Workaround (Chern 1963)
Let $(G_{ij})$ be the Gram matrix of a pseudo-Riemannian metric w.r.t. to some not necessarily ON but oriented frame. Then the matrix
$$G \cdot \Omega$$is skew-symmetric.
Idea now: Take $\mathrm{Pf}(G \cdot \Omega)$ and normalize by $\sqrt{|\det(G)|}$.
Complex setup:
Real setup:
Choose metric connection such that $\Omega^\nabla$ can be chosen skew-symmetric:
If $M$ is orientable:
Let $R$ be a ring (typically $R= \mathbb{Z}, \mathbb{Q}, \mathbb{R}, \mathbb{C}$) then the following polynomial rings give the set of characteristic classes:
$\rightarrow$ Implement these structures in Sage to obtain all characteristic classes directly and more easily
Suppose $\nabla,\nabla'$ are two connections. Then: