almost finished chapter 2

main
Antonio De Lucreziis 12 months ago
parent 5c1df0c0e8
commit edd05f4502

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

@ -33,7 +33,7 @@
),
),
abstract: [
In questa tesi tratteremo del polinomio di Kauffman, un invariante di nodi e link per di isotopia regolare. Introdurremo dei risultati di fondazione della teoria dei nodi per definire l'isotopia regolare. Infine vedremo la dimostrazione della buona definizione del polinomio di Kauffman a partire dalla forma assiomatica. Inoltre per il progetto di Laboratorio Computazionale abbiamo implementato in Python questo polinomio e verificato tutti i valori presenti nel database di KnotInfo e trovato un errore nel calcolo del nodo $10_125$.
In questa tesi tratteremo del polinomio di Kauffman, un invariante di nodi e link di isotopia regolare. Introdurremo dei risultati di fondazione della teoria dei nodi per definire l'isotopia regolare. Infine vedremo la dimostrazione della buona definizione del polinomio di Kauffman a partire dalla forma assiomatica. Per il progetto di Laboratorio Computazionale abbiamo implementato in Python questo polinomio e verificato tutti i valori presenti nel database di KnotInfo e trovato un errore nel calcolo del nodo $10_125$.
],
bibliography: bibliography("refs.bib"),
)
@ -44,29 +44,29 @@
= Introduzione
In questa tesi studieremo un invariante di isotopia regolare chiamato polinomio di Kauffman @Kauffman1990-qe. Intuitivamente se l'isotopia ambiente è l'equivalenza tra diagrammi generata dalle mosse I, II e III di Reidemeister, l'isotopia regolare è l'equivalenza generata solo dalle mosse II e III.
// In questa tesi studieremo un invariante di isotopia regolare chiamato polinomio di Kauffman @Kauffman1990-qe. Intuitivamente se l'isotopia ambiente è l'equivalenza tra diagrammi generata dalle mosse I, II e III di Reidemeister, l'isotopia regolare è l'equivalenza generata solo dalle mosse II e III.
#figure(
image("assets/ambient-regular-isotopy-difference.jpg", width: 13cm),
caption: [Mosse di Reidemeister],
)
// #figure(
// image("assets/ambient-regular-isotopy-difference.jpg", width: 13cm),
// caption: [Mosse di Reidemeister],
// )
Dato un nodo o link non orientato $K$, possiamo definire in forma assiomatica il polinomio $kL_K (a, z) in bb(Z)[a, a^(-1), z, z^(-1)]$ attraverso i seguenti assiomi:
// Dato un nodo o link non orientato $K$, possiamo definire in forma assiomatica il polinomio $kL_K (a, z) in bb(Z)[a, a^(-1), z, z^(-1)]$ attraverso i seguenti assiomi:
1. Se $K$, $K'$ sono equivalenti a meno di isotopia regolare, allora $kL_K (a,z) = kL_K' (a,z)$.
// 1. Se $K$, $K'$ sono equivalenti a meno di isotopia regolare, allora $kL_K (a,z) = kL_K' (a,z)$.
2. Valgono le seguenti relazioni skein:
// 2. Valgono le seguenti relazioni skein:
- $kL(#skein.over) + kL(#skein.under) = z (kL(#skein.h) + kL(#skein.v))$
// - $kL(#skein.over) + kL(#skein.under) = z (kL(#skein.h) + kL(#skein.v))$
- $kL(#skein.unit) = 1$
// - $kL(#skein.unit) = 1$
- $kL(#skein.over-twist) = a kL(#skein.strand)$
// - $kL(#skein.over-twist) = a kL(#skein.strand)$
- $kL(#skein.under-twist) = a^(-1) kL(#skein.strand)$
// - $kL(#skein.under-twist) = a^(-1) kL(#skein.strand)$
Vedremo come questi assiomi definiscono un unico invariante di isotopia regolare ben definito e come $kL_K (a, z)$ può essere generalizzato a un invariante di isotopia ambiente $F_K (a, z)$ utilizzando il _writhe_ di un nodo.
// Vedremo come questi assiomi definiscono un unico invariante di isotopia regolare ben definito e come $kL_K (a, z)$ può essere generalizzato a un invariante di isotopia ambiente $F_K (a, z)$ utilizzando il _writhe_ di un nodo.
== Introduzione alla Teoria dei Nodi
@ -97,7 +97,7 @@ Ora introdurremo alcuni risultati fondamentali di teoria dei nodi. Vedremo le de
$U$, $approx$, $bb(D)^2 times [0, 1]$,
$U inter f(X)$, $<->$, ${ 0 } times [0, 1]$,
),
align(center, image("assets/locally-flat-v2.png", width: 5.5cm)),
align(center, image("assets/locally-flat-v2.png", width: 4cm)),
)
@ -264,446 +264,487 @@ Come abbiamo generalizzato da nodi a link possiamo ripetere tutto anche aggiunge
= Isotopia Regolare
#todo[
Work in progress
Il teorema di Reidemeister ci dice che due nodi sono equivalenti a meno di isotopia ambiente se e solo se lo sono anche dei loro diagrammi a meno di isotopie planari e mosse I, II e III.
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.
]
// #todo[
// Aggiungere più commenti
// ]
#figure(image("assets/ambient-regular-isotopy-difference.jpg", width: 13cm))
// Il teorema di Reidemeister ci dice che se due nodi sono equivalenti a meno di isotopia allora lo sono anche i loro diagrammi a meno di isotopie planari e delle mosse I, II e III.
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 come mostra la seguente figura:
// 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ù forte dell'isotopia ambiente.
#figure(image("assets/move-1-factorization.png", width: 10cm))
// #definition[
// Due nodi o link $K_1, K_2$ si dicono equivalenti a meno di *isotopia regolare* se due loro diagrammi sono equivalenti a meno di isotopie planari e mosse II e III di Reidemeister.
// ]
Quindi i riccioli possono essere spostati liberamente 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 un link in modo che siano tutti vicini.
// #figure(image("assets/ambient-regular-isotopy-difference.jpg", width: 13cm))
Un'altra osservazione sul comportamento dell'isotopia regolare rispetto alle mosse di tipo I è la seguente. Quando abbiamo una coppia di riccioli con segni opposti e su lati opposti abbiamo la seguente proprietà di cancellazione detto _trucco di Whitney_.
// Una prima cosa che possiamo notare è che tutte le mosse R1 possono essere "fattorizzate" in modo da averle tutte raggruppate insieme. #margin-note[Magari aggiungere la dimostrazione di questa cosa]
#figure(image("assets/whitney-trick.png", width: 16cm))
// #todo[
// Altro disegno
// ]
C'è un'osservazione importante da fare quando parliamo di isotopia regolare. Quest'ultima è definita solo quando si parla di diagrammi, quando invece parliamo di isotopia ambiente ha senso parlare dei link sia come diagrammi che come $bb(S)^1$ embedded in $bb(R)^3$.
Questo sarà importante più avanti quando vedremo invarianti come il polinomio $F_K$ che risulteranno essere invarianti per isotopia ambiente. Questi, però, sono definiti attraverso l'isotopia regolare; in particolare il calcolo va fatto fissando un particolare diagramma del link. Ad esempio è tutt'ora un problema aperto dare una definizione di $F_K$ che sia indipendente dalla scelta di un diagramma.
// C'è un'osservazione importante da fare quando parliamo di isotopia regolare. Quest'ultima è definita solo quando si parla di diagrammi di link, quando invece parliamo di isotopia ambiente ha anche senso parlare dei link come circonferenze embedded.
== Writhe
// Più avanti vedremo invarianti di isotopia ambiente come il polinomio $F_K$ che però è definito attraverso l'isotopia regolare, in particolare il calcolo va fatto fissando un particolare diagramma del link. Tutt'ora è un problema aperto dare una definizione di $F_K$ che sia indipendente dalla scelta di un diagramma.
Vediamo ora un primo invariante di isotopia regolare per link orientatati, prima 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 due casi:
$
epsilon(#skein-generic(direction: (+1, +1))) = +1
#h(2em)
epsilon(#skein-generic(direction: (+1, -1))) = -1
$
]
#definition[
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)
$
]
// Questo ci suggerisce un primo invariante di isotopia regolare per link orientatati, per prima cosa introduciamo il segno di un incrocio.
#proposition[
Se $K$ è un nodo, il writhe non dipende dall'orientazione.
]
// #definition[
// Dato un incrocio di un link orientato ci possono essere due casi
#proof[
Basta ricondurci a controllare cosa succede quando applichiamo il cambio dell'orientazione in $epsilon$:
// $
// epsilon(#skein-generic(direction: (+1, +1))) = +1
// #h(2em)
// epsilon(#skein-generic(direction: (+1, -1))) = -1
// $
// ]
$
epsilon(#skein-generic(direction: (-1, -1))) stretch(=) epsilon(#skein-generic(direction: (+1, +1))) = +1 \
epsilon(#skein-generic(direction: (-1, +1))) = epsilon(#skein-generic(direction: (+1, -1))) = -1
$
// #definition[
// Dato $K$ link orientato, il *writhe* $w(K)$ (o numero di avvolgimento) è dato dalla somma dei segni dei suoi crossing
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.
]
// $
// w(K) colon.eq sum_c epsilon(c)
// $
// ]
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).
// #proposition[
// Il writhe non dipende dall'orientazione del link
// ]
#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)$.
]
// #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:
// #todo[
// Esempi di calcolo del writhe
// ]
- 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.
// Un primo fatto generale che possiamo osservare è che dato un invariante di isotopia regolare con certe proprietà, possiamo costruire un invariante di isotopia ambiente aggiungendo un fattore di correzione dato dal writhe.
#figure(image("assets/writhe-move-2.png", width: 4.5cm))
// #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
- Per quanto riguarda la mossa III, il numero di incroci non cambia quindi basta controllare che la somma sia la stessa
// $
// L(#skein.over-twist) = a L(#skein.strand)
// #h(2em)
// L(#skein.under-twist) = a^(-1) L(#skein.strand)
// $
#figure(image("assets/writhe-move-3.png", width: 4.5cm))
// allora $F(K) colon.eq a^(-w(K)) L(K)$ è un invariante di isotopia ambiente.
// ] <prop-ext-ambient-isotopy-inv>
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.
]
= Polinomio di Kauffman
#figure(
image("assets/writhe-examples.png", width: 14cm),
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.
#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
$
L(#skein.over-twist) = a L(#skein.strand)
#h(2em)
L(#skein.under-twist) = a^(-1) L(#skein.strand)
$
allora $F(K) colon.eq a^(-w(K)) L(K)$ è un invariante di isotopia ambiente.
] <prop-ext-ambient-isotopy-inv>
#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.
#todo[
Work in progress
Dunque basta controllare che $F(K)$ sia invariante rispetto alle mosse di tipo I. Per prima cosa osserviamo che
$
w(#skein.over-twist) = w(#skein.strand) + 1
#h(2em)
w(#skein.under-twist) = w(#skein.strand) - 1
$
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) \
$
e segue anche analogamente l'altro ricciolo che $F(#skein.under-twist) = F(#skein.strand)$.
]
= Polinomio di Kauffman
Ora introdurremo il polinomio di Kauffman @Kauffman1990-qe che vedremo essere un invariante di isotopia regolare. Questo polinomio è definito in modo implicito da degli assiomi che utilizzano le relazioni skein, queste relazioni possono essere utilizzate direttamente per calcolare
Vedremo come questi assiomi definiscono un unico invariante di isotopia regolare ben definito e come $kL_K (a, z)$ può essere generalizzato a un invariante di isotopia ambiente $F_K (a, z)$ utilizzando il _writhe_ di un nodo.
== Definizione assiomatica
#todo[
Work in progress
#definition[
Dato $K$ un link non orientato, $kL_K in bb(Z)[a, a^(-1), z, z^(-1)]$, ovvero i polinomi di Laurent sugli interi nelle variabili $a$ e $z$, e verifica i seguenti assiomi:
1. Se $K$, $K'$ sono equivalenti a meno di isotopia regolare, allora $kL_K = kL_K'$.
2. Valgono le seguenti relazioni skein per quaterne di diagrammi identici ovunque tranne che nei punti indicati
- $kL(#skein.over) + kL(#skein.under) = z (kL(#skein.h) + kL(#skein.v))$
- $kL(#skein.unit) = 1$
- $kL(#skein.over-twist) = a kL(#skein.strand)$
- $kL(#skein.under-twist) = a^(-1) kL(#skein.strand)$
]
Come già anticipato in precedenza, vedremo che questo è un invariante di isotopia regolare e può essere generalizzato ad invariante di isotopia ambiente come segue
#definition[
Definiamo $F_K in Z[a, a^(-1), z, z^(-1)]$ per diagrammi orientati $K$ come
$
F_K colon.eq a^(-w(K)) kL_K
$
dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
]
// Vediamo ora la definizione del polinomio di Kauffman.
#proposition[
Il polinomio $F_K (a, z)$ è un invariante di isotopia ambiente
]
// #definition[
// Dato $K$ un link non orientato, $kL_K in bb(Z)[a, a^(-1), z, z^(-1)]$, ovvero i polinomi di Laurent sugli interi nelle variabili $a$ e $z$, e verifica i seguenti assiomi:
#proof[
Segue dalla @prop-ext-ambient-isotopy-inv.
]
// 1. Se $K$, $K'$ sono equivalenti a meno di isotopia regolare, allora $kL_K = kL_K'$.
== Alcune proprietà del polinomio di Kauffman
// 2. Valgono le seguenti relazioni skein per quaterne di diagrammi identici ovunque tranne che nei punti indicati
#lemma[
Sia $K$ un link orientato e $m(K)$ il suo mirror. Allora abbiamo la seguente relazione per $L$
e $F$
// - $kL(#skein.over) + kL(#skein.under) = z (kL(#skein.h) + kL(#skein.v))$
$
L_(m(K)) (a, z) = L_K (1 slash a, z)
#h(2em)
F_(m(K)) (a, z) = F_K (1 slash a, z)
$
// - $kL(#skein.unit) = 1$
]
// - $kL(#skein.over-twist) = a kL(#skein.strand)$
#proof[
$m(K)$ è ottenuto da $K$ scambiando tutti i suoi incroci quindi se analizziamo cosa succede nei vari assiomi solo vicino ad un certo incrocio otteniamo le seguenti relazioni
$
kL(m(#skein.unit)) = kL(#skein.unit) = 1 \
kL(m(#skein.over-twist)) = kL(#skein.under-twist) = a^(-1) kL(#skein.strand) \
kL(m(#skein.under-twist)) = kL(#skein.over-twist) = a kL(#skein.strand)
$
// - $kL(#skein.under-twist) = a^(-1) kL(#skein.strand)$
// ]
ed infine l'ultima relazione rimane invariata per la simmetria del polinomio di Kauffman
// Come già anticipato in precedenza, vedremo che questo è un invariante di isotopia regolare e può essere generalizzato ad invariante di isotopia ambiente come segue
$
kL(m(#skein.over)) + kL(m(#skein.under)) = z (kL(m(#skein.h)) + kL(m(#skein.v))) \
=> kL(#skein.under) + kL(#skein.over) = z (kL(#skein.h) + kL(#skein.v)) \
=> kL(#skein.over) + kL(#skein.under) = z (kL(#skein.h) + kL(#skein.v))
$
// #definition[
// Definiamo $F_K in Z[a, a^(-1), z, z^(-1)]$ per diagrammi orientati $K$ come
// $
// F_K colon.eq a^(-w(K)) kL_K
// $
// dove $L_K$ di un diagramma orientato è definito dimenticando l'orientazione.
// ]
quindi passare al mirror ha l'effetto di scambiare solamente $a$ con $a^(-1)$ ma il resto della valutazione rimane identico.
// #proposition[
// Il polinomio $F_K (a, z)$ è un invariante di isotopia ambiente
// ]
Infine per $F_m(K)$ basta osservare che $w(m(K)) = -w(K)$ per una motivazione analoga.
]
// #proof[
// Segue dalla @prop-ext-ambient-isotopy-inv.
// ]
Prima di passare alla dimostrazione della buona definizione vediamo alcuni esempi di calcolo di $L_K$ in modo "implicito", questo può essere fatto scegliendo accuratamente per quali diagrammi valutare le relazioni skein degli assiomi.
Ad esempio proviamo a ricavare il valore di $delta colon.eq L(#skein.unit#skein.unit)$ #margin-note[Tutte le immagini qua sotto sono temporanee e devo rifarle]
#let knot-picture(src, ..rest) = $thin #image("assets/derived/atlas-" + src, ..rest) thin$
$
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
$
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
// #figure(image("assets/implicit-calc-2.png"))
$
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
$
Ed del nodo trifoglio
// #figure(image("assets/implicit-calc-3.png"))
$
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
$
== Alcune proprietà del polinomio di Kauffman
#definition[
Diremo che un diagramma è _split_ se è l'unione disgiunta di due diagrammi separati, in questo caso scriviamo $K = K_1 union.sq K_2$ dove $K_1$ e $K_2$ sono le due componenti disgiunte.
]
#todo[
Work in progress
]
// #lemma[
// Sia $K$ un link orientato e $m(K)$ il suo mirror. Allora abbiamo la seguente relazione per $L$
// e $F$
// $
// L_(m(K)) (a, z) = L_K (1 slash a, z)
// #h(2em)
// F_(m(K)) (a, z) = F_K (1 slash a, z)
// $
// ]
// #proof[
// $m(K)$ è ottenuto da $K$ scambiando tutti i suoi crossing quindi se analizziamo cosa succede nei vari assiomi solo vicino ad un certo incrocio otteniamo le seguenti relazioni
// $
// kL(m(#skein.unit)) = kL(#skein.unit) = 1 \
// kL(m(#skein.over-twist)) = kL(#skein.under-twist) = a^(-1) kL(#skein.strand) \
// kL(m(#skein.under-twist)) = kL(#skein.over-twist) = a kL(#skein.strand)
// $
// ed infine l'ultima relazione rimane invariata per la simmetria del polinomio di Kauffman
// $
// kL(m(#skein.over)) + kL(m(#skein.under)) = z (kL(m(#skein.h)) + kL(m(#skein.v))) \
// => kL(#skein.under) + kL(#skein.over) = z (kL(#skein.h) + kL(#skein.v)) \
// => kL(#skein.over) + kL(#skein.under) = z (kL(#skein.h) + kL(#skein.v))
// $
// quindi passare al mirror ha l'effetto di scambiare solamente $a$ con $a^(-1)$ ma il resto della valutazione rimane identico.
// Infine per $F_m(K)$ basta osservare che $w(m(K)) = -w(K)$ per una motivazione analoga.
// ]
// Prima di passare alla dimostrazione della buona definizione vediamo alcuni esempi di calcolo di $L_K$ in modo "implicito", questo può essere fatto scegliendo accuratamente per quali diagrammi valutare le relazioni skein degli assiomi.
// Ad esempio proviamo a ricavare il valore di $delta colon.eq L(#skein.unit#skein.unit)$ #margin-note[Tutte le immagini qua sotto sono temporanee e devo rifarle]
// #let knot-picture(src, ..rest) = $thin #image("assets/derived/atlas-" + src, ..rest) thin$
// $
// 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
// $
// 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
// // #figure(image("assets/implicit-calc-2.png"))
// $
// 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
// $
// Ed del nodo trifoglio
// // #figure(image("assets/implicit-calc-3.png"))
// $
// 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
// $
// #definition[
// Diremo che un diagramma è _split_ se è l'unione disgiunta di due diagrammi separati, in questo caso scriviamo $K = K_1 union.sq K_2$ dove $K_1$ e $K_2$ sono le due componenti disgiunte.
// ]
// #definition[
// Un diagramma $K$ è una *somma connessa* se appare come due diagrammi disgiunti connessi da due archi paralleli (a meno di isotopie planari). Tagliando questi due archi e riunendo insieme le estremità dello stesso sotto-diagramma otteniamo un nuovo diagramma split della forma $tilde(K) = K_1 union.sq K_2$, in questo caso chiamiamo la somma connessa $K = K_1 hash K_2$.
// ]
// #proposition[
// Valgono le seguenti relazioni di $L$ ed $F$ per diagrammi split o in somma connessa
// #{
// set align(center)
// grid(
// rows: 2,
// columns: 2,
// column-gutter: 2em,
// row-gutter: 1em,
// $L(K_1 union.sq K_2) = delta L(K_1) L(K_2)$, $F(K_1 union.sq K_2) = delta F(K_1) F(K_2)$,
// $L(K_1 hash K_2) = L(K_1) L(K_2)$, $F(K_1 hash K_2) = F(K_1) F(K_2)$,
// )
// }
// dove $delta = (a + a^(-1)) slash z - 1$ ed è lo stesso coefficiente che abbiamo trovato nell'esempio precedente.
// ]
#definition[
Un diagramma $K$ è una *somma connessa* se appare come due diagrammi disgiunti connessi da due archi paralleli (a meno di isotopie planari). Tagliando questi due archi e riunendo insieme le estremità dello stesso sotto-diagramma otteniamo un nuovo diagramma split della forma $tilde(K) = K_1 union.sq K_2$, in questo caso chiamiamo la somma connessa $K = K_1 hash K_2$.
]
#proposition[
Valgono le seguenti relazioni di $L$ ed $F$ per diagrammi split o in somma connessa
#{
set align(center)
grid(
rows: 2,
columns: 2,
column-gutter: 2em,
row-gutter: 1em,
$L(K_1 union.sq K_2) = delta L(K_1) L(K_2)$, $F(K_1 union.sq K_2) = delta F(K_1) F(K_2)$,
$L(K_1 hash K_2) = L(K_1) L(K_2)$, $F(K_1 hash K_2) = F(K_1) F(K_2)$,
)
}
dove $delta = (a + a^(-1)) slash z - 1$ ed è lo stesso coefficiente che abbiamo trovato nell'esempio precedente.
]
== Dimostrazione Forma Induttiva
#todo[
Work in progress
Prima di passare a descrivere la definizione induttiva diamo alcune definizioni di manipolazioni di un diagramma.
#definition[
Sia $K$ un diagramma, $cal(U)$ la sua ombra planare#footnote[Ovvero per $K subset bb(R)^3$ poniamo $U colon.eq pi(K) subset bb(R)^2$] e $p in cal(U)$ un punto di partenza direzionato in $cal(U)$.
]
// Prima di passare a descrivere la definizione induttiva diamo alcune definizioni di manipolazioni di un diagramma.
- Il suo *nodo (o link) banale standard* associato detto $hat(K)(cal(U), p)$ è definito come segue: si prende il primo 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.
// #definition[
// Sia $K$ un diagramma, $cal(U)$ la sua ombra planare#footnote[Ovvero per $K subset bb(R)^3$ poniamo $U colon.eq pi(K) subset bb(R)^2$] e $p in cal(U)$ un punto di partenza direzionato in $cal(U)$.
// ]
#figure(
image(
"assets/standard-unlink-construction.png",
width: 12cm,
),
caption: [
Un link con tre componenti e punti di partenza direzionati $p_1, p_2, p_3$, poniamo $overline(p) = (p_1, p_2, p_3)$. In $hat(L)(cal(U), overline(p))$ sono evidenziati in #box(radius: 3pt, outset: (y: 3pt), inset: (x: 2pt), fill: rgb("#91cdff"))[azzurro] gli incroci \ scambiati rispetto al link $L$.
],
)
// - Il suo *nodo (o link) banale standard* associato detto $hat(K)(cal(U), p)$ è definito come segue: si prende il primo 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.
// #figure(
// image(
// "assets/standard-unlink-construction.png",
// width: 12cm,
// ),
// caption: [
// Un link con $3$ componenti e punti di partenza direzionati $p_1, p_2, p_3$. In #box(radius: 3pt, outset: (y: 3pt), inset: (x: 2pt), fill: rgb("#91cdff"))[azzurro] sono evidenziati gli incroci che sono cambiati rispetto al link di partenza.
// ],
// )
- Sia $K$ un link, $lambda = (lambda_n, dots, lambda_0)$ una sequenza di etichette di incroci allora poniamo
$
A_i^lambda = E_lambda_i S_lambda_(i-1) dots.c space S_lambda_0
#h(2em)
B_i^lambda = e_lambda_i S_lambda_(i-1) dots.c space S_lambda_0
$
// - Sia $K$ un link, $lambda = (lambda_n, dots, lambda_0)$ una sequenza di etichette di incroci allora poniamo
notiamo che per $i=0$ abbiamo che $A_0^lambda K = E_lambda_0 K$ e $B_0^lambda K = e_lambda_0 K$ che è l'unico caso degenere per questa definizione.
// $
// A_i^lambda = E_lambda_i S_lambda_(i-1) dots.c space S_lambda_0
// #h(2em)
// B_i^lambda = e_lambda_i S_lambda_(i-1) dots.c space S_lambda_0
// $
- #todo[Operazione compatta $sum_K (lambda)$]
// notiamo che per $i=0$ abbiamo che $A_0^lambda K = E_lambda_0 K$ e $B_0^lambda K = e_lambda_0 K$ che è l'unico caso degenere per questa definizione.
L'idea per la definizione induttiva è di considerare dato un nodo o un link $K$ il suo nodo o link discendente standard $hat(K)$. Questo induce una sequenza di indici $lambda$ che indichiamo con $0, dots, n$. Se la applichiamo incrementalmente a $K$ otteniamo le seguenti relazioni
// - #todo[Operazione compatta $sum_K (lambda)$]
$
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 \
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'idea per la definizione induttiva è di considerare dato un nodo o un link $K$ il suo nodo o link discendente standard $hat(K)$. Questo induce una sequenza di indici $lambda$ che indichiamo con $0, dots, n$. Se la applichiamo incrementalmente a $K$ otteniamo le seguenti relazioni
se ora sommiamo e sottraiamo membro a membro otteniamo la seguente identità
// $
// 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 \
// 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))
// $
#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)))$,
),
)
// se ora sommiamo e sottraiamo membro a membro otteniamo la seguente identità
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 + 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 + 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)))$,
),
)
// 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)))$,
// ),
// )
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)
)
$ <kauffman-rec-inductive>
],
),
)
// 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)
// )
// $ <kauffman-rec-inductive>
// ],
// ),
// )
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.
// 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.
Affinché sia sempre possibile raggiungere un nodo in forma di nodo banale standard serve aggiungere la seguente relazione quando $K = K_1 union.sq K_2$ con $K_1$ sovrastante $K_2$.
// Affinché sia sempre possibile raggiungere un nodo in forma di nodo banale standard serve aggiungere la seguente relazione quando $K = K_1 union.sq K_2$ con $K_1$ sovrastante $K_2$.
$
L_(K_1 union.sq K_2) = delta L_(K_1) L_(K_2)
$ <kauffman-rec-overlies>
// $
// L_(K_1 union.sq K_2) = delta L_(K_1) L_(K_2)
// $ <kauffman-rec-overlies>
sempre con $delta = (a + a^(-1)) slash z - 1$.
// sempre con $delta = (a + a^(-1)) slash z - 1$.
// Closed form algorithm
// // Closed form algorithm
#definition(name: [Forma chiusa per $kL_K$])[
Il polinomio $kL_(K)(a,z)$ è definito induttivamente come segue, abbiamo i seguenti casi:
]
// #definition(name: [Forma chiusa per $kL_K$])[
// Il polinomio $kL_(K)(a,z)$ è definito induttivamente come segue, abbiamo i seguenti casi:
// ]
// la definizione è sotto perché gli enumerate non vanno d'accordo con le figure
// // la definizione è sotto perché gli enumerate non vanno d'accordo con le figure
1. Se $K = hat(K)$ è un _nodo banale standard_ allora $kL_K (a, z) colon.eq a^w(K)$
// 1. Se $K = hat(K)$ è un _nodo banale standard_ allora $kL_K (a, z) colon.eq a^w(K)$
2. Se $K_1$ è _sovrastante_ $K_2$, sia $d colon.eq (a + a^(-1)) slash z - 1$ e allora
// 2. Se $K_1$ è _sovrastante_ $K_2$, sia $d colon.eq (a + a^(-1)) slash z - 1$ e allora
$
kL(K_1 union.sq K_2) colon.eq d kL(K_1) kL(K_2)
$
// $
// kL(K_1 union.sq K_2) colon.eq d kL(K_1) kL(K_2)
// $
3. Se $K = K_1 union.sq dotss union.sq K_n$
// 3. Se $K = K_1 union.sq dotss union.sq K_n$
- Se un $K_i$ è _sovrastante_ un'altra componente allora applica (ii).
// - Se un $K_i$ è _sovrastante_ un'altra componente allora applica (ii).
- Se nessun $K_i$ è _sovrastante_ tutti gli altri, siano $p_1, ..., p_n$ dei punti di partenza direzionati su $K_1, ..., K_n$ e sia $overline(p)_i$ lo stesso punto di partenza direzionato con la direzione opposta di $p_i$ su $K_i$. Sia $lambda(p_i)$ la sequenza di scambi di incroci di $K_i$ con $K - K_i$ tale che $hat(K)(lambda(p_i)) = K_i union.sq (K - K_i)$ tale che $K_i$ sia _sovrastante_ il resto delle componenti. A questo punto possiamo definire $kL_K$ come
// - Se nessun $K_i$ è _sovrastante_ tutti gli altri, siano $p_1, ..., p_n$ dei punti di partenza direzionati su $K_1, ..., K_n$ e sia $overline(p)_i$ lo stesso punto di partenza direzionato con la direzione opposta di $p_i$ su $K_i$. Sia $lambda(p_i)$ la sequenza di scambi di incroci di $K_i$ con $K - K_i$ tale che $hat(K)(lambda(p_i)) = K_i union.sq (K - K_i)$ tale che $K_i$ sia _sovrastante_ il resto delle componenti. A questo punto possiamo definire $kL_K$ come
#[
#set text(size: 11pt)
$
kL_K (a, z) colon.eq
1 / (2n) [
sum_(i=1)^n sum_(q=p_i, overline(p)_i) ((-1)^(|lambda(q)|+1) d kL_(K_i) kL_(K - K_i) + z sum_K (lambda(q)))
]
$
]
// #[
// #set text(size: 11pt)
// $
// kL_K (a, z) colon.eq
// 1 / (2n) [
// sum_(i=1)^n sum_(q=p_i, overline(p)_i) ((-1)^(|lambda(q)|+1) d kL_(K_i) kL_(K - K_i) + z sum_K (lambda(q)))
// ]
// $
// ]
- Se $K$ è una singola componente allora sia $p$ un punto di partenza direzionato su $K$ e $overline(p)$ quello con direzione opposta. Sia $lambda(p)$ la sequenza di scambi di incroci che lo porta al nodo banale standard $hat(K)$ e definiamo
// - Se $K$ è una singola componente allora sia $p$ un punto di partenza direzionato su $K$ e $overline(p)$ quello con direzione opposta. Sia $lambda(p)$ la sequenza di scambi di incroci che lo porta al nodo banale standard $hat(K)$ e definiamo
#[
#set text(size: 11pt)
// #[
// #set text(size: 11pt)
$
kL_K (a, z) colon.eq
1 / 2 [
sum_(q = p, overline(p)) ((-1)^(|lambda(q)|+1) kL(hat(K)(lambda(q))) + z sum_K (lambda(q)))
]
$
]
// $
// kL_K (a, z) colon.eq
// 1 / 2 [
// sum_(q = p, overline(p)) ((-1)^(|lambda(q)|+1) kL(hat(K)(lambda(q))) + z sum_K (lambda(q)))
// ]
// $
// ]

