diff --git a/out/presentation.pdf b/out/presentation.pdf index bc60a9f..8cc86e7 100644 Binary files a/out/presentation.pdf and b/out/presentation.pdf differ diff --git a/out/tesi-triennale.pdf b/out/tesi-triennale.pdf index 1711306..e6f0a55 100644 Binary files a/out/tesi-triennale.pdf and b/out/tesi-triennale.pdf differ diff --git a/src/main.typ b/src/main.typ index 81a070b..8538ec2 100644 --- a/src/main.typ +++ b/src/main.typ @@ -298,7 +298,7 @@ Questo sarà importante più avanti quando vedremo invarianti come il polinomio #definition[ Sia $K$ un diagramma di un nodo, $cal(U)$ la sua ombra planare#footnote[Ovvero per $K subset bb(R)^3$ poniamo $cal(U) colon.eq pi(K) subset bb(R)^2$] e $p in cal(U)$ un punto di partenza direzionato in $cal(U)$. - Il suo *nodo banale standard* (o in _forma discendente_) associato a $K$ detto $hat(K)(cal(U), p)$ è definito come segue: si prende il punto di partenza direzionato e si inizia a percorrere l'ombra planare in quella direzione e si rende ogni incrocio un sopra-incrocio quando ci si passa sopra per la prima volta. + Il *nodo banale standard* (o in _forma discendente_) associato a $K$ detto $hat(K)(cal(U), p)$ è definito come segue: si prende il punto di partenza direzionato e si inizia a percorrere l'ombra planare in quella direzione e si rende ogni incrocio un sopra-incrocio quando ci si passa sopra per la prima volta. Questa definizione si estende anche a diagrammi di link prendendo un insieme di punti base ordinati come mostrato in figura. In particolare questo induce un ordinamento dall'alto verso il basso delle componenti. #h(1fr) diff --git a/src/presentation.typ b/src/presentation.typ index 314b3a3..d6f506e 100644 --- a/src/presentation.typ +++ b/src/presentation.typ @@ -16,31 +16,32 @@ #show: dm-unipi-theme.with(aspect-ratio: "16-9", config-info( title: [Il Polinomio di Kauffman: un invariante di isotopia regolare], subtitle: [Tesi di Laurea Triennale], - author: { - set align(center) - - grid( - columns: 2, - row-gutter: 0.75em, - column-gutter: 0.5em, - align: (right, left), - [*Candidato:*], [Antonio De Lucreziis], - [*Relatore:*], [Paolo Lisca], - ) - // grid(align: left, [*Candidato:* Antonio De Lucreziis \ *Relatore:* Paolo Lisca]) - }, + // author: { + // set align(center) + + // grid( + // columns: 2, + // row-gutter: 0.75em, + // column-gutter: 0.5em, + // align: (right, left), + // [*Candidato:*], [Antonio De Lucreziis], + // [*Relatore:*], [Paolo Lisca], + // ) + // // grid(align: left, [*Candidato:* Antonio De Lucreziis \ *Relatore:* Paolo Lisca]) + // }, + author: [Antonio De Lucreziis], date: [18 Luglio 2025], institution: [Dipartimento di Matematica \ Università di Pisa], logo: image("assets/dm-unipi-logo-bianco.png"), )) // #set text(font: "Source Sans Pro", weight: 500, size: 20pt) -#set text(font: "Open Sans", weight: 400, size: 17pt) -#show math.equation: set text(size: 20pt) +#set text(font: "Open Sans", weight: 400, size: 16pt) +#show math.equation: set text(size: 19pt) #show strong: it => text(weight: 600, it.body) -#set par(leading: 1em) +#set par(leading: 1em, spacing: 1em) #set list(indent: 0.25em, body-indent: 0.75em, spacing: 1em) -#set enum(indent: 0.25em, body-indent: 0.75em, spacing: 1em) +#set enum(indent: 0.25em, body-indent: 0.75em, spacing: 1em, numbering: "i.1.a)") #show figure.caption: caption => block(inset: (x: 2em), { set align(left) @@ -48,22 +49,6 @@ caption.body }) -#show figure.where(kind: "definition"): it => { - set align(start) - - block({ - strong({ - it.supplement - [.] - }) - [ ] - it.body - }) -} - -#let definition(body) = { - figure(kind: "definition", supplement: [Definizione], body) -} #title-slide() @@ -71,85 +56,44 @@ == Introduzione -#slide[ +*Def.* $X, Y$ spazi topologici, $f : X arrow Y$ continua è *embedding* se $X approx f(X) subset Y$. - #definition[ - $X, Y$ spazi topologici, $f : X arrow Y$ continua è *embedding* se $X approx f(X) subset Y$ - ] +*Def.* $f : X arrow Y$ embedding, $p in X$ allora $f$ è *localmente piatto* in $p$ se esiste $U subset bb(R)^3$ intorno di $p$ tale che $U approx DD^2 times [0,1]$ e $U inter f(X) <-> {0} times [0, 1]$. - #definition[ - $f : X arrow Y$ embedding, $p in X$ allora $f$ è *localmente piatto* in $p$ se esiste $U subset bb(R)^3$ intorno di $p$ tale che: - ] +\ - #{ - set align(center) +*Def.* $K subset bb(R)^3$ è un *nodo (tame)* se esiste $f : bb(S)^1 arrow.hook bb(R)^3$ embedding loc. piatto con $K = f(bb(S)^1)$. - grid( - columns: (auto, auto), - gutter: 3em, - align: center + horizon, - grid( - columns: 3, - gutter: 1em, - align: center, - $U$, $approx$, $bb(D)^2 times [0, 1]$, - $U inter f(X)$, $<->$, ${ 0 } times [0, 1]$, - ), - align(center, image("assets/locally-flat-v2.png", height: 6cm)), - ) - } - -] - -== Nodi e Diagrammi - -#slide[ - #definition[ - $K subset bb(R)^3$ è un *nodo tame* se esiste $f : bb(S)^1 arrow.hook bb(R)^3$ embedding localmente piatto con $K = f(bb(S)^1)$ - ] - - #pause - - #figure(image("assets/wild_knot.svg", height: 5cm), caption: [Esempio di nodo non tame]) -] +*Def.* Possiamo generalizzare i nodi $bb(S)^1 arrow bb(R)^3$ a *link* sostituendo con $bb(S)^1 union.sq dots.c union.sq bb(S)^1 arrow bb(R)^3$. == Isotopia Ambiente -#slide[ - #definition[ - $K_0, K_1 subset bb(R)^3$ sono *equivalenti* se esiste un'*isotopia ambiente* che porta uno nell'altro, ovvero esiste $H : bb(R)^3 times [0, 1] arrow bb(R)^3$ continua, tale che: +*Def.* $K_0, K_1 subset bb(R)^3$ sono *equivalenti* se esiste un'*isotopia ambiente* che porta uno nell'altro, ovvero esiste $H : bb(R)^3 times [0, 1] arrow bb(R)^3$ continua, tale che: - - $forall t in [0, 1], H(dot, t)$ è un omeomorfismo +- $forall t in [0, 1], H(dot, t)$ è un omeomorfismo - e ponendo $H_t (x) colon.eq H(x, t)$ si ha +e posta $H_t (x) colon.eq H(x, t)$ si ha: - - $H_0 = id_(bb(R)^3)$ +- $H_0 = id_(bb(R)^3)$ - - $H_1(K_0) = K_1$ - ] -] +- $H_1(K_0) = K_1$ -#slide[ - *Def.* Un *nodo poligonale* è un nodo equivalente ad un'unione finita di segmenti lineari. +// == Introduzione - *Fatto (Crowell).* Dato un nodo $K subset bb(R)^3$, $K$ è *tame* $<=>$ $K$ è *poligonale*. +// *Def.* Un *nodo poligonale* è un nodo equivalente ad un'unione finita di segmenti lineari. - \ - - *Def.* Possiamo generalizzare i nodi $bb(S)^1 arrow bb(R)^3$ a *link* come $bb(S)^1 union.sq dots.c union.sq bb(S)^1 arrow bb(R)^3$. -] +// *Fatto (Crowell).* Dato un nodo $K subset bb(R)^3$, $K$ è *nodo (tame)* $<=>$ $K$ è *poligonale*. == Proiezioni e Diagrammi -// Data $v in bb(S)^2 subset bb(R)^3$ direzione, $pi_v : bb(R)^3 arrow v^perp$ proiezione sul piano ortogonale a $v$ come nella seguente figura: *Fatto.* Sia $L subset bb(R)^3$ link poligonale, allora esiste un aperto denso $U subset bb(S)^2$ tale che $forall v in U$ e detta $pi_v : bb(R)^3 arrow v^perp$ la proiezione sul piano $v^perp$ come in figura, abbiamo che: #grid( columns: (auto, 1fr), + gutter: 1em, figure(image("assets/projection-plane.png", height: 6cm)), [ - 1. $L$ non ha segmenti paralleli a $v$. 2. Se $x in pi_v (L)$ è tale che $abs(pi^(-1)(x)) > 1$, ovvero è un punto *singolare*, allora: @@ -166,237 +110,582 @@ == Proiezioni e Diagrammi -// Sia $L subset bb(R)^3$ un link, $v in bb(S)^2$ una direzione e $pi_v : bb(R)^3 arrow v^perp$ la proiezione su $v^perp$: +*Def.* Un *diagramma* $D subset bb(R)^2$ di un link $L subset bb(R)^3$ è l'immagine di $L$ attraverso una proiezione regolare decorata con l'informazione sopra/sotto ad ogni incrocio. -// Quindi dato $L subset bb(R)^3$ link poligonale, esiste una proiezione regolare $pi(L) subset bb(R)^2$ con un numero finito di punti singolari, ciascuno dei quali è un punto doppio e di intersezione trasversa. Ognuno di questi punti doppi viene detto *incrocio*. +#pad( + top: 0.5em, + grid( + columns: (1fr, auto), + gutter: 1em, + align: top, + [ + *Def.* Le mosse I, II, III in figura sono dette *mosse di Reidemeister*. + + *Teorema (di Reidemeister).* Due diagrammi di link _equivalenti_ sono collegati da una _successione finita mosse di Reidemeister_ e isotopie planari. + ], + figure(image("assets/reidemeister-moves.jpg", height: 6.75cm)), + ), +) -*Def.* Un *diagramma* $D subset bb(R)^2$ di un link $L subset bb(R)^3$ è l'immagine di $L$ attraverso una proiezione regolare decorata con l'informazione sopra/sotto ad ogni incrocio. +== Isotopia Regolare -#grid( - columns: (1fr, auto), - gutter: 1em, - [ - *Def.* Le mosse I, II, III sono dette *mosse di Reidemeister*. - *Teorema (di Reidemeister).* Due diagrammi di link equivalenti sono collegati da una successione finita di isotopie planari e mosse di Reidemeister. - ], - pad(top: 1em, figure(image("assets/reidemeister-moves.jpg", height: 6.75cm))), -) +*Def.* $D_1, D_2$ diagrammi di link si dicono equivalenti a meno di *isotopia regolare* se e solo se sono equivalenti a meno di isotopie planari e mosse II e III di Reidemeister. + +#figure(image("assets/ambient-regular-isotopy-difference.jpg", height: 7cm)) + + +== Comportamento Isotopia Regolare + +*Osservazione.* Tutte le mosse di tipo I, quelle che introducono quelli che chiameremo *riccioli*, possono passare sopra o sotto altri fili senza problemi applicando le seguenti mosse + +#figure(image("assets/move-1-factorization.png", width: 75%)) + +== Comportamento Isotopia Regolare + +*Osservazione.* Quando abbiamo una coppia di riccioli con segni opposti abbiamo la seguente proprietà di cancellazione detto _trucco di Whitney_. + +#figure(image("assets/whitney-trick.png", width: 100%)) + +== Comportamento Isotopia Regolare + + +*Lemma.* Sia $K$ un diagramma di un nodo in _forma discendente_, allora o è composto interamente da riccioli o ammette una sequenza di mosse di tipo II e III che portano al diagramma di un nodo formato solo da riccioli. + +Ovvero un nodo in forma discendente è _equivalente_ ad uno composto solo da riccioli. + +\ + +#pause + +_Dim._ Consideriamo una successione di mosse $K = D_0 stretch(arrow) dots.c stretch(arrow) D_n = #skein.unit-medium$. + +- Mosse di tipo I che rimuovono un ricciolo + +- Mosse di tipo I che aggiungono un ricciolo + +- Mosse di tipo II, III + +== Comportamento Isotopia Regolare + + +#figure(image("assets/modified-curl-add-before.png", width: 7% * 6.5)) + +#figure(image("assets/modified-curl-add-after.png", width: 7% * 13)) + +#align(center)[Mosse di tipo I che aggiungono un ricciolo] + +== Comportamento Isotopia Regolare + +#v(2em) + +#figure(image("assets/modified-r2-before.png", width: 8% * 6.5)) + +#figure(image("assets/modified-r2-after.png", width: 8% * 8.5)) + +#align(center)[Mosse di tipo II, III] + +== Writhe + + +*Def.* Definiamo *il segno* di un incrocio di un diagramma come segue: + +$ + epsilon(#skein-generic(size-factor: 1.5, direction: (+1, +1))) = +1 + #h(2em) + epsilon(#skein-generic(size-factor: 1.5, direction: (+1, -1))) = -1 +$ + +*Def.* $K$ link orientato, definiamo il *writhe* $display(w(K) colon.eq sum_(c "incrocio") epsilon(c))$. + +#pause + +\ + +*Prop.* Se $K$ è il diagramma di un nodo, il _writhe_ non dipende dall'orientazione. + +#pause + +*Prop.* Il writhe è un invariante di isotopia regolare, ovvero $K_1 tilde K_2 => w(K_1) = w(K_2)$. = Polinomio di Kauffman -== Il Writhe: Un Primo Invariante +== Assiomi -#slide[ - *Definizione del segno di un incrocio:* - $epsilon(skein.over) = +1 quad quad epsilon(skein.under) = -1$ +*Def.* Sia $K$ un diagramma di un link non orientato, $L_K in bb(Z)[a, a^(-1), z, z^(-1)]$ e verifica: - #pause +1. $K tilde K' => L_K = L_K'$. - *Il writhe:* $w(K) := sum_("incroci " c) epsilon(c)$ +2. Valgono le seguenti relazioni: - #pause + #set par(spacing: 1.25em) + #set enum(numbering: "a)", spacing: 1.75em) - *Proprietà:* - - Invariante per mosse II e III ✓ - - NON invariante per mossa I ✗ + 1. $L[#skein.over-large] + L[#skein.under-large] = z (L[#skein.h-large] + L[#skein.v-large])$ - #pause + 2. $L[#skein.unit-large] = 1$ - *Formula di correzione:* Se $L_K$ è invariante per isotopia regolare con - $L(#text("sopra-ricciolo")) = a L(#text("filo"))$, $L(#text("sotto-ricciolo")) = a^(-1) L(#text("filo"))$ + 3. $L[#skein.over-twist-large] = a L[#skein.strand-large]$ - Allora: $F_K := a^(-w(K)) L_K$ è invariante per isotopia ambiente! -] + 4. $L[#skein.under-twist-large] = a^(-1) L[#skein.strand-large]$ -== Il Polinomio di Kauffman: Definizione +#pause -#slide[ - Il protagonista: $L_K (a,z) in bb(Z)[a, a^(-1), z, z^(-1)]$ +\ - *Assiomi:* - 1. Se $K$, $K'$ sono equivalenti a meno di isotopia regolare, allora $L_K = L_K'$ +*Osservazione.* A questo punto non sappiamo se $L_K$ sia ben definito. - #pause +== Calcoli impliciti - 2. Relazioni skein: - - $L(#text("sopra")) + L(#text("sotto")) = z(L(#text("h-splice")) + L(#text("v-splice")))$ - - $L(#text("nodo banale")) = 1$ - - $L(#text("sopra-ricciolo")) = a L(#text("filo"))$, $L(#text("sotto-ricciolo")) = a^(-1) L(#text("filo"))$ +#let knot-picture(src, ..rest) = $thin #image("assets/derived/atlas-" + src, ..rest) thin$ - #pause +#{ + set align(center) - *Domanda:* Gli assiomi definiscono univocamente $L_K$? -] + grid( + columns: 1, + row-gutter: 1.5em, + column-gutter: 3em, + align: center + top, + [*Link $L[#skein.unit-large #skein.unit-large]$*], + $ + & L[ #knot-picture("infinity-0.png", height: 2.25em) ] + + + L[ #knot-picture("infinity-1.png", height: 2.25em) ] = + z ( + L[ #knot-picture("infinity-2.png", height: 2.25em) ] + + + L[ #knot-picture("infinity-3.png", height: 2.25em) ] + ) \ + #pause & => + a L[ #skein.unit-large ] + + + a^(-1) L[ #skein.unit-large ] = + z ( + delta + + + L [ #skein.unit-large ] + ) \ + & => a + a^(-1) = z ( delta + 1 ) \ + & => delta = (a + 1 slash a) / z - 1 + $, + ) +} -== Esempio: Link di Hopf +== Calcoli impliciti + +#{ + set align(center) + show math.equation: set text(size: 15pt) + + grid( + columns: 2, + row-gutter: 1.5em, + column-gutter: 3em, + align: center + top, + + [*Link di Hopf*], [*Nodo trifoglio*], + + $ + & L[ #knot-picture("hopf-0.png", height: 1.75em) ] + + + L[ #knot-picture("hopf-1.png", height: 1.75em) ] = + z ( + L[ #knot-picture("hopf-2.png", height: 1.75em) ] + + + L[ #knot-picture("hopf-3.png", height: 1.75em) ] + ) \ + & => + L[ #knot-picture("hopf-0.png", height: 1.75em) ] + + + delta = + z ( + a + + + a^(-1) + ) \ + & => + L[ #knot-picture("hopf-0.png", height: 1.75em) ] = + - (a + a^(-1)) z^(-1) + 1 + (a + a^(-1)) z + $, + $ + & L[ #knot-picture("trefoil-0.png", height: 2em) ] + + + L[ #knot-picture("trefoil-1.png", height: 2em) ] = + z ( + L[ #knot-picture("trefoil-2.png", height: 2em) ] + + + L[ #knot-picture("trefoil-3.png", height: 2em) ] + ) \ + & => + L[ #knot-picture("trefoil-0.png", height: 2em) ] + + + a = + z ( + L[ #knot-picture("hopf-0.png", height: 1.75em) ] + + + a^(-2) + ) \ + & => + L[ #knot-picture("trefoil-0.png", height: 2em) ] = + -(2a + a^(-1)) + (1 + a^(-2)) z + (a + a^(-1)) z^2 + $, + ) +} -#slide[ - Applichiamo la relazione skein: +== Invariante di isotopia ambiente associato - $L[#text("Hopf")] + L[#text("versione scambiata")] = z(L[#text("due cerchi")] + L[#text("due fili")])$ +*Def.* Definiamo $F_K in bb(Z)[a, a^(-1), z, z^(-1)]$ per diagrammi di link orientati $K$ come +$ + F_K colon.eq a^(-w(K)) L_K +$ - #pause +dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione. - Sapendo che: - - $L[#text("due cerchi")] = delta = (a + a^(-1))/z - 1$ - - $L[#text("due fili")] = a + a^(-1)$ +*Prop.* Il polinomio $F_K (a, z)$ è un invariante di isotopia ambiente. - #pause +== Considerazioni preliminari - Otteniamo: - $L[#text("Hopf")] = -(a + a^(-1))z^(-1) + 1 + (a + a^(-1))z$ +*Def.* Sia $K$ un diagramma di un nodo, $p in K$ un punto di partenza direzionato e sia $lambda = (lambda_n, dots, lambda_0)$ una sequenza di etichette di incroci di $K$: - #pause +#{ + set align(center) - Questi calcoli suggeriscono che $L_K$ esiste, ma serve una dimostrazione rigorosa! -] + v(1em) -== La Sfida della Buona Definizione + grid( + columns: 4, + column-gutter: 2em, + row-gutter: 1em, + align: center, + { + skein.over-large + place(center + top, dy: -0.25em, { + show math.equation: set text(size: 15pt) + $i$ + }) + }, + { + skein.under-large + place(center + top, dy: -0.25em, { + show math.equation: set text(size: 15pt) + $i$ + }) + }, + skein.h-large, + skein.v-large, -#slide[ - *Problema centrale:* Gli assiomi definiscono $L_K$ in modo unico? + $K$, $S_i K$, $E_i K$, $e_i K$, + ) - #pause + v(1em) - *Sfide:* - 1. Gli assiomi sono *impliciti* (relazioni, non formule) - 2. Come garantire che esista una soluzione? - 3. Come garantire l'unicità? - 4. Come verificare l'indipendenza dalle scelte computazionali? + $ + A_i^lambda colon.eq E_lambda_i S_lambda_(i-1) dots.c space S_lambda_0 + #h(2em) + B_i^lambda colon.eq e_lambda_i S_lambda_(i-1) dots.c space S_lambda_0 + $ - #pause + v(1em) - *Scelte che potrebbero influenzare il risultato:* - - Scelta del punto base $p$ su ogni componente - - Direzione del punto base (orario vs antiorario) - - Ordine delle operazioni nelle sequenze + $ + sum_K (lambda) colon.eq sum_(i=0)^n (-1)^i (L[A_i^lambda K] + L[B_i^lambda K]) + $ +} - #pause +== Considerazioni preliminari - #align(center)[ - #box(fill: red.lighten(80%), inset: 1em, radius: 5pt)[ - *Senza questa dimostrazione, $L_K$ non sarebbe ben definito!* - ] - ] -] +#let dotss = $space dots.c space$ -== Ingredienti per la Costruzione +#slide( + repeat: 5, + self => [ -#slide[ - *Concetti chiave necessari:* - 1. *Nodo banale standard*: $hat(K)(cal(U), p)$ - - Percorrere l'ombra planare da un punto base $p$ - - Primo passaggio su ogni incrocio = sopra-incrocio + #v(2em) - #pause + #{ + set align(center) - 2. *Operazioni sui diagrammi*: - - $S_i K$: scambia l'incrocio $i$ - - $E_i K$, $e_i K$: splice orizzontale e verticale + [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:] + } - #pause + #v(1em) - 3. *Sequenze di scambi*: $lambda = (lambda_n, dots, lambda_0)$ - - Trasformano $K$ in $hat(K)(lambda)$ - #pause + #let (only, uncover) = utils.methods(self) - *Proprietà fondamentale:* $L[hat(K)] = a^(w(hat(K)))$ -] + #only( + "1-3", + $ + & L[K] + L[S_0 K] = z( L[E_0 K] + L[e_0 K] ) \ + & pause L[S_0 K] + L[S_1 S_0 K] = z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + & pause L[S_(n-1) dotss S_0 K] + L [hat(K)] = z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) + $, + ) + + #only( + 4, + $ + & L[K] + L[S_0 K] = z( L[E_0 K] + L[e_0 K] ) \ + -( & L[S_0 K] + L[S_1 S_0 K]) = -z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + (-1)^n ( & L[S_(n-1) dotss S_0 K] + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) + $, + ) + + #only( + 5, + $ + & L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \ + -(& cancel(L[S_0 K]) + cancel(L[S_1 S_0 K])) = -z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + (-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) + $, + ) + + #{ + set text(fill: white) + + v(1.5em) + + h(4.4em) + $display( + => L[K] + (-1)^n L[hat(K)] = + z sum_(i=0)^n (-1)^i ( + L[E_i S_(i-1) dotss S_0 K] + L[e_i S_(i-1) dotss S_0 K] + ) + )$ -== La Formula Ricorsiva + + v(1.5em) + $ + Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda) + $ + } + + ], +) #slide[ - *Idea*: Esprimere $L_K$ in termini di diagrammi "più semplici" - Applicando le relazioni skein incrementalmente: + + #v(2em) + + #{ + set align(center) + + [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:] + } + + #v(1em) + + + $ - L[K] + L[S_0 K] & = z(L[E_0 K] + L[e_0 K]) \ - L[S_0 K] + L[S_1 S_0 K] & = z(L[E_1 S_0 K] + L[e_1 S_0 K]) \ - & dots.v \ - L[S_(n-1) dots S_0 K] + L[hat(K)] & = z(L[E_n S_(n-1) dots S_0 K] + L[e_n S_(n-1) dots S_0 K]) + & L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \ + -(& cancel(L[S_0 K]) + cancel(L[S_1 S_0 K])) = -z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + (-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) $ - #pause + #{ + v(1.5em) + + h(4.4em) + $display( + => L[K] + (-1)^n L[hat(K)] = + z sum_(i=0)^n (-1)^i ( + L[E_i S_(i-1) dotss S_0 K] + L[e_i S_(i-1) dotss S_0 K] + ) + )$ + } - Sommando e sottraendo membro a membro, i termini intermedi si cancellano! + #{ + set text(fill: white) - #pause - *Formula finale:* - $L_K = (-1)^(n+1) L_(hat(K)) + z sum_(i=0)^n (-1)^i (L[A_i^lambda K] + L[B_i^lambda K])$ + v(1.5em) + $ + Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda) + $ + } ] -== Definizione Induttiva Completa - #slide[ - *Caso 1:* $K = hat(K)$ (nodo banale standard) - $L_K = a^(w(K))$ - #pause - *Caso 2:* $K = K_1 union K_2$ con $K_1$ sovrastante $K_2$ - $L_K = delta L_(K_1) L_(K_2)$ dove $delta = (a + a^(-1))/z - 1$ + #v(2em) - #pause + #{ + set align(center) + + [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:] + } - *Caso 3:* Uso della formula ricorsiva: - $L_K = 1/2 [sum_(q = p, overline(p)) ((-1)^(abs(lambda(q))+1) L_(hat(K)(q)) + z sum_K (lambda(q)))]$ + #v(1em) - #pause - *Proprietà cruciale:* Ogni termine a destra ha meno incroci o è "più vicino" al caso base -] + $ + & L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \ + -(& cancel(L[S_0 K]) + cancel(L[S_1 S_0 K])) = -z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + (-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) + $ -== Strategia della Dimostrazione + #{ + v(1.5em) + + h(4.4em) + $display( + => L[K] + (-1)^n L[hat(K)] = + z sum_(i=0)^n (-1)^i ( + L[A_i^lambda K] + L[B_i^lambda K] + ) + )$ + } + + + #{ + set text(fill: white) + + + v(1.5em) + $ + Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda) + $ + } +] #slide[ - *Ipotesi induttiva* (per diagrammi con $< N$ incroci): - 1. $L_K$ è ben definito (indipendente dalle scelte) - 2. $L_K$ verifica tutte le relazioni skein - 3. $L_K$ è invariante per mosse II e III che non aumentano gli incroci - #pause + #v(2em) - *Lemmi tecnici fondamentali:* + #{ + set align(center) - - *Lemma delle Rotazioni*: L'ordine ciclico degli scambi non influenza il risultato - - *Invarianza del punto base*: La definizione non dipende dal punto base scelto - - *Identità per nodi banali*: $L[hat(K)(p)] + L[hat(K)(q)] = z(L[E_i hat(K)] + L[e_i hat(K)])$ + [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:] + } - #pause + #v(1em) - *Metodo:* Spostando il punto base di un incrocio per volta, si dimostra l'invarianza completa -] -== Verifica degli Assiomi e Invarianza + $ + & L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \ + -(& cancel(L[S_0 K]) + cancel(L[S_1 S_0 K])) = -z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + (-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) + $ + + #{ + v(1.5em) + + h(4.4em) + $display( + => L[K] = (-1)^(n+1) L[hat(K)] + + z sum_(i=0)^n (-1)^i ( + L[A_i^lambda K] + L[B_i^lambda K] + ) + )$ + } + + #{ + set text(fill: white) + + + v(1.5em) + $ + Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda) + $ + } +] #slide[ - *Teorema*: La definizione induttiva soddisfa tutti gli assiomi di Kauffman - #pause - *Dimostrazione per le relazioni skein*: - 1. Scegli il punto base in modo che l'incrocio sia il primo nella sequenza - 2. La relazione skein emerge naturalmente dalla formula ricorsiva - 3. Gli altri termini si cancellano per simmetria + #v(2em) - #pause + #{ + set align(center) - *Invarianza per isotopia regolare*: - - *Mossa II*: scegli punti base che evitano gli incroci coinvolti - - *Mossa III*: usa equivalenze locali e induzione + [Sia $lambda$ una sequenza di scambi che porta $K$ a $hat(K)$:] + } - #pause + #v(1em) - #align(center)[ - La costruzione induttiva "conosce automaticamente" tutte le proprietà necessarie! - ] + + $ + & L[K] + cancel(L[S_0 K]) = z( L[E_0 K] + L[e_0 K] ) \ + -(& cancel(L[S_0 K]) + cancel(L[S_1 S_0 K])) = -z( L[E_1 S_0 K] + L[e_1 S_0 K] ) \ + & space dots.v \ + (-1)^n (& cancel(L[S_(n-1) dotss S_0 K]) + L [hat(K)]) = (-1)^n z (L[E_n S_(n-1) dotss S_0 K] + L[e_n S_(n-1) dotss S_0 K]) + $ + + #{ + v(1.5em) + + h(4.4em) + $display( + => L[K] = (-1)^(n+1) L[hat(K)] + + z sum_(i=0)^n (-1)^i ( + L[A_i^lambda K] + L[B_i^lambda K] + ) + )$ + } + + #{ + v(1.5em) + $ + Omega_K (lambda) colon.eq (-1)^(abs(lambda) + 1) L[hat(K)(lambda)] + z sum_K (lambda) + $ + } ] +== Definizione induttiva + +*Def (induttiva di $L_K$).* Il polinomio $L_(K)(a,z)$ è definito induttivamente come segue: + +// la definizione è sotto perché gli enumerate non vanno d'accordo con le figure + +1. Se $K = hat(K)(cal(U), p)$ è in _forma discendente_ per un qualche $p$: $L_K (a, z) colon.eq a^w(K)$ + +2. Se $K = K_1 union K_2$ rispettivamente diagrammi di un nodo e di un link e con $K_1$ _sovrastante_ $K_2$: + + $ + L(K_1 union K_2) colon.eq delta L(K_1) L(K_2) + #h(2em) + delta colon.eq (a + a^(-1)) slash z - 1 + $ + +3. Altrimenti $K = K_1 union dotss union K_n$: + + #v(0.75em) + + a) Se $n > 1$: $display( + L_K (a, z) colon.eq + 1 / (2n) + sum_(i=1)^n sum_(q=p_i, overline(p)_i) + ((-1)^(abs(lambda(q))+1) delta L_(K_i) L_(K - K_i) + z sum_K (lambda(q))) + )$ + + #v(1.5em) + + b) Se $n=1$: $display( + L_K (a, z) colon.eq + 1 / 2 + sum_(q = p, overline(p)) + ((-1)^(abs(lambda(q))+1) L_(hat(K)(q)) + z sum_K (lambda(q))) + )$ + +== Dimostrazione buona definizione + + +== Ipotesi induttiva + +Bla bla bla + = Laboratorio Computazionale == Implementazione e Verifica diff --git a/src/presentation/theme.typ b/src/presentation/theme.typ index 3333751..601bef8 100644 --- a/src/presentation/theme.typ +++ b/src/presentation/theme.typ @@ -1,23 +1,29 @@ #import "@preview/touying:0.6.1": * #let _tblock(self: none, title: none, it) = { - grid(columns: 1, row-gutter: 0pt, block( - fill: self.colors.primary-dark, - width: 100%, - radius: (top: 6pt), - inset: (top: 0.4em, bottom: 0.3em, left: 0.5em, right: 0.5em), - text(fill: self.colors.neutral-lightest, weight: "bold", title), - ), rect( - fill: gradient.linear(self.colors.primary-dark, self.colors.primary.lighten(90%), angle: 90deg), - width: 100%, - height: 4pt, - ), block( - fill: self.colors.primary.lighten(90%), - width: 100%, - radius: (bottom: 6pt), - inset: (top: 0.4em, bottom: 0.5em, left: 0.5em, right: 0.5em), - it, - )) + grid( + columns: 1, + row-gutter: 0pt, + block( + fill: self.colors.primary-dark, + width: 100%, + radius: (top: 6pt), + inset: (top: 0.4em, bottom: 0.3em, left: 0.5em, right: 0.5em), + text(fill: self.colors.neutral-lightest, weight: "bold", title), + ), + rect( + fill: gradient.linear(self.colors.primary-dark, self.colors.primary.lighten(90%), angle: 90deg), + width: 100%, + height: 4pt, + ), + block( + fill: self.colors.primary.lighten(90%), + width: 100%, + radius: (bottom: 6pt), + inset: (top: 0.4em, bottom: 0.5em, left: 0.5em, right: 0.5em), + it, + ), + ) } #let tblock(title: none, it) = touying-fn-wrapper(_tblock.with(title: title, it)) @@ -89,7 +95,7 @@ // institution if info.institution != none { parbreak() - text(size: 0.7em, info.institution) + text(size: 0.8em, info.institution) } // date if info.date != none { @@ -100,29 +106,47 @@ touying-slide(self: self, body) }) -#let outline-slide(config: (:), title: utils.i18n-outline-title, numbered: true, level: none, ..args) = touying-slide-wrapper(self => { - self.store.title = title - touying-slide(self: self, config: config, std.align(self.store.align, components.adaptive-columns({ - text(fill: self.colors.primary, weight: 600, components.custom-progressive-outline( - level: level, - alpha: self.store.alpha, - indent: (0em, 1em), - vspace: (.4em,), - numbered: (numbered,), - depth: 1, - ..args.named(), - )) - }) + args.pos().sum(default: none))) +#let outline-slide( + config: (:), + title: utils.i18n-outline-title, + numbered: true, + level: none, + ..args, +) = touying-slide-wrapper(self => { + self.store.title = "Indice" + touying-slide(self: self, config: config, std.align( + self.store.align, + components.adaptive-columns({ + text(fill: self.colors.primary, weight: 600, components.custom-progressive-outline( + level: level, + alpha: self.store.alpha, + indent: (0em, 1em), + vspace: (.4em,), + numbered: (numbered,), + depth: 1, + ..args.named(), + )) + }) + + args.pos().sum(default: none), + )) }) -#let new-section-slide(config: (:), title: utils.i18n-outline-title, level: 1, numbered: true, ..args, body) = outline-slide(config: config, title: title, level: level, numbered: numbered, ..args, body) +#let new-section-slide( + config: (:), + title: utils.i18n-outline-title, + level: 1, + numbered: true, + ..args, + body, +) = outline-slide(config: config, title: title, level: level, numbered: numbered, ..args, body) #let focus-slide(config: (:), align: horizon + center, body) = touying-slide-wrapper(self => { - self = utils.merge-dicts( - self, - config-common(freeze-slide-counter: true), - config-page(fill: self.colors.primary, margin: 2em, header: none, footer: none), - ) + self = utils.merge-dicts(self, config-common(freeze-slide-counter: true), config-page( + fill: self.colors.primary, + margin: 2em, + header: none, + footer: none, + )) set text(fill: self.colors.neutral-lightest, weight: "bold", size: 1.5em) touying-slide(self: self, config: config, std.align(align, body)) }) @@ -131,12 +155,11 @@ let content = { set std.align(center + horizon) if title != none { - block( - fill: self.colors.tertiary, - inset: (top: 0.7em, bottom: 0.7em, left: 3em, right: 3em), - radius: 0.5em, - text(size: 1.5em, fill: self.colors.neutral-lightest, title), - ) + block(fill: self.colors.tertiary, inset: (top: 0.7em, bottom: 0.7em, left: 3em, right: 3em), radius: 0.5em, text( + size: 1.5em, + fill: self.colors.neutral-lightest, + title, + )) } body } @@ -176,7 +199,11 @@ rows: (auto, auto), utils.call-or-display(self, self.store.footer), if self.store.progress-bar { - utils.call-or-display(self, components.progress-bar(height: 2pt, self.colors.primary, self.colors.neutral-lightest)) + utils.call-or-display(self, components.progress-bar( + height: 2pt, + self.colors.primary, + self.colors.neutral-lightest, + )) }, ) } @@ -191,26 +218,30 @@ margin: (top: 3.5em, bottom: 2.5em, x: 2.5em), ), config-common(slide-fn: slide, new-section-slide-fn: new-section-slide), - config-methods(init: (self: none, body) => { - set text(size: 18pt, font: "Open Sans") - set par(leading: 0.75em) - set list(marker: { - place(top + left, dy: 0.2em, circle(fill: self.colors.primary, radius: 3pt)) - h(0.25em) - }) - show figure.caption: set text(size: 0.6em) - show footnote.entry: set text(size: 0.6em) - show heading: set text(fill: self.colors.primary) - show link: it => if type(it.dest) == str { - set text(fill: self.colors.primary) - it - } else { - it - } - show figure.where(kind: table): set figure.caption(position: top) + config-methods( + init: (self: none, body) => { + set text(size: 18pt, font: "Open Sans") + set par(leading: 0.75em) + set list(marker: { + place(top + left, dy: 0.2em, circle(fill: self.colors.primary, radius: 3pt)) + h(0.25em) + }) + show figure.caption: set text(size: 0.6em) + show footnote.entry: set text(size: 0.6em) + show heading: set text(fill: self.colors.primary) + show link: it => if type(it.dest) == str { + set text(fill: self.colors.primary) + it + } else { + it + } + show figure.where(kind: table): set figure.caption(position: top) - body - }, alert: utils.alert-with-primary-color, tblock: _tblock), + body + }, + alert: utils.alert-with-primary-color, + tblock: _tblock, + ), config-colors( primary: rgb("#003c71"), primary-dark: rgb("#005baa"), @@ -236,16 +267,14 @@ logo: utils.call-or-display(self, self.store.header-right), ), header: self => if self.store.title != none { - block( - width: 100%, - height: 2em, - fill: self.colors.primary, - place( - left + horizon, - text(fill: self.colors.neutral-lightest, weight: 600, size: 1.2em, utils.call-or-display(self, self.store.title)), - dx: 1.5em, - ), - ) + block(width: 100%, height: 2em, fill: self.colors.primary, place( + left + horizon, + text(fill: self.colors.neutral-lightest, weight: 600, size: 1.2em, utils.call-or-display( + self, + self.store.title, + )), + dx: 1.5em, + )) }, footer: self => { let cell(fill: none, it) = rect( @@ -270,4 +299,4 @@ ) body -} \ No newline at end of file +} diff --git a/src/skein.typ b/src/skein.typ index 548f8fa..7c37916 100644 --- a/src/skein.typ +++ b/src/skein.typ @@ -4,7 +4,10 @@ import cetz.draw: * // draw the white outline - set-style(..cetz.styles.resolve((stroke: (paint: white, thickness: size-factor * 0.75pt * 8, cap: "butt")), base: style)) + set-style(..cetz.styles.resolve( + (stroke: (paint: white, thickness: size-factor * 0.75pt * 8, cap: "butt")), + base: style, + )) polyline // draw the black line @@ -81,6 +84,49 @@ draw-strand({ hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }) }), // + // Large + // + unit-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + + circle((0, 0), radius: 1, stroke: (paint: black, thickness: 0.75pt)) + }), + over-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + draw-strand({ line((-1, -1), (1, 1)) }) + draw-strand({ line((-1, 1), (1, -1)) }) + }), + under-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + draw-strand({ line((-1, 1), (1, -1)) }) + draw-strand({ line((-1, -1), (1, 1)) }) + }), + h-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + draw-strand({ hobby((-1, -1), (0, -0.61), (1, -1), omega: 1) }) + draw-strand({ hobby((-1, 1), (0, +0.61), (1, 1), omega: 1) }) + }), + v-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + draw-strand({ hobby((-1, -1), (-0.61, 0), (-1, 1), omega: 1) }) + draw-strand({ hobby((1, -1), (+0.61, 0), (1, 1), omega: 1) }) + }), + strand-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + rect((-1, -1), (1, 1), fill: white, stroke: none) + draw-strand({ hobby((-1, 0), (0, 0.25), (1, 0), omega: 1) }) + }), + over-twist-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + draw-strand({ hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }) + draw-strand({ hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }) + }), + under-twist-large: skein-canvas(size-factor: 1.5, { + import cetz.draw: * + draw-strand({ hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }) + draw-strand({ hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }) + }), + // // Medium // unit-medium: skein-canvas(size-factor: medium-scale-factor, { @@ -123,16 +169,16 @@ }), ) -#let skein-generic(kind: "over", direction: (+1, +1), arrows: (true, true), styles: ((:), (:))) = { - skein-canvas({ +#let skein-generic(kind: "over", direction: (+1, +1), arrows: (true, true), styles: ((:), (:)), size-factor: 1.0) = { + skein-canvas(size-factor: size-factor, { import cetz.draw: * if kind == "over" { - draw-strand({ line((-1, -1), (1, 1)) }, style: styles.at(1)) - draw-strand({ line((-1, 1), (1, -1)) }, style: styles.at(0)) + draw-strand(size-factor: size-factor, { line((-1, -1), (1, 1)) }, style: styles.at(1)) + draw-strand(size-factor: size-factor, { line((-1, 1), (1, -1)) }, style: styles.at(0)) } if kind == "under" { - draw-strand({ line((-1, 1), (1, -1)) }, style: styles.at(0)) - draw-strand({ line((-1, -1), (1, 1)) }, style: styles.at(1)) + draw-strand(size-factor: size-factor, { line((-1, 1), (1, -1)) }, style: styles.at(0)) + draw-strand(size-factor: size-factor, { line((-1, -1), (1, 1)) }, style: styles.at(1)) } if arrows.at(0) {