Added Francis' changes.

This commit is contained in:
gheber 2016-03-11 19:05:11 -06:00
parent e00ad50f0f
commit f061513151

View File

@ -8,19 +8,14 @@
"\n",
"## Introduction\n",
"\n",
"One knows that the homology groups of a cartesian product of two spaces $K$ and $L$ may be obtained by considering a chain complex derived from respective chain complexes of $K$ and $L$ by taking their *tensor product*.\n",
"But this is only one of the numerous uses of tensor products of chain complexes in algebraic topology, so the `Kenzo` software provides the handling of such an important tool.\n",
"One knows that the homology groups of a cartesian product of two spaces $K$ and $L$ may be obtained by considering a chain complex derived from respective chain complexes of $K$ and $L$ by taking their *tensor product*. The connection between this tensor product and the chain complex of $K \\times L$ is the *Eilenberg-Zilber reduction*, a central point in *constructive* Algebraic Topology. This reduction is implemented in the `eilenberg-zilber` module of this program.\n",
"\n",
"Let us recall that chain complexes are free $\\mathbb{Z}$-modules with distinguished basis. A tensor product of chain complexes \n",
"is itself a free $\\mathbb{Z}$-module with a natural basis formed by the tensor product of the generators of the chain complex factors. The program conforms to that rule.\n",
"is itself a free $\\mathbb{Z}$-module with a natural basis formed by the tensor products of the generators of the chain complex factors.\n",
"\n",
"## Tensor product of generators and combinations\n",
"\n",
"An elementary tensor product of two generators is represented, in the software, by a structured list in which we may find 4 items for the description of the two generators together with their respective degree. The internal representation of $gnrt1 \\otimes gnrt2$ has the form:\n",
"```commonlisp\n",
"(:tnpr (degr1 . gnrt1) . (degr2 . gnrt2))\n",
"```\n",
"where,\n",
"An elementary tensor product of two generators is represented, in the program, by an object of the structure-class `TNPR`. There are four slots to define such an object:\n",
"1. *degr1* is an integer, the degree of the generator *gnrt1*.\n",
"2. *gnrt1* is the first generator of the pair.\n",
"3. *degr2* is an integer, the degree of the generator *gnrt2*.\n",
@ -34,7 +29,7 @@
"\n",
"\n",
"`(tnpr degr1 gnrt1 degr2 gnrt2)` *[Macro]*\n",
"> Build a tensor product $gnrt1 \\otimes gnrt2$.\n",
"> Build a tensor product $gnrt1 \\otimes gnrt2$, the factors being of respective degree `degr1` and `degr2`.\n",
"\n",
"`(tnpr-p object)` *[Predicate]*\n",
"> Test if *object* is of type `TNPR`.\n",
@ -86,10 +81,24 @@
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"The object is a STRUCTURE-OBJECT of type TNPR.\n",
"0. DEGR1: 1\n",
"1. GNRT1: A\n",
"2. DEGR2: 2\n",
"3. GNRT2: B\n",
"\n",
"> "
]
},
{
"data": {
"text/plain": [
"T"
"NIL"
]
},
"execution_count": 2,
@ -98,7 +107,7 @@
}
],
"source": [
"(tnpr-p *)"
"(inspect *)"
]
},
{
@ -111,7 +120,7 @@
{
"data": {
"text/plain": [
"NIL"
"T"
]
},
"execution_count": 3,
@ -120,7 +129,7 @@
}
],
"source": [
"(tnpr-p (cmbn 0 1 'a 2 'b))"
"(tnpr-p **)"
]
},
{
@ -133,7 +142,7 @@
{
"data": {
"text/plain": [
"T"
"NIL"
]
},
"execution_count": 4,
@ -141,13 +150,35 @@
"output_type": "execute_result"
}
],
"source": [
"(tnpr-p (cmbn 0 1 'a 2 'b))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"T"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(setf *tnpr-with-degrees* t)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"metadata": {
"collapsed": false
},
@ -169,7 +200,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 5,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@ -180,7 +211,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 7,
"metadata": {
"collapsed": false
},
@ -191,7 +222,7 @@
"NIL"
]
},
"execution_count": 6,
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@ -202,7 +233,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 8,
"metadata": {
"collapsed": false
},
@ -224,7 +255,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 7,
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
@ -239,10 +270,10 @@
"source": [
"## Tensor product of chain complexes\n",
"\n",
"The software implements the tensor product of chain complexes according to the classical following definition. Let $C$ and $C'$ two chain complexes. The tensor product $C\\otimes C'$ is the chain complex $D$ such that:\n",
"\n",
"$$D_p=\\bigoplus_{m+n=p}C_m\\otimes C_n',$$\n",
"\n",
"The program implements the tensor product of chain complexes according to the classical following definition. Let $C$ and $C'$ be two chain complexes. The tensor product $C\\otimes C'$ is the chain complex $D$ such that:\n",
"$$\n",
"D_p=\\bigoplus_{m+n=p}C_m\\otimes C_n',\n",
"$$\n",
"$C_m\\otimes C_n'$ being the tensor product of the two modules $C_m$ and $C_n'$. A basis for $D_p$ is the union of the basis of $C_m\\otimes C_n'$, with $m+n=p$.\n",
"\n",
"The boundary operator $d^{\\otimes}$ is defined, according to the Koszul rule, by:\n",
@ -252,7 +283,7 @@
"with $c_m\\in C_m,\\ c_n'\\in C_n'$ and $d$, $d'$ being the respective boundary operators\n",
"of $C$ and $C'$.\n",
"\n",
"In the software, this is realized by the function `tnsr-prdc`. \n",
"In the program, this is realized by the function `tnsr-prdc`. \n",
"\n",
"`(tnsr-prdc chcm1 chcm2)` *[Method]*\n",
"> Build a chain complex, tensor product of the two chain complexes *chcm1* and *chcm2*. The elements\n",
@ -266,7 +297,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 9,
"metadata": {
"collapsed": false
},
@ -285,7 +316,7 @@
"NIL"
]
},
"execution_count": 8,
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
@ -296,7 +327,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 10,
"metadata": {
"collapsed": false
},
@ -307,7 +338,7 @@
"CDELTA"
]
},
"execution_count": 9,
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
@ -338,7 +369,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 11,
"metadata": {
"collapsed": false
},
@ -349,35 +380,13 @@
"[K1 Chain-Complex]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(def triangle (cdelta 2))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"((0 1) (0 2) (1 2))"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(basis triangle 1)"
"(def triangle (cdelta 2))"
]
},
{
@ -390,7 +399,7 @@
{
"data": {
"text/plain": [
"[K3 Chain-Complex]"
"((0 1) (0 2) (1 2))"
]
},
"execution_count": 12,
@ -398,6 +407,28 @@
"output_type": "execute_result"
}
],
"source": [
"(basis triangle 1)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[K3 Chain-Complex]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(def tpr-triangles (tnsr-prdc triangle triangle))"
]
@ -411,7 +442,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 14,
"metadata": {
"collapsed": false
},
@ -422,35 +453,13 @@
"(<TnPr (0) (0)> <TnPr (0) (1)> <TnPr (0) (2)> <TnPr (1) (0)> <TnPr (1) (1)> <TnPr (1) (2)> <TnPr (2) (0)> <TnPr (2) (1)> <TnPr (2) (2)>)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(basis tpr-triangles 0)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(<TnPr (0) (0 1)> <TnPr (0) (0 2)> <TnPr (0) (1 2)> <TnPr (1) (0 1)> <TnPr (1) (0 2)> <TnPr (1) (1 2)> <TnPr (2) (0 1)> <TnPr (2) (0 2)> <TnPr (2) (1 2)> <TnPr (0 1) (0)> ...)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(basis tpr-triangles 1)"
"(basis tpr-triangles 0)"
]
},
{
@ -463,7 +472,7 @@
{
"data": {
"text/plain": [
"(<TnPr (0) (0 1 2)> <TnPr (1) (0 1 2)> <TnPr (2) (0 1 2)> <TnPr (0 1) (0 1)> <TnPr (0 1) (0 2)> <TnPr (0 1) (1 2)> <TnPr (0 2) (0 1)> <TnPr (0 2) (0 2)> <TnPr (0 2) (1 2)> <TnPr (1 2) (0 1)> ...)"
"(<TnPr (0) (0 1)> <TnPr (0) (0 2)> <TnPr (0) (1 2)> <TnPr (1) (0 1)> <TnPr (1) (0 2)> <TnPr (1) (1 2)> <TnPr (2) (0 1)> <TnPr (2) (0 2)> <TnPr (2) (1 2)> <TnPr (0 1) (0)> ...)"
]
},
"execution_count": 15,
@ -472,7 +481,7 @@
}
],
"source": [
"(basis tpr-triangles 2)"
"(basis tpr-triangles 1)"
]
},
{
@ -485,7 +494,7 @@
{
"data": {
"text/plain": [
"(<TnPr (0 1) (0 1 2)> <TnPr (0 2) (0 1 2)> <TnPr (1 2) (0 1 2)> <TnPr (0 1 2) (0 1)> <TnPr (0 1 2) (0 2)> <TnPr (0 1 2) (1 2)>)"
"(<TnPr (0) (0 1 2)> <TnPr (1) (0 1 2)> <TnPr (2) (0 1 2)> <TnPr (0 1) (0 1)> <TnPr (0 1) (0 2)> <TnPr (0 1) (1 2)> <TnPr (0 2) (0 1)> <TnPr (0 2) (0 2)> <TnPr (0 2) (1 2)> <TnPr (1 2) (0 1)> ...)"
]
},
"execution_count": 16,
@ -494,7 +503,7 @@
}
],
"source": [
"(basis tpr-triangles 3)"
"(basis tpr-triangles 2)"
]
},
{
@ -507,7 +516,7 @@
{
"data": {
"text/plain": [
"(<TnPr (0 1 2) (0 1 2)>)"
"(<TnPr (0 1) (0 1 2)> <TnPr (0 2) (0 1 2)> <TnPr (1 2) (0 1 2)> <TnPr (0 1 2) (0 1)> <TnPr (0 1 2) (0 2)> <TnPr (0 1 2) (1 2)>)"
]
},
"execution_count": 17,
@ -515,6 +524,28 @@
"output_type": "execute_result"
}
],
"source": [
"(basis tpr-triangles 3)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(<TnPr (0 1 2) (0 1 2)>)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(basis tpr-triangles 4)"
]
@ -530,7 +561,7 @@
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 19,
"metadata": {
"collapsed": false
},
@ -538,10 +569,10 @@
{
"data": {
"text/plain": [
"#<FUNCTION (LAMBDA (DGR GNR) :IN \"/root/cl-jupyter-master/cl-jupyter.lisp\") {1005ACABBB}>"
"#<FUNCTION (LAMBDA (DGR GNR) :IN \"/root/cl-jupyter-master/cl-jupyter.lisp\") {1005B3B8EB}>"
]
},
"execution_count": 18,
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
@ -555,7 +586,7 @@
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 20,
"metadata": {
"collapsed": false
},
@ -566,7 +597,7 @@
"[K5 Chain-Complex]"
]
},
"execution_count": 19,
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
@ -581,7 +612,7 @@
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": 21,
"metadata": {
"collapsed": false
},
@ -592,7 +623,7 @@
"(30 31 32 33 34 35 36 37 38 39)"
]
},
"execution_count": 20,
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
@ -603,7 +634,7 @@
},
{
"cell_type": "code",
"execution_count": 21,
"execution_count": 22,
"metadata": {
"collapsed": false
},
@ -614,7 +645,7 @@
"[K7 Chain-Complex]"
]
},
"execution_count": 21,
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
@ -625,7 +656,7 @@
},
{
"cell_type": "code",
"execution_count": 22,
"execution_count": 23,
"metadata": {
"collapsed": false
},
@ -641,7 +672,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 22,
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
@ -652,7 +683,7 @@
},
{
"cell_type": "code",
"execution_count": 23,
"execution_count": 24,
"metadata": {
"collapsed": false
},
@ -669,7 +700,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 23,
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
@ -680,7 +711,7 @@
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": 25,
"metadata": {
"collapsed": false
},
@ -704,7 +735,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 24,
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
@ -715,7 +746,7 @@
},
{
"cell_type": "code",
"execution_count": 25,
"execution_count": 26,
"metadata": {
"collapsed": false
},
@ -731,7 +762,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 25,
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
@ -742,7 +773,7 @@
},
{
"cell_type": "code",
"execution_count": 26,
"execution_count": 27,
"metadata": {
"collapsed": false
},
@ -755,7 +786,7 @@
"------------------------------------------------------------------------------\n"
]
},
"execution_count": 26,
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
@ -782,10 +813,7 @@
"The method `tnsr-prdc` already defined for chain complexes, may be also used for that purpose. \n",
"\n",
"`(tnsr-prdc mrph1 mrph2)` *[Method]*\n",
"> Return the morphism, tensor product of the two morphisms *mrph1* and *mrph2*. The source\n",
"and target of this new morphism are respectively the tensor product of the chain complexes source\n",
"and target of *mrph1* and *mrph2*. The degree is the sum of the degrees of the parameters\n",
"and the lisp function (the `:pure` keyword argument of the function `build-mrph`) conforms to the mathematical definition above. The strategy is by generator, i.e. the morphism is designed to work with 2 arguments: a degree and a generator which must be an object of type `TNPR`.\n",
"> Return the morphism, tensor product of the two morphisms *mrph1* and *mrph2*. The source and target of this new morphism are respectively the tensor product of the chain complexes source and target of *mrph1* and *mrph2*. The degree is the sum of the degrees of the parameters and the lisp function (the `:intr` keyword argument of the function `build-mrph`) conforms to the mathematical definition above. The internal strategy is by generator, i.e. the morphism is designed to work with 2 arguments: a degree and a generator which must be an object of type `TNPR`.\n",
"\n",
"`(tnsr-prdc rdct1 rdct2)` *[Method]*\n",
"> Return the reduction, tensor product of the two reductions *rdct1* and *rdct2*. The algorithm consists essentially in defining\n",
@ -794,14 +822,12 @@
"The returned reduction is then built by a call to the method `build-rdct`. This defines completely the chain complexes involved in the reduction.\n",
"\n",
"`(tnsr-prdc hmeq1 hmeq2)` *[Method]*\n",
"> Return the homotopy equivalence, tensor product of the two homotopy equivalence *heqm1* and *heqm2*. \n",
"This is a homotopy equivalence where the new reductions are the tensor products of the arguments reductions (See the lisp definition just below).\n",
"> Return the homotopy equivalence, tensor product of the two homotopy equivalences *heqm1* and *heqm2*. This is a homotopy equivalence where the new reductions are the tensor products of the arguments reductions (See the lisp definition just above).\n",
"\n",
"### Searching homology for tensor products\n",
"\n",
"The comment list of a tensor product of two chain complexes has the form \n",
"`(TNSR-PRDC` *chcm1 chcm2*`)`. The `search-efhm` method applied to a tensor product, looks for the value of the respective `efhm` slots of the chain complexes *chcm1* and *chcm2*, (i.e. two homotopy equivalences) or tries to settle these slots if they are still unbound. Then it builds the tensor product of both homotopy equivalences, as shown in the following lisp listing. At its turn,\n",
"the resulting homotopy equivalence will become the value of the `efhm` slot of the initial tensor product chain complex.\n",
"`(TNSR-PRDC` *chcm1 chcm2*`)`. The `search-efhm` method applied to a tensor product, looks for the value of the respective `efhm` slots of the chain complexes *chcm1* and *chcm2*, (i.e. two homotopy equivalences) or tries to settle these slots if they are still unbound. Then it builds the tensor product of both homotopy equivalences, as shown in the following lisp listing. In turn, the resulting homotopy equivalence will become the value of the `efhm` slot of the initial tensor product chain complex.\n",
"\n",
"```commonlisp\n",
"(defmethod SEARCH-EFHM (chcm (orgn (eql 'tnsr-prdc)))\n",