diff --git a/out/tesi-triennale.pdf b/out/tesi-triennale.pdf index f697c80..c1d697e 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 66fcc99..d313633 100644 --- a/src/main.typ +++ b/src/main.typ @@ -3,18 +3,15 @@ #import "@preview/cetz:0.3.4" #import "skein.typ": * -#import "@preview/drafting:0.2.2": set-margin-note-defaults, inline-note, margin-note, set-page-properties +#import "@preview/drafting:0.2.2": inline-note, margin-note, set-margin-note-defaults, set-page-properties #import "@preview/colorful-boxes:1.1.0": stickybox #set-margin-note-defaults( - rect: (..kwargs, content) => rect( - ..kwargs, - { - set text(size: 8pt, font: "Open Sans") - set par(leading: 0.5em, justify: false) - content - }, - ), + rect: (..kwargs, content) => rect(..kwargs, { + set text(size: 8pt, font: "Open Sans") + set par(leading: 0.5em, justify: false) + content + }), side: right, ) @@ -109,12 +106,9 @@ inoltre $f$ si dice embedding *localmente piatto* se lo è in ogni punto di $X$. Un *nodo tame* è un sottoinsieme $K subset bb(R)^3$ per cui esiste un embedding $f : bb(S)^1 arrow.hook bb(R)^3$ localmente piatto con $K = f(bb(S)^1)$. In questo caso $f$ è anche detto *embedding tame*. ] -#figure( - image("assets/wild_knot.svg", width: 75%), - caption: [ - Un esempio di nodo non tame - ], -) +#figure(image("assets/wild_knot.svg", width: 75%), caption: [ + Un esempio di nodo non tame +]) Esistono anche nodi non tame come quello riportato nella figura precedente @wiki:wild_knot, ma d'ora in avanti considereremo solo nodi tame. @@ -269,24 +263,20 @@ Il teorema di Reidemeister ci dice che due nodi sono equivalenti a meno di isoto Possiamo chiederci cosa succede se ci restringiamo all'equivalenza generata solo dalle isotopie planari e dalle mosse II e III, questo ci dà una nuova equivalenza tra nodi più stringente dell'isotopia ambiente. #definition[ - Due nodi o link $K_1, K_2$ si dicono equivalenti a meno di *isotopia regolare* se e solo se due loro diagrammi sono equivalenti a meno di isotopie planari e mosse II e III di Reidemeister. + Due diagrammi $D_1, D_2$ di nodi o 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", - width: 15cm, - ), -) +#figure(image( + "assets/ambient-regular-isotopy-difference.jpg", + width: 15cm, +)) Una prima cosa che possiamo notare è che 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: 10cm, - ), -) +#figure(image( + "assets/move-1-factorization.png", + width: 10cm, +)) Quindi i riccioli possono essere spostati liberamente e non ci impediscono di applicare mosse di tipo II o III. In particolare questo ci permette anche di "fattorizzare" tutti i riccioli di una componente in modo che siano tutti vicini. @@ -305,7 +295,7 @@ Questo sarà importante più avanti quando vedremo invarianti come il polinomio Vediamo ora un primo invariante di isotopia regolare per link orientatati, per prima cosa definiamo il segno di un incrocio. #definition[ - Dato un incrocio di un link orientato ci possono essere due casi in base alla direzione in cui il filo sottostante si trova rispetto a quello sopra. Definiamo *il segno* di un incrocio in base a questi casi come segue + Dato un incrocio di un link orientato ci possono essere due casi in base alla direzione in cui il filo sotto si trova rispetto a quello sopra. Definiamo *il segno* di un incrocio in base a questi casi come segue $ epsilon(#skein-generic(direction: (+1, +1))) = +1 @@ -318,7 +308,7 @@ Vediamo ora un primo invariante di isotopia regolare per link orientatati, per p Dato $K$ link orientato, il *writhe* $w(K)$ o numero di avvolgimento è dato dalla somma dei segni dei suoi incroci $ - w(K) colon.eq sum_c epsilon(c) + w(K) colon.eq sum_(c "incrocio") epsilon(c) $ ] @@ -334,45 +324,42 @@ Vediamo ora un primo invariante di isotopia regolare per link orientatati, per p epsilon(#skein-generic(direction: (-1, +1))) = epsilon(#skein-generic(direction: (+1, -1))) = -1 $ - ad esempio nel primo caso invertendo le due frecce il filo sottostante va sempre verso sinistra rispetto a quello sopra quindi il segno rimane invariato. + Nel primo caso invertendo le due frecce il filo che passa sotto va sempre verso sinistra rispetto a quello sopra quindi il segno rimane invariato, il secondo caso è analogo. ] -Questo risultato può essere generalizzato a link con l'accortezza di invertire l'orientazione di tutte le componenti (o anche solamente tutte quelle di una sola componente connessa relativamente alla sua ombra planare). +Questo risultato può essere generalizzato a link con l'accortezza di invertire l'orientazione di tutte le componenti (o anche solamente tutte quelle che appartengono ad una sola componente connessa relativamente alla sua ombra planare). #proposition[ Il writhe è un invariante di isotopia regolare, ovvero se $K_1, K_2$ sono equivalenti a meno di isotopia regolare allora $w(K_1) = w(K_2)$. ] #proof[ - Per prima cosa controlliamo cosa succede nel caso delle mosse di tipo II e III: + Controlliamo cosa succede nel caso delle mosse di tipo II e III: - Nel caso della mossa II si può vedere che indipendentemente dalle orientazioni sui due fili, quando portiamo uno sopra l'altro compaiono sempre due incroci con segni opposti quindi per additività del writhe la somma totale non cambia. - #figure(image("assets/writhe-move-2.png", width: 4.5cm)) + #figure(image("assets/writhe-move-2.png", width: 6cm)) - Per quanto riguarda la mossa III, il numero di incroci non cambia quindi basta controllare che la somma sia la stessa - #figure(image("assets/writhe-move-3.png", width: 4.5cm)) + #figure(image("assets/writhe-move-3.png", width: 6cm)) Come possiamo notare nel caso mostrato in figura ciò che accade è che stiamo solo spostando e scambiando alcuni degli incroci tra loro. In particolare possiamo identificare ogni incrocio come l'intersezione di due delle tre rette, dopo aver applicato la mossa III le rette si saranno spostate ma le orientazioni saranno sempre le stesse e quindi anche i segni degli incroci. Inoltre notiamo che il writhe non è influenzato dalle isotopie planari quindi questo conclude la dimostrazione. ] -#figure( - image("assets/writhe-examples.png", width: 10cm), - caption: [ - Esempi di calcolo del writhe - // per varie orientazioni del link di Hopf e del nodo trifoglio - ], -) +#figure(image("assets/writhe-examples.png", width: 12cm), caption: [ + Esempi di calcolo del writhe + // per varie orientazioni del link di Hopf e del nodo trifoglio +]) == Da isotopia regolare ad ambiente -Un primo fatto più generale che possiamo vedere è che, dato un invariante di isotopia regolare che si comporta bene rispetto alle mosse di tipo I, possiamo costruire un invariante di isotopia ambiente aggiungendo un fattore di correzione dato dal writhe. +Un primo fatto generale che possiamo vedere è che, dato un invariante di isotopia regolare che si comporta "bene" rispetto alle mosse di tipo I, possiamo costruire un invariante di isotopia ambiente aggiungendo un fattore di correzione dato dal writhe. #proposition[ - Sia $R$ un anello, $a in R$ un elemento invertibile e $K$ un link orientato, allora se $L(K) in R$ è un invariante di isotopia regolare tale che + Sia $R$ un anello, $a in R$ un elemento invertibile e $K$ un link orientato, allora se $L : scr(D) -> R$ è un invariante di isotopia regolare tale che $ L(#skein.over-twist) = a L(#skein.strand) @@ -383,8 +370,10 @@ Un primo fatto più generale che possiamo vedere è che, dato un invariante di i allora $F(K) colon.eq a^(-w(K)) L(K)$ è un invariante di isotopia ambiente. ] +*Osservazione.* In questo caso la notazione "$L(#skein.over-twist-medium) = a L(#skein.strand-medium)$" indica che ci sono due diagrammi $D_1, D_2$ identici ovunque tranne che nella parte evidenziata. + #proof[ - Per prima cosa notiamo che $w(K)$ è un invariante per isotopia regolare, dunque lo è anche $a^(-w(K))$. Osserviamo che $a^(-w(K)) dot L(K)$ è un prodotto di due invarianti per isotopia regolare dunque anche $F(K)$ è invariante per isotopia regolare. + Per prima cosa notiamo che $w(K)$ è invariante per isotopia regolare, dunque lo è anche $a^(-w(K))$. Osserviamo che $a^(-w(K)) dot L(K)$ è un prodotto di quantità invarianti per isotopia regolare dunque anche $F(K)$ è invariante per isotopia regolare. Dunque basta controllare che $F(K)$ sia invariante rispetto alle mosse di tipo I. Per prima cosa osserviamo che @@ -398,14 +387,13 @@ Un primo fatto più generale che possiamo vedere è che, dato un invariante di i ed usando anche la proprietà dell'ipotesi otteniamo $ - F(#skein.over-twist) - &= a^(-w(#skein.over-twist-small)) dot L(#skein.over-twist) \ - &= a^(-w(#skein.strand-small) - 1) dot a dot L(#skein.strand) \ - &= a^(-w(#skein.strand-small)) dot cancel(a^(-1)) dot cancel(a) dot L(#skein.strand) \ - &= a^(-w(#skein.strand-small)) dot L(#skein.strand) = F(#skein.strand) \ + F(#skein.over-twist) & = a^(-w(#skein.over-twist-small)) dot L(#skein.over-twist) \ + & = a^(-w(#skein.strand-small) - 1) dot a dot L(#skein.strand) \ + & = a^(-w(#skein.strand-small)) dot cancel(a^(-1)) dot cancel(a) dot L(#skein.strand) \ + & = a^(-w(#skein.strand-small)) dot L(#skein.strand) = F(#skein.strand) \ $ - e segue anche analogamente l'altro ricciolo che $F(#skein.under-twist) = F(#skein.strand)$. + e segue anche analogamente per l'altro ricciolo che $F(#skein.under-twist) = F(#skein.strand)$. ] = Polinomio di Kauffman @@ -495,25 +483,23 @@ Ad esempio proviamo a ricavare il valore di $delta colon.eq L(#skein.unit#skein. $ 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) ) - ) \ - => - a L( #skein.unit ) - + - a^(-1) L( #skein.unit ) - &= - z ( - delta - + - L ( #skein.unit ) - ) \ - => a + a^(-1) &= z ( delta + 1 ) \ - => delta &= (a + a^(-1)) slash z - 1 + 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) ) + ) \ + => + a L( #skein.unit ) + + + a^(-1) L( #skein.unit ) & = + z ( + delta + + + L ( #skein.unit ) + ) \ + => a + a^(-1) & = z ( delta + 1 ) \ + => delta & = (a + a^(-1)) slash z - 1 $ Questo valore $delta = (a + 1 slash a) slash z - 1$ ricomparirà anche in seguito ed è il coefficiente che il polinomio di Kauffman introduce quando abbiamo un link con due componenti disgiunte. Possiamo anche trovare il risultato per il link di Hopf come segue @@ -523,27 +509,24 @@ Questo valore $delta = (a + 1 slash a) slash z - 1$ ricomparirà anche in seguit $ 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-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) - ) \ + 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("hopf-0.png", height: 1.75em) ) & = + - (a + a^(-1)) z^(-1) + 1 + (a + a^(-1)) z $ @@ -554,27 +537,24 @@ E del nodo trifoglio $ 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-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) - ) \ + 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 + L( #knot-picture("trefoil-0.png", height: 2em) ) & = + -(2a + a^(-1)) + (1 + a^(-2)) z + (a + a^(-1)) z^2 $ #definition[ @@ -647,63 +627,50 @@ $ se ora sommiamo e sottraiamo membro a membro otteniamo la seguente identità -#context block( - width: page.width, - grid( - columns: 3, - column-gutter: 2em, - row-gutter: 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_0 S_0 K) + L_(e_0 S_0 K) )$, - $dots.v$, $=$, $dots.v$, - $+(-1)^n (L_(S_(n-1) dots S_0 K) + L_(hat(K)))$, - [], - $+(-1)^n (z (L_(E_n S_(n-1) dots S_0 K) + L_(e_n S_(n-1) dots S_0 K)))$, - ), -) +#context block(width: page.width, grid( + columns: 3, + column-gutter: 2em, + row-gutter: 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_0 S_0 K) + L_(e_0 S_0 K) )$, + $dots.v$, $=$, $dots.v$, + $+(-1)^n (L_(S_(n-1) dots S_0 K) + L_(hat(K)))$, + [], + $+(-1)^n (z (L_(E_n S_(n-1) dots S_0 K) + L_(e_n S_(n-1) dots S_0 K)))$, +)) notiamo che possiamo cancellare tutti i termini del membro di sinistra che compaiono due volte con segno opposto -#context block( - width: page.width, - grid( - columns: 3, - column-gutter: 2em, - row-gutter: 1em, - $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_0 S_0 K) + L_(e_0 S_0 K) )$, - $dots.v$, $=$, $dots.v$, - $+(-1)^n (cancel(L_(S_(n-1) dots S_0 K)) + L_(hat(K)))$, - [], - $+(-1)^n (z (L_(E_n S_(n-1) dots S_0 K) + L_(e_n S_(n-1) dots S_0 K)))$, - ), -) +#context block(width: page.width, grid( + columns: 3, + column-gutter: 2em, + row-gutter: 1em, + $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_0 S_0 K) + L_(e_0 S_0 K) )$, + $dots.v$, $=$, $dots.v$, + $+(-1)^n (cancel(L_(S_(n-1) dots S_0 K)) + L_(hat(K)))$, + [], + $+(-1)^n (z (L_(E_n S_(n-1) dots S_0 K) + L_(e_n S_(n-1) dots S_0 K)))$, +)) Da cui otteniamo un'espressione per $L_K$, inoltre posto $lambda = (0, dots, n)$ -#align( - center, - block( - width: 15cm, - [ - #set align(center) - - $ - => - L_K - &= - (-1)^(n+1) L_(hat(K)) + z sum_(i=0)^n (-1)^i ( - L_(E_n S_(n-1) dots S_0 K) + L_(e_n S_(n-1) dots S_0 K) - ) \ - &= - (-1)^(n+1) L_(hat(K)) + z sum_(i=0)^n (-1)^i ( - L_(A_n^lambda K) + L_(B_n^lambda K) - ) - $ +#align(center, block(width: 15cm, [ + #set align(center) - ], - ), -) + $ + => + L_K & = + (-1)^(n+1) L_(hat(K)) + z sum_(i=0)^n (-1)^i ( + L_(E_n S_(n-1) dots S_0 K) + L_(e_n S_(n-1) dots S_0 K) + ) \ + & = + (-1)^(n+1) L_(hat(K)) + z sum_(i=0)^n (-1)^i ( + L_(A_n^lambda K) + L_(B_n^lambda K) + ) + $ + +])) Questo ci dà un'idea su come sia possibile calcolare induttivamente $L_K$ in termini di $L_hat(K)$ e di altri diagrammi con meno incroci del diagramma di partenza. diff --git a/src/skein.typ b/src/skein.typ index 1024b71..d823922 100644 --- a/src/skein.typ +++ b/src/skein.typ @@ -4,36 +4,25 @@ 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 - set-style( - ..cetz.styles.resolve( - style, - base: (stroke: (paint: black, thickness: size-factor * 0.75pt, cap: "round")), - ), - ) + set-style(..cetz.styles.resolve(style, base: (stroke: (paint: black, thickness: size-factor * 0.75pt, cap: "round")))) polyline // set-style(stroke: (paint: black, thickness: thickness, cap: "round")) } -#let skein-canvas = (body, size-factor: 1.0) => cetz.canvas( - length: size-factor * 0.25cm, - padding: 0.25, - { - import cetz.draw: * - rect((-1, -1), (1, 1), fill: white, stroke: none) +#let skein-canvas = (body, size-factor: 1.0) => cetz.canvas(length: size-factor * 0.25cm, padding: 0.25, { + import cetz.draw: * + rect((-1, -1), (1, 1), fill: white, stroke: none) - body - }, -) + body +}) #let arrow-size = 0.35 @@ -51,6 +40,7 @@ } } +#let medium-scale-factor = 0.8 #let small-scale-factor = 0.125cm / 0.25cm #let skein = ( @@ -94,45 +84,31 @@ 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)) }) }), - strand-small: skein-canvas( - size-factor: small-scale-factor, - { - import cetz.draw: * - rect((-1, -1), (1, 1), fill: white, stroke: none) - draw-strand( - size-factor: small-scale-factor, - { hobby((-1, 0), (0, 0.25), (1, 0), omega: 1) }, - ) - }, - ), - over-twist-small: skein-canvas( - size-factor: small-scale-factor, - { - import cetz.draw: * - draw-strand( - size-factor: small-scale-factor, - { hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }, - ) - draw-strand( - size-factor: small-scale-factor, - { hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }, - ) - }, - ), - under-twist-small: skein-canvas( - size-factor: small-scale-factor, - { - import cetz.draw: * - draw-strand( - size-factor: small-scale-factor, - { hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }, - ) - draw-strand( - size-factor: small-scale-factor, - { hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }, - ) - }, - ), + strand-medium: skein-canvas(size-factor: medium-scale-factor, { + import cetz.draw: * + rect((-1, -1), (1, 1), fill: white, stroke: none) + draw-strand(size-factor: medium-scale-factor, { hobby((-1, 0), (0, 0.25), (1, 0), omega: 1) }) + }), + over-twist-medium: skein-canvas(size-factor: medium-scale-factor, { + import cetz.draw: * + draw-strand(size-factor: medium-scale-factor, { hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }) + draw-strand(size-factor: medium-scale-factor, { hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }) + }), + strand-small: skein-canvas(size-factor: small-scale-factor, { + import cetz.draw: * + rect((-1, -1), (1, 1), fill: white, stroke: none) + draw-strand(size-factor: small-scale-factor, { hobby((-1, 0), (0, 0.25), (1, 0), omega: 1) }) + }), + over-twist-small: skein-canvas(size-factor: small-scale-factor, { + import cetz.draw: * + draw-strand(size-factor: small-scale-factor, { hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }) + draw-strand(size-factor: small-scale-factor, { hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }) + }), + under-twist-small: skein-canvas(size-factor: small-scale-factor, { + import cetz.draw: * + draw-strand(size-factor: small-scale-factor, { hobby((-1.5, +1), (-1, +1), (0.5, 0), (0.1, -1), (0, -1)) }) + draw-strand(size-factor: small-scale-factor, { hobby((1.5, +1), (1, +1), (-0.5, 0), (-0.1, -1), (0, -1)) }) + }), )