  
  [1X5 [33X[0;0YTopological data analysis[133X[101X
  
  
  [1X5.1 [33X[0;0YPersistent homology[133X[101X
  
  [33X[0;0YPairwise  distances  between  [22X74[122X  points  from  some  metric space have been
  recorded  and  stored  in a [22X74× 74[122X matrix [22XD[122X. The following commands load the
  matrix,  construct a filtration of length [22X100[122X on the first two dimensions of
  the  assotiated clique complex (also known as the [13XRips Complex[113X), and display
  the  resulting  degree [22X0[122X persistent homology as a barcode. A single bar with
  label [22Xn[122X denotes [22Xn[122X bars with common starting point and common end point.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xfile:=HapFile("data253a.txt");;[127X[104X
    [4X[25Xgap>[125X [27XRead(file);[127X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XG:=SymmetricMatrixToFilteredGraph(D,100);[127X[104X
    [4X[28XFiltered graph on 74 vertices.[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XK:=FilteredRegularCWComplex(CliqueComplex(G,2));[127X[104X
    [4X[28XFiltered regular CW-complex of dimension 2[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XP:=PersistentBettiNumbers(K,0);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe  next  commands  display the resulting degree [22X1[122X persistent homology as a
  barcode.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XP:=PersistentBettiNumbers(K,1);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe  following  command  displays  the  [22X1[122X skeleton of the simplicial complex
  arizing as the [22X65[122X-th term in the filtration on the clique complex.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XY:=FiltrationTerm(K,65);[127X[104X
    [4X[28XRegular CW-complex of dimension 1[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XDisplay(HomotopyGraph(Y));[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThese  computations  suuggest  that the dataset contains two persistent path
  components  (or  clusters),  and  that  each path component is in some sense
  periodic. The final command displays one possible representation of the data
  as points on two circles.[133X
  
  
  [1X5.1-1 [33X[0;0YBackground to the data[133X[101X
  
  [33X[0;0YEach  point  in the dataset was an image consisting of [22X732× 761[122X pixels. This
  point  was  regarded  as  a  vector  in  [22XR^732×  761[122X  and  the  matrix [22XD[122X was
  constructed using the Euclidean metric. The images were the following:[133X
  
  
  [1X5.2 [33X[0;0YMapper clustering[133X[101X
  
  [33X[0;0YThe  following  example  reads in a set [22XS[122X of vectors of rational numbers. It
  uses  the  Euclidean  distance  [22Xd(u,v)[122X between vectors. It fixes some vector
  $u_0\in S$ and uses the associated function [22Xf: D→ [0,b] ⊂ R, v↦ d(u_0,v)[122X. In
  addition,  it  uses  an  open  cover of the interval [22X[0,b][122X consisting of [22X100[122X
  uniformly  distributed overlapping open subintervals of radius [22Xr=29[122X. It also
  uses a simple clustering algorithm implemented in the function [10Xcluster[110X.[133X
  
  [33X[0;0YThese  ingredients are input into the Mapper clustering procedure to produce
  a simplicial complex [22XM[122X which is intended to be a representation of the data.
  The  complex [22XM[122X is [22X1[122X-dimensional and the final command uses GraphViz software
  to  visualize  the graph. The nodes of this simplicial complex are "buckets"
  containing  data  points.  A  data  point may reside in several buckets. The
  number  of  points  in the bucket determines the size of the node. Two nodes
  are  connected  by  an  edge  when their end-point nodes contain common data
  points.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xfile:=HapFile("data134.txt");;[127X[104X
    [4X[25Xgap>[125X [27XRead(file);[127X[104X
    [4X[25Xgap>[125X [27Xdx:=EuclideanApproximatedMetric;;[127X[104X
    [4X[25Xgap>[125X [27Xdz:=EuclideanApproximatedMetric;;[127X[104X
    [4X[25Xgap>[125X [27XL:=List(S,x->Maximum(List(S,y->dx(x,y))));;[127X[104X
    [4X[25Xgap>[125X [27Xn:=Position(L,Minimum(L));;[127X[104X
    [4X[25Xgap>[125X [27Xf:=function(x); return [dx(S[n],x)]; end;;[127X[104X
    [4X[25Xgap>[125X [27XP:=30*[0..100];; P:=List(P, i->[i]);;[127X[104X
    [4X[25Xgap>[125X [27Xr:=29;;[127X[104X
    [4X[25Xgap>[125X [27Xepsilon:=75;;[127X[104X
    [4X[25Xgap>[125X [27X cluster:=function(S)[127X[104X
    [4X[25X>[125X [27X  local Y, P, C;[127X[104X
    [4X[25X>[125X [27X  if Length(S)=0 then return S; fi;[127X[104X
    [4X[25X>[125X [27X  Y:=VectorsToOneSkeleton(S,epsilon,dx);[127X[104X
    [4X[25X>[125X [27X  P:=PiZero(Y);[127X[104X
    [4X[25X>[125X [27X  C:=Classify([1..Length(S)],P[2]);[127X[104X
    [4X[25X>[125X [27X  return List(C,x->S{x});[127X[104X
    [4X[25X>[125X [27X end;;[127X[104X
    [4X[25Xgap>[125X [27XM:=Mapper(S,dx,f,dz,P,r,cluster);[127X[104X
    [4X[28XSimplicial complex of dimension 1.[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XDisplay(GraphOfSimplicialComplex(M));[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  
  [1X5.2-1 [33X[0;0YBackground to the data[133X[101X
  
  [33X[0;0YThe  datacloud  [22XS[122X  consists  of  the  [22X400[122X  points  in the plane shown in the
  following picture.[133X
  
  
  [1X5.3 [33X[0;0YDigital image analysis and persistent homology[133X[101X
  
  [33X[0;0YThe  following  example  reads in a digital image as a filtered pure cubical
  complexex.  The  filtration  is  obtained  by  thresholding at a sequence of
  uniformly  spaced  values on the greyscale range. The persistent homology of
  this  filtered complex is calculated in degrees [22X0[122X and [22X1[122X and displayed as two
  barcodes.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xfile:=HapFile("image1.3.2.png");;[127X[104X
    [4X[25Xgap>[125X [27XF:=ReadImageAsFilteredPureCubicalComplex(file,20);[127X[104X
    [4X[28XFiltered pure cubical complex of dimension 2.[128X[104X
    [4X[25Xgap>[125X [27XP:=PersistentBettiNumbers(F,0);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XP:=PersistentBettiNumbers(F,1);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe [22X20[122X persistent bars in the degree [22X0[122X barcode suggest that the image has [22X20[122X
  objects.  The  degree  [22X1[122X  barcode suggests that [22X14[122X (or possibly [22X17[122X) of these
  objects have holes in them.[133X
  
  
  [1X5.3-1 [33X[0;0YNaive example of image segmentation by automatic thresholding[133X[101X
  
  [33X[0;0YAssuming that short bars and isolated points in the barcodes represent noise
  while  long  bars represent essential features, a "noiseless" representation
  of  the image should correspond to a term in the filtration corresponding to
  a  column  in  the  barcode incident with all long bars but incident with no
  short  bars  or isolated points. The following commands confirm that the 4th
  term  in  the  filtration  is  such a term and display this term as a binary
  image.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XY:=FiltrationTerm(F,4);            [127X[104X
    [4X[28XPure cubical complex of dimension 2.[128X[104X
    [4X[25Xgap>[125X [27XBettiNumber(Y,0);[127X[104X
    [4X[28X20[128X[104X
    [4X[25Xgap>[125X [27XBettiNumber(Y,1);[127X[104X
    [4X[28X14[128X[104X
    [4X[25Xgap>[125X [27XDisplay(Y);[127X[104X
    [4X[28X[128X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  
  [1X5.3-2 [33X[0;0YBackground to the data[133X[101X
  
  [33X[0;0YThe following image was used in the example.[133X
  
  
  [1X5.4 [33X[0;0YA second example of digital image segmentation[133X[101X
  
  [33X[0;0YIn order to automatically count the number of coins in this picture[133X
  
  [33X[0;0Ywe  can  load  the  image as a filtered pure cubical complex [22XF[122X of filtration
  length  30  say,  and  observe  the  degree zero persistent Betti numbers to
  establish  that the 21-st term or so of [22XF[122X seems to be 'noise free' in degree
  zero.  We can then set [22XM[122X equal to the 21-st term of [22XF[122X and thicken [22XM[122X a couple
  of times say to remove any tiny holes it may have. We can then construct the
  complement  [22XC[122X  of  [22XM[122X.  Then  we  can  construct a 'neighbourhood thickening'
  filtration  [22XT[122X  of  [22XC[122X  with  say  [22X50[122X  consecutive thickenings. The degree one
  persistent  barcode  for  [22XT[122X  has  [22X24[122X long bars, suggesting that the original
  picture consists of [22X24[122X coins.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XF:=ReadImageAsFilteredPureCubicalComplex("my_coins.png",30);;[127X[104X
    [4X[25Xgap>[125X [27XM:=FiltrationTerm(F,21);;  #Chosen after viewing degree 0 barcode for F[127X[104X
    [4X[25Xgap>[125X [27XM:=PureComplexThickened(M);;[127X[104X
    [4X[25Xgap>[125X [27XM:=PureComplexThickened(M);;[127X[104X
    [4X[25Xgap>[125X [27XC:=PureComplexComplement(M);;[127X[104X
    [4X[25Xgap>[125X [27XT:=ThickeningFiltration(C,50);;[127X[104X
    [4X[25Xgap>[125X [27XP:=PersistentBettiNumbers(T,1);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe pure cubical complex [22XM[122X has the correct number of path components, namely
  [22X25[122X,  but  its  path  components  are very much subsets of the regions in the
  image  corresponding  to  coins.  The complex [22XM[122X can be thickened repeatedly,
  subject to no two path components being allowed to merge, in order to obtain
  a  more realistic image segmentation with path components corresponding more
  closely  to coins. This is done in the follow commands which use a makeshift
  function [10XBasins(L)[110X available here ([7Xtutex/basins.g[107X). The commands essentially
  implement  the  standard watershed segmentation algorithm but do so by using
  the language of filtered pure cubical complexes.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XW:=PureComplexComplement(FiltrationTerm(T,25));;[127X[104X
    [4X[25Xgap>[125X [27XL:=[];;[127X[104X
    [4X[25Xgap>[125X [27Xfor i in [1..PathComponentOfPureComplex(W,0)] do[127X[104X
    [4X[25Xgap>[125X [27XP:=PathComponentOfPureComplex(W,i);;[127X[104X
    [4X[25Xgap>[125X [27XQ:=ThickeningFiltration(P,50,M);;[127X[104X
    [4X[25Xgap>[125X [27XAdd(L,Q);;[127X[104X
    [4X[25Xgap>[125X [27Xod;;[127X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XB:=Basins(L);[127X[104X
    [4X[25Xgap>[125X [27XDisplay(B);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  
  [1X5.5 [33X[0;0YAlternative approaches to computing persistent homology[133X[101X
  
  [33X[0;0YFrom any sequence [22XX_0 ⊂ X_1 ⊂ X_2 ⊂ ⋯ ⊂ X_T[122X of cellular spaces (such as pure
  cubical complexes, or cubical complexes, or simplicial complexes, or regular
  CW  complexes) we can construct a filtered chain complex [22XC_∗ X_0 ⊂ C_∗ X_1 ⊂
  C_∗  X_2  ⊂  ⋯ C_∗ X_T[122X. The induced homology homomorphisms [22XH_n(C_∗ X_0, F) →
  H_n(C_∗ X_1, F) → H_n(C_∗ X_2, F) → ⋯ → H_n(C_∗ X_T, F)[122X with coefficients in
  a  field [22XF[122X can be computed by applying an appropriate sequence of elementary
  row operations to the boundary matrices in the chain complex [22XC_∗ X_T⊗ F[122X; the
  boundary  matrices  are  sparse  and  are  best represented as such; the row
  operations  need  to  be  applied in a fashion that respects the filtration.
  This method is used in the above examples of persistent homology. The method
  is not practical when the number of cells in [22XX_T[122X is large.[133X
  
  [33X[0;0YAn  alternative approach is to construct an admissible discrete vector field
  on  each  term  [22XX_k[122X  in  the  filtration.  For  each vector field there is a
  non-regular  CW-complex  [22XY_k[122X whose cells correspond to the critical cells in
  [22XX_k[122X  and  for which there is a homotopy equivalence [22XX_k≃ Y_k[122X. For each [22Xk[122X the
  composite  homomorphism [22XH_n(C_∗ Y_k, F) stackrel≅→ H_n(C_∗ X_k, F) → H_n(C_∗
  X_k+1,  F)  stackrel≅→  H_n(C_∗ Y_k+1, F)[122X can be computed and the persistent
  homology  can  be  derived from these homology homomorphisms. This method is
  implemented  in the function [10XPersistentBettiNUmbersAlt(X,n,p)[110X where [22Xp[122X is the
  characteristic  of  the  field,  [22Xn[122X  is  the  homology degree, and [22XX[122X can be a
  filtered  pure  cubical  complex,  or  a  filtered  simplicial complex, or a
  filtered regular CW complex, or indeed a filtered chain complex (represented
  in    sparse    form).    This    function    incorporates   the   functions
  [10XContractedFilteredPureCubicalComplex(X)[110X                                  and
  [10XContractedFilteredRegularComplex(X)[110X which respectively input a filtered pure
  cubical  complex  and  filtered  regular  CW-complex  and  return a filtered
  complex of the same data type in which each term of the output filtration is
  a deformation retract of the corresponding term in the input filtration.[133X
  
  [33X[0;0YIn  this approach the vector fields on the various spaces [22XX_k[122X are completely
  independent  and so the method lends itself to a degree of easy parallelism.
  This is not incorporated into the current implementation.[133X
  
  [33X[0;0YAs  an  illustration  we  consider a synthetic data set [22XS[122X consisting of [22X3527[122X
  points  sampled, with errors, from an `unknown' manifold [22XM[122X in [22XR^3[122X. From such
  a  data set one can associate a [22X3[122X-dimensional cubical complex [22XX_0[122X consisting
  of  one unit cube centred on each (suitably scaled) data point. Given a pure
  cubical  complex  [22XX_s[122X  we  construct  [22XX_s+1  =X_s ∪ {overline e^3_λ}_λ∈ Λ[122X by
  adding  to  [22XX_s[122X  each closed unit cube [22Xoverline e^3_λ[122X in [22XR^3[122X that intersects
  non-trivially  with  [22XX_s[122X.  We  construct  the  filtered  cubical complex [22XX_∗
  ={X_i}_0≤  i≤ 19[122X and compute the persistence matrices [22Xβ_d^∗∗[122X for [22Xd=0,1,2[122X and
  for   [22XZ_2[122X  coefficients.  The  filtered  complex  [22XX_∗[122X  is  quite  large.  In
  particular,  the  final  space  [22XX_19[122X  in  the  filtration  involves  [22X1092727[122X
  vertices,  [22X3246354[122X  edges, [22X3214836[122X faces of dimension [22X2[122X and [22X1061208[122X faces of
  dimension  [22X3[122X.  The  usual  matrix reduction approach to computing persistent
  Betti  numbers would involve an appropriate row reduction of sparse matrices
  one of which has over 3 million rows and 3 million columns.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xfile:=HapFile("data247.txt");;[127X[104X
    [4X[25Xgap>[125X [27XRead(file);;[127X[104X
    [4X[25Xgap>[125X [27XF:=ThickeningFiltration(T,20);;[127X[104X
    [4X[25Xgap>[125X [27XP2:=PersistentBettiNumbersAlt(F,2);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P2);[127X[104X
    [4X[25Xgap>[125X [27XP1:=PersistentBettiNumbersAlt(F,1);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P1);[127X[104X
    [4X[25Xgap>[125X [27XP0:=PersistentBettiNumbersAlt(F,0);;[127X[104X
    [4X[25Xgap>[125X [27XBarCodeCompactDisplay(P0);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe  barcodes  suggest  that  the data points might have been sampled from a
  manifold with the homotopy type of a torus.[133X
  
  
  [1X5.5-1 [33X[0;0YNon-trivial cup product[133X[101X
  
  [33X[0;0YOf  course,  a  wedge  [22XS^2∨ S^1∨ S^1[122X has the same homology as the torus [22XS^1×
  S^1[122X.  By establishing that a 'noise free' model for our data points, say the
  10-th  term  [22XX_10[122X  in  the  filtration,  has  a  non-trivial  cup product [22X∪:
  H^1(X_10, Z) × H^1(X_10, Z) → H^2(X_10, Z)[122X we can eliminate [22XS^2∨ S^1∨ S^1[122X as
  a candidate from which the data was sampled.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XX10:=RegularCWComplex(FiltrationTerm(F,10));;[127X[104X
    [4X[25Xgap>[125X [27Xcup:=LowDimensionalCupProduct(X10);;[127X[104X
    [4X[25Xgap>[125X [27Xcup([1,0],[0,1]);[127X[104X
    [4X[28X[ 1 ][128X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  
  [1X5.6 [33X[0;0YRandom simplicial complexes[133X[101X
  
  [33X[0;0YFor  a  positive  integer  [22Xn[122X  and  probability  [22Xp[122X  we  denote  by [22XY(n,p)[122X the
  [13XLinial-Meshulam  random simplicial 2-complex[113X. Its [22X1[122X-skeleton is the complete
  graph  on [22Xn[122X vertices; each possible [22X2[122X-simplex is included independently with
  probability [22Xp[122X.[133X
  
  [33X[0;0YThe  following  commands  first compute the number [22Xh_i[122X of non-trivial cyclic
  summands  in  [22XH_i(Y(100,p),  Z)[122X for a range of probabilities [22Xp[122X and [22Xi=1,2[122X and
  then  produce  a  plot of [22Xh_i[122X versus [22Xp[122X. The plot for [22Xh_1[122X is red and the plot
  for  [22Xh_2[122X  is blue. A plot for the Euler characteristic [22X1-h_1+h_2[122X is shown in
  green.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XL:=[];;M:=[];;[127X[104X
    [4X[25Xgap>[125X [27Xfor p in [1..100] do[127X[104X
    [4X[25X>[125X [27XK:=RegularCWComplex(RandomSimplicialTwoComplex(100,p/1000));;[127X[104X
    [4X[25X>[125X [27Xh1:=Length(Homology(K,1));;[127X[104X
    [4X[25X>[125X [27Xh2:=Length(Homology(K,2));;[127X[104X
    [4X[25X>[125X [27XAdd(L, [1.0*(p/1000),h1,"red"]);[127X[104X
    [4X[25X>[125X [27XAdd(L, [1.0*(p/1000),h2,"blue"]);[127X[104X
    [4X[25X>[125X [27XAdd(M, [1.0*(p/1000),1-h1+h2,"green"]);[127X[104X
    [4X[25X>[125X [27Xod;[127X[104X
    [4X[25Xgap>[125X [27XScatterPlot(L);[127X[104X
    [4X[25Xgap>[125X [27XScatterPlot(M);[127X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
  [33X[0;0YFrom  this  plot  it  seems that there is a [13Xphase change threshold[113X at around
  [22Xp=0.025[122X.  An  inspection of the first homology groups [22XH_1(Y(100,p), Z)[122X shows
  that  in  most cases there is no torsion. However, around the threshold some
  of the complexes do have torsion in their first homology.[133X
  
  [33X[0;0YSimilar commands for [22XY(75,p)[122X suggest a phase transition at around [22Xp=0.035[122X in
  this  case.  The  following  commands compute [22XH_1(Y(75,p), Z)[122X for [22X900[122X random
  [22X2[122X-complexes  with [22Xp[122X in a small interval around [22X0.035[122X and, in each case where
  there  is  torsion, the torsion coefficients are stored in a list. The final
  command  prints  these  lists  --  all but one of which are of length [22X1[122X. For
  example,  there is one [22X2[122X-dimensional simplicial complex on [22X75[122X vertices whose
  first  homology contains the summand [22XZ_107879661870516800665161182578823128[122X.
  The  largest  prime  factor  is  [22X80555235907994145009690263[122X  occuring in the
  summand [22XZ_259837760616287294231081766978855[122X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xtorsion:=function(n,p)[127X[104X
    [4X[25X>[125X [27Xlocal H, Y;[127X[104X
    [4X[25X>[125X [27XY:=RegularCWComplex(RandomSimplicialTwoComplex(n,p));[127X[104X
    [4X[25X>[125X [27XH:=Homology(Y,1);[127X[104X
    [4X[25X>[125X [27XH:=Filtered(H,x->not x=0);[127X[104X
    [4X[25X>[125X [27Xreturn H;[127X[104X
    [4X[25X>[125X [27Xend;[127X[104X
    [4X[28Xfunction( n, p ) ... end[128X[104X
    [4X[28X[128X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XL:=[];;for n in [73000..73900] do[127X[104X
    [4X[25X>[125X [27Xt:=torsion(75,n/2000000);  [127X[104X
    [4X[25X>[125X [27Xif not t=[] then Add(L,t); fi;[127X[104X
    [4X[25X>[125X [27Xod;[127X[104X
    [4X[28X[128X[104X
    [4X[25Xgap>[125X [27XDisplay(L);[127X[104X
    [4X[28X[ [                                     2 ],[128X[104X
    [4X[28X  [                                    26 ],[128X[104X
    [4X[28X  [     259837760616287294231081766978855 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [                                     3 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [          2761642698060127444812143568 ],[128X[104X
    [4X[28X  [       2626355281010974663776273381976 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [                                     3 ],[128X[104X
    [4X[28X  [         33112382751264894819430785350 ],[128X[104X
    [4X[28X  [                                    16 ],[128X[104X
    [4X[28X  [                                     4 ],[128X[104X
    [4X[28X  [                                     3 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [                                     3 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [      85234949999183888967763100590977 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [      24644196130785821107897718662022 ],[128X[104X
    [4X[28X  [                                     2,                                     2 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [           416641662889025645492982468 ],[128X[104X
    [4X[28X  [         41582773001875039168786970816 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [            75889883165411088431747730 ],[128X[104X
    [4X[28X  [         33523474091636554792305315165 ],[128X[104X
    [4X[28X  [  107879661870516800665161182578823128 ],[128X[104X
    [4X[28X  [          5588265814409119568341729980 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [          5001457249224115878015053458 ],[128X[104X
    [4X[28X  [                                    10 ],[128X[104X
    [4X[28X  [                                    12 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [                                     2 ],[128X[104X
    [4X[28X  [                                     3 ],[128X[104X
    [4X[28X  [          7757870243425246987971789322 ],[128X[104X
    [4X[28X  [       8164648856993269673396613497412 ],[128X[104X
    [4X[28X  [                                     2 ] ][128X[104X
    [4X[28X[128X[104X
  [4X[32X[104X
  
