next | previous | forward | backward | up | top | index | toc | Macaulay2 website
Complexes :: canonicalTruncation(Complex,ZZ,ZZ)

canonicalTruncation(Complex,ZZ,ZZ) -- reducing the number of non-zero terms of a complex

Synopsis

Description

Returns a new complex which drops (sets to zero) all modules outside the given range, and modifies the ends to preserve homology in the given range.

i1 : R = ZZ/101[a,b,c,d,e];
i2 : I = intersect(ideal(a,b),ideal(c,d,e))

o2 = ideal (b*e, a*e, b*d, a*d, b*c, a*c)

o2 : Ideal of R
i3 : C = (dual freeResolution I)[-4]

      1      5      9      6      1
o3 = R  <-- R  <-- R  <-- R  <-- R
                                  
     0      1      2      3      4

o3 : Complex
i4 : C1 = canonicalTruncation(C, 1, 2)

o4 = image {-4} | d c  0 b  0 0  a 0  0 0 | <-- cokernel {-3} | -b a  0  0  0  0 |
           {-4} | e 0  c 0  b 0  0 a  0 0 |              {-3} | 0  0  -b a  0  0 |
           {-4} | 0 -e d 0  0 b  0 0  a 0 |              {-3} | -d 0  c  0  0  0 |
           {-4} | 0 0  0 -e d -c 0 0  0 a |              {-3} | 0  -d 0  c  0  0 |
           {-4} | 0 0  0 0  0 0  e -d c b |              {-3} | 0  0  0  0  -b a |
                                                         {-3} | -e 0  0  0  c  0 |
     1                                                   {-3} | 0  -e 0  0  0  c |
                                                         {-3} | 0  0  -e 0  d  0 |
                                                         {-3} | 0  0  0  -e 0  d |
                                                 
                                                2

o4 : Complex
i5 : assert isWellDefined C1
i6 : HH C1

o6 = subquotient ({-4} | d c  0 b  0 0  a 0  0 0 |, {-4} | d -c -b a 0  0  0  0  0 |) <-- subquotient ({-3} | c b a  0  0  0  0 |, {-3} | -b a  0  0  0  0 |)
                  {-4} | e 0  c 0  b 0  0 a  0 0 |  {-4} | e 0  0  0 -c -b a  0  0 |                   {-3} | d 0 0  b  0  a  0 |  {-3} | 0  0  -b a  0  0 |
                  {-4} | 0 -e d 0  0 b  0 0  a 0 |  {-4} | 0 e  0  0 -d 0  0  -b a |                   {-3} | 0 d 0  -c 0  0  0 |  {-3} | -d 0  c  0  0  0 |
                  {-4} | 0 0  0 -e d -c 0 0  0 a |  {-4} | 0 0  e  0 0  -d 0  c  0 |                   {-3} | 0 0 -d 0  0  c  0 |  {-3} | 0  -d 0  c  0  0 |
                  {-4} | 0 0  0 0  0 0  e -d c b |  {-4} | 0 0  0  e 0  0  -d 0  c |                   {-3} | e 0 0  0  b  0  a |  {-3} | 0  0  0  0  -b a |
                                                                                                       {-3} | 0 e 0  0  -c 0  0 |  {-3} | -e 0  0  0  c  0 |
     1                                                                                                 {-3} | 0 0 -e 0  0  0  c |  {-3} | 0  -e 0  0  0  c |
                                                                                                       {-3} | 0 0 0  e  -d 0  0 |  {-3} | 0  0  -e 0  d  0 |
                                                                                                       {-3} | 0 0 0  0  0  -e d |  {-3} | 0  0  0  -e 0  d |
                                                                                           
                                                                                          2

o6 : Complex
i7 : naiveTruncation(HH C, 1, 2) == HH C1

o7 = true
i8 : prune HH C1

o8 = cokernel {-3} | e d c | <-- cokernel {-2} | b a |
                                  
     1                           2

o8 : Complex

We illustrate various possibilities for the truncation interval.

i9 : C2 = canonicalTruncation(C, 1, 6)

                                                 9      6      1
o9 = image {-4} | d c  0 b  0 0  a 0  0 0 | <-- R  <-- R  <-- R
           {-4} | e 0  c 0  b 0  0 a  0 0 |                    
           {-4} | 0 -e d 0  0 b  0 0  a 0 |     2      3      4
           {-4} | 0 0  0 -e d -c 0 0  0 a |
           {-4} | 0 0  0 0  0 0  e -d c b |
      
     1