@ -40,8 +40,7 @@
author = {Crowell, R.H. and Fox, R.H.},
isbn = {9783540902720},
lccn = {77022776},
series = {Ecological Studies},
url = {https://books.google.it/books?id=_1HvAAAAMAAJ},
series = {Graduate Text in Mathematics},
year = {1977},
publisher = {Springer New York}
}

@ -1,28 +1,31 @@
#import "@preview/cetz:0.3.4"
#let draw-strand(polyline, style: (:)) = {
#let draw-strand(polyline, size-factor: 1.0, style: (:)) = {
import cetz.draw: *
// draw the white outline
set-style(
..cetz.styles.resolve(
(stroke: (paint: white, thickness: 0.75pt * 8, cap: "butt")),
(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: 0.75pt, cap: "round")),
base: (stroke: (paint: black, thickness: size-factor * 0.75pt, cap: "round")),
),
)
polyline
set-style(stroke: (paint: black, thickness: 0.75pt, cap: "round"))
// set-style(stroke: (paint: black, thickness: thickness, cap: "round"))
}
#let skein-canvas = body => cetz.canvas(
length: 0.25cm,
#let skein-canvas = (body, size-factor: 1.0) => cetz.canvas(
length: size-factor * 0.25cm,
padding: 0.25,
{
import cetz.draw: *
@ -48,6 +51,8 @@
}
}
#let small-scale-factor = 0.125cm / 0.25cm
#let skein = (
unit: skein-canvas({
import cetz.draw: *
@ -89,6 +94,45 @@
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)) },
)
},
),
)

@ -215,7 +215,7 @@
title: none,
)
set figure(gap: 17pt)
set figure(gap: 1em)
show figure: set block(above: 1.5em, below: 1.5em)
show figure: it => {
// Customize the figure's caption.
@ -231,7 +231,7 @@
}
// We want a bit of space around tables and images.
show selector.or(table, image): pad.with(x: 23pt)
show selector.or(table, image): pad.with(x: 2em)
// Display the figure's body and caption.
it

Loading…
Cancel
Save