github.com/mjschust/cblocks@v0.2.0/bundle_test.go (about)

     1  package cblocks
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/mjschust/cblocks/lie"
     8  )
     9  
    10  func TestSymmetricL1Rank(t *testing.T) {
    11  	cases := []struct {
    12  		rtsys lie.RootSystem
    13  		wt    lie.Weight
    14  		ell   int
    15  		n     int
    16  		want  *big.Int
    17  	}{
    18  		// n=3
    19  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 1, 3, big.NewInt(1)},
    20  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 1, 3, big.NewInt(0)},
    21  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 1, 3, big.NewInt(1)},
    22  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 1, 3, big.NewInt(1)},
    23  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 1, 3, big.NewInt(1)},
    24  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 1, 3, big.NewInt(1)},
    25  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 1, 3, big.NewInt(0)},
    26  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 1, 3, big.NewInt(0)},
    27  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 1, 3, big.NewInt(0)},
    28  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 0, 0}, 1, 3, big.NewInt(1)},
    29  		{lie.NewTypeARootSystem(4), lie.Weight{1, 0, 0, 0}, 1, 3, big.NewInt(0)},
    30  		{lie.NewTypeARootSystem(4), lie.Weight{0, 1, 0, 0}, 1, 3, big.NewInt(0)},
    31  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 1, 0}, 1, 3, big.NewInt(0)},
    32  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 0, 1}, 1, 3, big.NewInt(0)},
    33  
    34  		// n=4
    35  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 1, 4, big.NewInt(1)},
    36  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 1, 4, big.NewInt(1)},
    37  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 1, 4, big.NewInt(1)},
    38  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 1, 4, big.NewInt(0)},
    39  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 1, 4, big.NewInt(0)},
    40  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 1, 4, big.NewInt(1)},
    41  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 1, 4, big.NewInt(1)},
    42  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 1, 4, big.NewInt(1)},
    43  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 1, 4, big.NewInt(1)},
    44  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 0, 0}, 1, 4, big.NewInt(1)},
    45  		{lie.NewTypeARootSystem(4), lie.Weight{1, 0, 0, 0}, 1, 4, big.NewInt(0)},
    46  		{lie.NewTypeARootSystem(4), lie.Weight{0, 1, 0, 0}, 1, 4, big.NewInt(0)},
    47  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 1, 0}, 1, 4, big.NewInt(0)},
    48  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 0, 1}, 1, 4, big.NewInt(0)},
    49  
    50  		// n=5
    51  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 1, 5, big.NewInt(1)},
    52  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 1, 5, big.NewInt(0)},
    53  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 1, 5, big.NewInt(1)},
    54  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 1, 5, big.NewInt(0)},
    55  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 1, 5, big.NewInt(0)},
    56  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 1, 5, big.NewInt(1)},
    57  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 1, 5, big.NewInt(0)},
    58  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 1, 5, big.NewInt(0)},
    59  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 1, 5, big.NewInt(0)},
    60  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 0, 0}, 1, 5, big.NewInt(1)},
    61  		{lie.NewTypeARootSystem(4), lie.Weight{1, 0, 0, 0}, 1, 5, big.NewInt(1)},
    62  		{lie.NewTypeARootSystem(4), lie.Weight{0, 1, 0, 0}, 1, 5, big.NewInt(1)},
    63  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 1, 0}, 1, 5, big.NewInt(1)},
    64  		{lie.NewTypeARootSystem(4), lie.Weight{0, 0, 0, 1}, 1, 5, big.NewInt(1)},
    65  	}
    66  
    67  	for _, c := range cases {
    68  		alg := lie.NewAlgebra(c.rtsys)
    69  		bun := NewSymmetricCBBundle(alg, c.wt, c.ell, c.n)
    70  		got := bun.Rank()
    71  		if got.Cmp(c.want) != 0 {
    72  			t.Errorf("For type A CBBundle(wt: %v, ell: %v, n: %v): Rank() = %v, want %v",
    73  				c.wt, c.ell, c.n, got, c.want)
    74  		}
    75  	}
    76  }
    77  
    78  func TestSymmetricL2Rank(t *testing.T) {
    79  	cases := []struct {
    80  		rtsys lie.RootSystem
    81  		wt    lie.Weight
    82  		ell   int
    83  		n     int
    84  		want  *big.Int
    85  	}{
    86  		// n=3
    87  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 2, 3, big.NewInt(1)},
    88  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 2, 3, big.NewInt(0)},
    89  		{lie.NewTypeARootSystem(1), lie.Weight{2}, 2, 3, big.NewInt(0)},
    90  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 2, 3, big.NewInt(1)},
    91  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 2, 3, big.NewInt(1)},
    92  		{lie.NewTypeARootSystem(2), lie.Weight{0, 2}, 2, 3, big.NewInt(1)},
    93  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 2, 3, big.NewInt(1)},
    94  		{lie.NewTypeARootSystem(2), lie.Weight{1, 1}, 2, 3, big.NewInt(1)},
    95  		{lie.NewTypeARootSystem(2), lie.Weight{2, 0}, 2, 3, big.NewInt(1)},
    96  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 2, 3, big.NewInt(1)},
    97  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 2, 3, big.NewInt(0)},
    98  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 2}, 2, 3, big.NewInt(0)},
    99  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 2, 3, big.NewInt(0)},
   100  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 1}, 2, 3, big.NewInt(0)},
   101  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 2, 3, big.NewInt(0)},
   102  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 2, 3, big.NewInt(0)},
   103  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 2, 3, big.NewInt(1)},
   104  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 0}, 2, 3, big.NewInt(0)},
   105  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 0}, 2, 3, big.NewInt(0)},
   106  
   107  		// n=4
   108  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 2, 4, big.NewInt(1)},
   109  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 2, 4, big.NewInt(2)},
   110  		{lie.NewTypeARootSystem(1), lie.Weight{2}, 2, 4, big.NewInt(1)},
   111  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 2, 4, big.NewInt(1)},
   112  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 2, 4, big.NewInt(0)},
   113  		{lie.NewTypeARootSystem(2), lie.Weight{0, 2}, 2, 4, big.NewInt(0)},
   114  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 2, 4, big.NewInt(0)},
   115  		{lie.NewTypeARootSystem(2), lie.Weight{1, 1}, 2, 4, big.NewInt(2)},
   116  		{lie.NewTypeARootSystem(2), lie.Weight{2, 0}, 2, 4, big.NewInt(0)},
   117  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 2, 4, big.NewInt(1)},
   118  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 2, 4, big.NewInt(1)},
   119  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 2}, 2, 4, big.NewInt(1)},
   120  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 2, 4, big.NewInt(3)},
   121  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 1}, 2, 4, big.NewInt(1)},
   122  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 2, 4, big.NewInt(1)},
   123  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 2, 4, big.NewInt(1)},
   124  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 2, 4, big.NewInt(3)},
   125  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 0}, 2, 4, big.NewInt(1)},
   126  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 0}, 2, 4, big.NewInt(1)},
   127  
   128  		// n=5
   129  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 2, 5, big.NewInt(1)},
   130  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 2, 5, big.NewInt(0)},
   131  		{lie.NewTypeARootSystem(1), lie.Weight{2}, 2, 5, big.NewInt(0)},
   132  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 2, 5, big.NewInt(1)},
   133  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 2, 5, big.NewInt(0)},
   134  		{lie.NewTypeARootSystem(2), lie.Weight{0, 2}, 2, 5, big.NewInt(0)},
   135  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 2, 5, big.NewInt(0)},
   136  		{lie.NewTypeARootSystem(2), lie.Weight{1, 1}, 2, 5, big.NewInt(3)},
   137  		{lie.NewTypeARootSystem(2), lie.Weight{2, 0}, 2, 5, big.NewInt(0)},
   138  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 2, 5, big.NewInt(1)},
   139  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 2, 5, big.NewInt(0)},
   140  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 2}, 2, 5, big.NewInt(0)},
   141  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 2, 5, big.NewInt(0)},
   142  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 1}, 2, 5, big.NewInt(0)},
   143  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 2, 5, big.NewInt(0)},
   144  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 2, 5, big.NewInt(0)},
   145  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 2, 5, big.NewInt(5)},
   146  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 0}, 2, 5, big.NewInt(0)},
   147  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 0}, 2, 5, big.NewInt(0)},
   148  	}
   149  
   150  	for _, c := range cases {
   151  		alg := lie.NewAlgebra(c.rtsys)
   152  		bun := NewSymmetricCBBundle(alg, c.wt, c.ell, c.n)
   153  		got := bun.Rank()
   154  		if got.Cmp(c.want) != 0 {
   155  			t.Errorf("For type A CBBundle(wt: %v, ell: %v, n: %v): Rank() = %v, want %v",
   156  				c.wt, c.ell, c.n, got, c.want)
   157  		}
   158  	}
   159  }
   160  
   161  func TestSymmetricL3Rank(t *testing.T) {
   162  	cases := []struct {
   163  		rtsys lie.RootSystem
   164  		wt    lie.Weight
   165  		ell   int
   166  		n     int
   167  		want  *big.Int
   168  	}{
   169  		// n=3
   170  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 3, 3, big.NewInt(1)},
   171  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 3, 3, big.NewInt(0)},
   172  		{lie.NewTypeARootSystem(1), lie.Weight{2}, 3, 3, big.NewInt(1)},
   173  		{lie.NewTypeARootSystem(1), lie.Weight{3}, 3, 3, big.NewInt(0)},
   174  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 3, 3, big.NewInt(1)},
   175  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 3, 3, big.NewInt(1)},
   176  		{lie.NewTypeARootSystem(2), lie.Weight{0, 2}, 3, 3, big.NewInt(1)},
   177  		{lie.NewTypeARootSystem(2), lie.Weight{0, 3}, 3, 3, big.NewInt(1)},
   178  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 3, 3, big.NewInt(1)},
   179  		{lie.NewTypeARootSystem(2), lie.Weight{1, 1}, 3, 3, big.NewInt(2)},
   180  		{lie.NewTypeARootSystem(2), lie.Weight{1, 2}, 3, 3, big.NewInt(1)},
   181  		{lie.NewTypeARootSystem(2), lie.Weight{2, 0}, 3, 3, big.NewInt(1)},
   182  		{lie.NewTypeARootSystem(2), lie.Weight{2, 1}, 3, 3, big.NewInt(1)},
   183  		{lie.NewTypeARootSystem(2), lie.Weight{3, 0}, 3, 3, big.NewInt(1)},
   184  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 3, 3, big.NewInt(1)},
   185  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 3, 3, big.NewInt(0)},
   186  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 2}, 3, 3, big.NewInt(0)},
   187  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 3}, 3, 3, big.NewInt(0)},
   188  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 3, 3, big.NewInt(0)},
   189  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 1}, 3, 3, big.NewInt(0)},
   190  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 2}, 3, 3, big.NewInt(1)},
   191  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 3, 3, big.NewInt(1)},
   192  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 1}, 3, 3, big.NewInt(0)},
   193  		{lie.NewTypeARootSystem(3), lie.Weight{0, 3, 0}, 3, 3, big.NewInt(0)},
   194  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 3, 3, big.NewInt(0)},
   195  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 3, 3, big.NewInt(2)},
   196  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 2}, 3, 3, big.NewInt(0)},
   197  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 0}, 3, 3, big.NewInt(0)},
   198  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 1}, 3, 3, big.NewInt(0)},
   199  		{lie.NewTypeARootSystem(3), lie.Weight{1, 2, 0}, 3, 3, big.NewInt(0)},
   200  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 0}, 3, 3, big.NewInt(0)},
   201  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 1}, 3, 3, big.NewInt(0)},
   202  		{lie.NewTypeARootSystem(3), lie.Weight{2, 1, 0}, 3, 3, big.NewInt(1)},
   203  		{lie.NewTypeARootSystem(3), lie.Weight{3, 0, 0}, 3, 3, big.NewInt(0)},
   204  	}
   205  
   206  	for _, c := range cases {
   207  		alg := lie.NewAlgebra(c.rtsys)
   208  		bun := NewSymmetricCBBundle(alg, c.wt, c.ell, c.n)
   209  		got := bun.Rank()
   210  		if got.Cmp(c.want) != 0 {
   211  			t.Errorf("For type A CBBundle(wt: %v, ell: %v, n: %v): Rank() = %v, want %v",
   212  				c.wt, c.ell, c.n, got, c.want)
   213  		}
   214  	}
   215  }
   216  
   217  func TestL3RandomRank(t *testing.T) {
   218  	cases := []struct {
   219  		rtsys lie.RootSystem
   220  		wts   []lie.Weight
   221  		ell   int
   222  		want  *big.Int
   223  	}{
   224  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{0}, lie.Weight{1}, lie.Weight{1}}, 3, big.NewInt(1)},
   225  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{2}, lie.Weight{1}, lie.Weight{2}}, 3, big.NewInt(0)},
   226  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{3}, lie.Weight{1}, lie.Weight{3}}, 3, big.NewInt(0)},
   227  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{0}, lie.Weight{0}, lie.Weight{0}}, 3, big.NewInt(1)},
   228  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{3}, lie.Weight{0}, lie.Weight{0}}, 3, big.NewInt(0)},
   229  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{2}, lie.Weight{0}, lie.Weight{2}}, 3, big.NewInt(1)},
   230  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{3}, lie.Weight{0}, lie.Weight{1}}, 3, big.NewInt(0)},
   231  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{2}, lie.Weight{3}, lie.Weight{0}}, 3, big.NewInt(0)},
   232  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{1}, lie.Weight{3}, lie.Weight{3}}, 3, big.NewInt(0)},
   233  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{3}, lie.Weight{3}, lie.Weight{1}}, 3, big.NewInt(0)},
   234  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 2}, lie.Weight{2, 1}, lie.Weight{2, 0}}, 3, big.NewInt(0)},
   235  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 0}, lie.Weight{2, 1}, lie.Weight{0, 2}}, 3, big.NewInt(0)},
   236  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{0, 3}, lie.Weight{0, 3}, lie.Weight{0, 1}}, 3, big.NewInt(0)},
   237  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{3, 0}, lie.Weight{2, 0}, lie.Weight{2, 1}}, 3, big.NewInt(1)},
   238  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 1}, lie.Weight{1, 1}, lie.Weight{3, 0}}, 3, big.NewInt(1)},
   239  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 2}, lie.Weight{1, 1}, lie.Weight{0, 1}}, 3, big.NewInt(0)},
   240  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 2}, lie.Weight{2, 1}, lie.Weight{1, 1}}, 3, big.NewInt(1)},
   241  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 1}, lie.Weight{1, 2}, lie.Weight{1, 2}}, 3, big.NewInt(0)},
   242  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{0, 2}, lie.Weight{0, 0}, lie.Weight{0, 2}}, 3, big.NewInt(0)},
   243  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 1}, lie.Weight{1, 1}, lie.Weight{2, 1}}, 3, big.NewInt(0)},
   244  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 0, 2}, lie.Weight{0, 1, 2}, lie.Weight{0, 2, 1}}, 3, big.NewInt(0)},
   245  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{2, 0, 0}, lie.Weight{0, 0, 3}, lie.Weight{3, 0, 0}}, 3, big.NewInt(0)},
   246  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{2, 1, 0}, lie.Weight{0, 0, 1}, lie.Weight{0, 1, 2}}, 3, big.NewInt(0)},
   247  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 1, 1}, lie.Weight{1, 1, 1}, lie.Weight{3, 0, 0}}, 3, big.NewInt(0)},
   248  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 0, 1}, lie.Weight{2, 1, 0}, lie.Weight{0, 0, 3}}, 3, big.NewInt(1)},
   249  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{1, 0, 2}, lie.Weight{1, 1, 0}, lie.Weight{1, 2, 0}}, 3, big.NewInt(0)},
   250  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{2, 0, 1}, lie.Weight{1, 0, 2}, lie.Weight{2, 1, 0}}, 3, big.NewInt(0)},
   251  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{2, 0, 1}, lie.Weight{1, 0, 2}, lie.Weight{1, 0, 1}}, 3, big.NewInt(1)},
   252  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 0, 2}, lie.Weight{1, 1, 1}, lie.Weight{1, 0, 1}}, 3, big.NewInt(1)},
   253  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 1, 1}, lie.Weight{0, 0, 1}, lie.Weight{0, 2, 0}}, 3, big.NewInt(1)},
   254  
   255  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{1}, lie.Weight{1}, lie.Weight{0}, lie.Weight{1}}, 3, big.NewInt(0)},
   256  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{2}, lie.Weight{0}, lie.Weight{3}, lie.Weight{3}}, 3, big.NewInt(0)},
   257  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{3}, lie.Weight{3}, lie.Weight{0}, lie.Weight{0}}, 3, big.NewInt(1)},
   258  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{1}, lie.Weight{2}, lie.Weight{0}, lie.Weight{0}}, 3, big.NewInt(0)},
   259  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{1}, lie.Weight{1}, lie.Weight{2}, lie.Weight{3}}, 3, big.NewInt(0)},
   260  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{1}, lie.Weight{1}, lie.Weight{2}, lie.Weight{3}}, 3, big.NewInt(0)},
   261  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{0}, lie.Weight{1}, lie.Weight{2}, lie.Weight{0}}, 3, big.NewInt(0)},
   262  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{0}, lie.Weight{3}, lie.Weight{1}, lie.Weight{2}}, 3, big.NewInt(1)},
   263  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{1}, lie.Weight{2}, lie.Weight{0}, lie.Weight{1}}, 3, big.NewInt(1)},
   264  		{lie.NewTypeARootSystem(1), []lie.Weight{lie.Weight{2}, lie.Weight{0}, lie.Weight{0}, lie.Weight{1}}, 3, big.NewInt(0)},
   265  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 0}, lie.Weight{2, 0}, lie.Weight{2, 1}, lie.Weight{0, 2}}, 3, big.NewInt(0)},
   266  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{0, 0}, lie.Weight{0, 1}, lie.Weight{0, 0}, lie.Weight{1, 1}}, 3, big.NewInt(0)},
   267  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 1}, lie.Weight{0, 2}, lie.Weight{1, 0}, lie.Weight{0, 0}}, 3, big.NewInt(1)},
   268  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 0}, lie.Weight{0, 3}, lie.Weight{0, 0}, lie.Weight{2, 0}}, 3, big.NewInt(1)},
   269  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 0}, lie.Weight{2, 1}, lie.Weight{3, 0}, lie.Weight{0, 2}}, 3, big.NewInt(0)},
   270  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 0}, lie.Weight{2, 0}, lie.Weight{1, 0}, lie.Weight{0, 2}}, 3, big.NewInt(1)},
   271  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{0, 2}, lie.Weight{2, 0}, lie.Weight{1, 1}, lie.Weight{0, 1}}, 3, big.NewInt(0)},
   272  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{1, 0}, lie.Weight{2, 1}, lie.Weight{0, 1}, lie.Weight{0, 2}}, 3, big.NewInt(0)},
   273  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 1}, lie.Weight{2, 1}, lie.Weight{1, 0}, lie.Weight{2, 0}}, 3, big.NewInt(0)},
   274  		{lie.NewTypeARootSystem(2), []lie.Weight{lie.Weight{2, 1}, lie.Weight{1, 1}, lie.Weight{2, 1}, lie.Weight{1, 0}}, 3, big.NewInt(2)},
   275  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{1, 1, 0}, lie.Weight{2, 0, 1}, lie.Weight{0, 0, 2}, lie.Weight{2, 0, 1}}, 3, big.NewInt(0)},
   276  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 1, 1}, lie.Weight{0, 2, 1}, lie.Weight{0, 3, 0}, lie.Weight{0, 0, 2}}, 3, big.NewInt(0)},
   277  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 2, 1}, lie.Weight{0, 1, 1}, lie.Weight{2, 0, 1}, lie.Weight{1, 1, 0}}, 3, big.NewInt(3)},
   278  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 1, 1}, lie.Weight{0, 1, 0}, lie.Weight{0, 1, 1}, lie.Weight{0, 1, 1}}, 3, big.NewInt(0)},
   279  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{1, 0, 0}, lie.Weight{0, 0, 3}, lie.Weight{0, 0, 0}, lie.Weight{2, 0, 0}}, 3, big.NewInt(1)},
   280  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 2, 0}, lie.Weight{2, 0, 0}, lie.Weight{1, 1, 1}, lie.Weight{2, 1, 0}}, 3, big.NewInt(1)},
   281  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{1, 2, 0}, lie.Weight{0, 1, 2}, lie.Weight{0, 0, 2}, lie.Weight{0, 0, 1}}, 3, big.NewInt(0)},
   282  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{0, 3, 0}, lie.Weight{0, 0, 3}, lie.Weight{1, 1, 1}, lie.Weight{1, 0, 2}}, 3, big.NewInt(0)},
   283  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{1, 1, 1}, lie.Weight{0, 1, 0}, lie.Weight{2, 0, 1}, lie.Weight{1, 1, 1}}, 3, big.NewInt(0)},
   284  		{lie.NewTypeARootSystem(3), []lie.Weight{lie.Weight{2, 0, 0}, lie.Weight{0, 0, 2}, lie.Weight{2, 0, 0}, lie.Weight{0, 0, 2}}, 3, big.NewInt(2)},
   285  	}
   286  
   287  	for _, c := range cases {
   288  		alg := lie.NewAlgebra(c.rtsys)
   289  		bun := NewCBBundle(alg, c.wts, c.ell)
   290  		got := bun.Rank()
   291  		if got.Cmp(c.want) != 0 {
   292  			t.Errorf("For type A CBBundle(wts: %v, ell: %v): Rank() = %v, want %v",
   293  				c.wts, c.ell, got, c.want)
   294  		}
   295  	}
   296  }
   297  
   298  func TestDivisor(t *testing.T) {
   299  	cases := []struct {
   300  		rtsys lie.RootSystem
   301  		wt    lie.Weight
   302  		ell   int
   303  		n     int
   304  		want  []*big.Rat
   305  	}{
   306  		// n=4, l=1
   307  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   308  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 1, 4, []*big.Rat{big.NewRat(1, 3)}},
   309  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   310  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   311  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   312  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 1, 4, []*big.Rat{big.NewRat(2, 3)}},
   313  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   314  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   315  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   316  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 1, 4, []*big.Rat{big.NewRat(2, 3)}},
   317  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 1, 4, []*big.Rat{big.NewRat(0, 1)}},
   318  
   319  		// n=4, l=2
   320  		{lie.NewTypeARootSystem(1), lie.Weight{0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   321  		{lie.NewTypeARootSystem(1), lie.Weight{1}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   322  		{lie.NewTypeARootSystem(1), lie.Weight{2}, 2, 4, []*big.Rat{big.NewRat(2, 3)}},
   323  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   324  		{lie.NewTypeARootSystem(2), lie.Weight{1, 1}, 2, 4, []*big.Rat{big.NewRat(1, 1)}},
   325  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   326  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 1}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   327  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 2}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   328  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   329  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 1}, 2, 4, []*big.Rat{big.NewRat(2, 3)}},
   330  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 2, 4, []*big.Rat{big.NewRat(4, 3)}},
   331  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   332  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 2, 4, []*big.Rat{big.NewRat(1, 1)}},
   333  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 0}, 2, 4, []*big.Rat{big.NewRat(2, 3)}},
   334  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   335  
   336  		// n=6
   337  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 2, 6, []*big.Rat{big.NewRat(0, 1), big.NewRat(0, 1)}},
   338  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 2, 6, []*big.Rat{big.NewRat(1, 1), big.NewRat(3, 1)}},
   339  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 2, 6, []*big.Rat{big.NewRat(8, 5), big.NewRat(4, 5)}},
   340  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 2, 6, []*big.Rat{big.NewRat(27, 5), big.NewRat(31, 5)}},
   341  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 0}, 3, 6, []*big.Rat{big.NewRat(0, 1), big.NewRat(0, 1)}},
   342  		{lie.NewTypeARootSystem(3), lie.Weight{0, 0, 2}, 3, 6, []*big.Rat{big.NewRat(0, 1), big.NewRat(0, 1)}},
   343  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 0}, 3, 6, []*big.Rat{big.NewRat(0, 1), big.NewRat(0, 1)}},
   344  		{lie.NewTypeARootSystem(3), lie.Weight{0, 1, 2}, 3, 6, []*big.Rat{big.NewRat(4, 1), big.NewRat(8, 1)}},
   345  		{lie.NewTypeARootSystem(3), lie.Weight{0, 2, 0}, 3, 6, []*big.Rat{big.NewRat(64, 5), big.NewRat(62, 5)}},
   346  		{lie.NewTypeARootSystem(3), lie.Weight{0, 3, 0}, 3, 6, []*big.Rat{big.NewRat(12, 5), big.NewRat(6, 5)}},
   347  		{lie.NewTypeARootSystem(3), lie.Weight{1, 0, 1}, 3, 6, []*big.Rat{big.NewRat(22, 1), big.NewRat(34, 1)}},
   348  		{lie.NewTypeARootSystem(3), lie.Weight{1, 1, 1}, 3, 6, []*big.Rat{big.NewRat(122, 1), big.NewRat(137, 1)}},
   349  		{lie.NewTypeARootSystem(3), lie.Weight{2, 0, 0}, 3, 6, []*big.Rat{big.NewRat(0, 1), big.NewRat(0, 1)}},
   350  		{lie.NewTypeARootSystem(3), lie.Weight{2, 1, 0}, 3, 6, []*big.Rat{big.NewRat(4, 1), big.NewRat(8, 1)}},
   351  
   352  		// Allowing zero rank
   353  		{lie.NewTypeARootSystem(2), lie.Weight{0, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   354  		{lie.NewTypeARootSystem(2), lie.Weight{0, 1}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   355  		{lie.NewTypeARootSystem(2), lie.Weight{0, 2}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   356  		{lie.NewTypeARootSystem(2), lie.Weight{1, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   357  		{lie.NewTypeARootSystem(2), lie.Weight{1, 1}, 2, 4, []*big.Rat{big.NewRat(1, 1)}},
   358  		{lie.NewTypeARootSystem(2), lie.Weight{2, 0}, 2, 4, []*big.Rat{big.NewRat(0, 1)}},
   359  	}
   360  
   361  	for _, c := range cases {
   362  		alg := lie.NewAlgebra(c.rtsys)
   363  		bun := NewSymmetricCBBundle(alg, c.wt, c.ell, c.n)
   364  		got := bun.SymmetrizedDivisor()
   365  		if len(got) != len(c.want) {
   366  			t.Errorf("For type A CBBundle(wt: %v, ell: %v, n: %v): wrong divisor dimension %v, want %v",
   367  				c.wt, c.ell, c.n, len(got), len(c.want))
   368  		}
   369  		for i := range got {
   370  			if got[i].Cmp(c.want[i]) != 0 {
   371  				t.Errorf("For type A CBBundle(wt: %v, ell: %v, n: %v): Divisor() = %v, want %v",
   372  					c.wt, c.ell, c.n, got, c.want)
   373  			}
   374  		}
   375  	}
   376  }
   377  
   378  func BenchmarkSymmetricCBRank(b *testing.B) {
   379  	rank := 5
   380  	level := 4
   381  	n := 10
   382  	alg := lie.NewAlgebra(lie.NewTypeARootSystem(rank))
   383  	wts := alg.Weights(level)
   384  	b.ReportAllocs()
   385  	for i := 0; i < 1; i++ {
   386  		for j := 0; j < len(wts); j++ {
   387  			bun := NewSymmetricCBBundle(alg, wts[j], level, n)
   388  			bun.Rank()
   389  			// if rk.Cmp(big.NewInt(0)) == 0 {
   390  			// 	continue
   391  			// }
   392  			// fmt.Printf("%v: %v\n", wts[j], rk)
   393  		}
   394  	}
   395  }
   396  
   397  func BenchmarkSymmetricDivisor(b *testing.B) {
   398  	rank := 5
   399  	level := 4
   400  	n := 100
   401  	alg := lie.NewAlgebra(lie.NewTypeARootSystem(rank))
   402  	wts := alg.Weights(level)
   403  
   404  	b.ReportAllocs()
   405  	for i := 0; i < 1; i++ {
   406  		for j := 0; j < len(wts); j++ {
   407  			bun := NewSymmetricCBBundle(alg, wts[j], level, n)
   408  			// rk := bun.Rank()
   409  			bun.SymmetrizedDivisor()
   410  			// if rk.Cmp(big.NewInt(0)) == 0 {
   411  			// 	continue
   412  			// }
   413  			// fmt.Printf("%v: %v %v\n", wts[j], rk, div)
   414  		}
   415  	}
   416  }