o9 : Complex
i10 : assert isWellDefined C2
i11 : C3 = canonicalTruncation(C, 1, infinity)

                                                  9      6      1
o11 = image {-4} | d c  0 b  0 0  a 0  0 0 | <-- R  <-- R  <-- R
            {-4} | e 0  c 0  b 0  0 a  0 0 |                    
            {-4} | 0 -e d 0  0 b  0 0  a 0 |     2      3      4
            {-4} | 0 0  0 -e d -c 0 0  0 a |
            {-4} | 0 0  0 0  0 0  e -d c b |
       
      1

o11 : Complex
i12 : C2 == C3

o12 = true
i13 : C4 = canonicalTruncation(C, -13, 2)

       1      5
o13 = R  <-- R  <-- cokernel {-3} | -b a  0  0  0  0 |
                             {-3} | 0  0  -b a  0  0 |
      0      1               {-3} | -d 0  c  0  0  0 |
                             {-3} | 0  -d 0  c  0  0 |
                             {-3} | 0  0  0  0  -b a |
                             {-3} | -e 0  0  0  c  0 |
                             {-3} | 0  -e 0  0  0  c |
                             {-3} | 0  0  -e 0  d  0 |
                             {-3} | 0  0  0  -e 0  d |
                     
                    2

o13 : Complex
i14 : C5 = canonicalTruncation(C, -infinity, 2)

       1      5
o14 = R  <-- R  <-- cokernel {-3} | -b a  0  0  0  0 |
                             {-3} | 0  0  -b a  0  0 |
      0      1               {-3} | -d 0  c  0  0  0 |
                             {-3} | 0  -d 0  c  0  0 |
                             {-3} | 0  0  0  0  -b a |
                             {-3} | -e 0  0  0  c  0 |
                             {-3} | 0  -e 0  0  0  c |
                             {-3} | 0  0  -e 0  d  0 |
                             {-3} | 0  0  0  -e 0  d |
                     
                    2

o14 : Complex
i15 : C4 == C5

o15 = true
i16 : C6 = canonicalTruncation(C, , 2)

       1      5
o16 = R  <-- R  <-- cokernel {-3} | -b a  0  0  0  0 |
                             {-3} | 0  0  -b a  0  0 |
      0      1               {-3} | -d 0  c  0  0  0 |
                             {-3} | 0  -d 0  c  0  0 |
                             {-3} | 0  0  0  0  -b a |
                             {-3} | -e 0  0  0  c  0 |
                             {-3} | 0  -e 0  0  0  c |
                             {-3} | 0  0  -e 0  d  0 |
                             {-3} | 0  0  0  -e 0  d |
                     
                    2

o16 : Complex
i17 : C4 == C6

o17 = true

If the lower and upper bounds are equal in the canonical truncation, the resulting complex has a single nonzero term consisting of the homology in that location.

i18 : assert(canonicalTruncation(C, 1, 1) == naiveTruncation(HH C, 1, 1))

If we truncate only from below, then we get an injection from the truncation into the original complex, whereas if we truncate only from above, we get a surjection onto the truncated complex.

i19 : f = inducedMap(C, C3)

           5
o19 = 1 : R  <------------------------------------ image {-4} | d c  0 b  0 0  a 0  0 0 | : 1
                {-4} | d c  0 b  0 0  a 0  0 0 |         {-4} | e 0  c 0  b 0  0 a  0 0 |
                {-4} | e 0  c 0  b 0  0 a  0 0 |         {-4} | 0 -e d 0  0 b  0 0  a 0 |
                {-4} | 0 -e d 0  0 b  0 0  a 0 |         {-4} | 0 0  0 -e d -c 0 0  0 a |
                {-4} | 0 0  0 -e d -c 0 0  0 a |         {-4} | 0 0  0 0  0 0  e -d c b |
                {-4} | 0 0  0 0  0 0  e -d c b |

           9                                  9
      2 : R  <------------------------------ R  : 2
                {-3} | 1 0 0 0 0 0 0 0 0 |
                {-3} | 0 1 0 0 0 0 0 0 0 |
                {-3} | 0 0 1 0 0 0 0 0 0 |
                {-3} | 0 0 0 1 0 0 0 0 0 |
                {-3} | 0 0 0 0 1 0 0 0 0 |
                {-3} | 0 0 0 0 0 1 0 0 0 |
                {-3} | 0 0 0 0 0 0 1 0 0 |
                {-3} | 0 0 0 0 0 0 0 1 0 |
                {-3} | 0 0 0 0 0 0 0 0 1 |

           6                            6
      3 : R  <------------------------ R  : 3
                {-2} | 1 0 0 0 0 0 |
                {-2} | 0 1 0 0 0 0 |
                {-2} | 0 0 1 0 0 0 |
                {-2} | 0 0 0 1 0 0 |
                {-2} | 0 0 0 0 1 0 |
                {-2} | 0 0 0 0 0 1 |

           1             1
      4 : R  <--------- R  : 4
                | 1 |

o19 : ComplexMap
i20 : assert isWellDefined f
i21 : assert(ker f == 0)
i22 : prune coker f

       1
o22 = R  <-- cokernel {-4} | d c  0 b  0 0  a 0  0 0 |
                      {-4} | e 0  c 0  b 0  0 a  0 0 |
      0               {-4} | 0 -e d 0  0 b  0 0  a 0 |
                      {-4} | 0 0  0 -e d -c 0 0  0 a |
                      {-4} | 0 0  0 0  0 0  e -d c b |
              
             1

o22 : Complex
i23 : C7 = canonicalTruncation(C, -infinity, 1)

       1
o23 = R  <-- cokernel {-4} | d -c -b a 0  0  0  0  0 |
                      {-4} | e 0  0  0 -c -b a  0  0 |
      0               {-4} | 0 e  0  0 -d 0  0  -b a |
                      {-4} | 0 0  e  0 0  -d 0  c  0 |
                      {-4} | 0 0  0  e 0  0  -d 0  c |
              
             1

o23 : Complex
i24 : C7 != coker f

o24 = true
i25 : g = inducedMap(C5, C)

           1                  1
o25 = 0 : R  <-------------- R  : 0
                {-5} | 1 |

           5                          5
      1 : R  <---------------------- R  : 1
                {-4} | 1 0 0 0 0 |
                {-4} | 0 1 0 0 0 |
                {-4} | 0 0 1 0 0 |
                {-4} | 0 0 0 1 0 |
                {-4} | 0 0 0 0 1 |

                                                                              9
      2 : cokernel {-3} | -b a  0  0  0  0 | <------------------------------ R  : 2
                   {-3} | 0  0  -b a  0  0 |    {-3} | 1 0 0 0 0 0 0 0 0 |
                   {-3} | -d 0  c  0  0  0 |    {-3} | 0 1 0 0 0 0 0 0 0 |
                   {-3} | 0  -d 0  c  0  0 |    {-3} | 0 0 1 0 0 0 0 0 0 |
                   {-3} | 0  0  0  0  -b a |    {-3} | 0 0 0 1 0 0 0 0 0 |
                   {-3} | -e 0  0  0  c  0 |    {-3} | 0 0 0 0 1 0 0 0 0 |
                   {-3} | 0  -e 0  0  0  c |    {-3} | 0 0 0 0 0 1 0 0 0 |
                   {-3} | 0  0  -e 0  d  0 |    {-3} | 0 0 0 0 0 0 1 0 0 |
                   {-3} | 0  0  0  -e 0  d |    {-3} | 0 0 0 0 0 0 0 1 0 |
                                                {-3} | 0 0 0 0 0 0 0 0 1 |

o25 : ComplexMap
i26 : assert isWellDefined g
i27 : assert(coker g == 0)
i28 : C8 = canonicalTruncation(C, 2, infinity)

                                            6      1
o28 = image {-3} | c b a  0  0  0  0 | <-- R  <-- R
            {-3} | d 0 0  b  0  a  0 |             
            {-3} | 0 d 0  -c 0  0  0 |     3      4
            {-3} | 0 0 -d 0  0  c  0 |
            {-3} | e 0 0  0  b  0  a |
            {-3} | 0 e 0  0  -c 0  0 |
            {-3} | 0 0 -e 0  0  0  c |
            {-3} | 0 0 0  e  -d 0  0 |
            {-3} | 0 0 0  0  0  -e d |
       
      2

o28 : Complex
i29 : prune C8

                                   6      1
o29 = cokernel {-2} | b  a  | <-- R  <-- R
               {-2} | -c 0  |             
               {-2} | 0  -c |     3      4
               {-2} | -d 0  |
               {-2} | -e 0  |
               {-2} | 0  -d |
               {-2} | 0  -e |
       
      2

o29 : Complex
i30 : prune ker g

                                 6      1
o30 = cokernel {-2} | ac  | <-- R  <-- R
               {-2} | -bc |             
               {-2} | ad  |     3      4
               {-2} | ae  |
               {-2} | -bd |
               {-2} | -be |
       
      2

o30 : Complex

There is another type of truncation, naiveTruncation, which yields a short exact sequence of complexes.

See also