123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825 |
- from sympy.combinatorics.fp_groups import FpGroup
- from sympy.combinatorics.coset_table import (CosetTable,
- coset_enumeration_r, coset_enumeration_c)
- from sympy.combinatorics.coset_table import modified_coset_enumeration_r
- from sympy.combinatorics.free_groups import free_group
- from sympy.testing.pytest import slow
- """
- References
- ==========
- [1] Holt, D., Eick, B., O'Brien, E.
- "Handbook of Computational Group Theory"
- [2] John J. Cannon; Lucien A. Dimino; George Havas; Jane M. Watson
- Mathematics of Computation, Vol. 27, No. 123. (Jul., 1973), pp. 463-490.
- "Implementation and Analysis of the Todd-Coxeter Algorithm"
- """
- def test_scan_1():
- # Example 5.1 from [1]
- F, x, y = free_group("x, y")
- f = FpGroup(F, [x**3, y**3, x**-1*y**-1*x*y])
- c = CosetTable(f, [x])
- c.scan_and_fill(0, x)
- assert c.table == [[0, 0, None, None]]
- assert c.p == [0]
- assert c.n == 1
- assert c.omega == [0]
- c.scan_and_fill(0, x**3)
- assert c.table == [[0, 0, None, None]]
- assert c.p == [0]
- assert c.n == 1
- assert c.omega == [0]
- c.scan_and_fill(0, y**3)
- assert c.table == [[0, 0, 1, 2], [None, None, 2, 0], [None, None, 0, 1]]
- assert c.p == [0, 1, 2]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- c.scan_and_fill(0, x**-1*y**-1*x*y)
- assert c.table == [[0, 0, 1, 2], [None, None, 2, 0], [2, 2, 0, 1]]
- assert c.p == [0, 1, 2]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- c.scan_and_fill(1, x**3)
- assert c.table == [[0, 0, 1, 2], [3, 4, 2, 0], [2, 2, 0, 1], \
- [4, 1, None, None], [1, 3, None, None]]
- assert c.p == [0, 1, 2, 3, 4]
- assert c.n == 5
- assert c.omega == [0, 1, 2, 3, 4]
- c.scan_and_fill(1, y**3)
- assert c.table == [[0, 0, 1, 2], [3, 4, 2, 0], [2, 2, 0, 1], \
- [4, 1, None, None], [1, 3, None, None]]
- assert c.p == [0, 1, 2, 3, 4]
- assert c.n == 5
- assert c.omega == [0, 1, 2, 3, 4]
- c.scan_and_fill(1, x**-1*y**-1*x*y)
- assert c.table == [[0, 0, 1, 2], [1, 1, 2, 0], [2, 2, 0, 1], \
- [None, 1, None, None], [1, 3, None, None]]
- assert c.p == [0, 1, 2, 1, 1]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- # Example 5.2 from [1]
- f = FpGroup(F, [x**2, y**3, (x*y)**3])
- c = CosetTable(f, [x*y])
- c.scan_and_fill(0, x*y)
- assert c.table == [[1, None, None, 1], [None, 0, 0, None]]
- assert c.p == [0, 1]
- assert c.n == 2
- assert c.omega == [0, 1]
- c.scan_and_fill(0, x**2)
- assert c.table == [[1, 1, None, 1], [0, 0, 0, None]]
- assert c.p == [0, 1]
- assert c.n == 2
- assert c.omega == [0, 1]
- c.scan_and_fill(0, y**3)
- assert c.table == [[1, 1, 2, 1], [0, 0, 0, 2], [None, None, 1, 0]]
- assert c.p == [0, 1, 2]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- c.scan_and_fill(0, (x*y)**3)
- assert c.table == [[1, 1, 2, 1], [0, 0, 0, 2], [None, None, 1, 0]]
- assert c.p == [0, 1, 2]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- c.scan_and_fill(1, x**2)
- assert c.table == [[1, 1, 2, 1], [0, 0, 0, 2], [None, None, 1, 0]]
- assert c.p == [0, 1, 2]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- c.scan_and_fill(1, y**3)
- assert c.table == [[1, 1, 2, 1], [0, 0, 0, 2], [None, None, 1, 0]]
- assert c.p == [0, 1, 2]
- assert c.n == 3
- assert c.omega == [0, 1, 2]
- c.scan_and_fill(1, (x*y)**3)
- assert c.table == [[1, 1, 2, 1], [0, 0, 0, 2], [3, 4, 1, 0], [None, 2, 4, None], [2, None, None, 3]]
- assert c.p == [0, 1, 2, 3, 4]
- assert c.n == 5
- assert c.omega == [0, 1, 2, 3, 4]
- c.scan_and_fill(2, x**2)
- assert c.table == [[1, 1, 2, 1], [0, 0, 0, 2], [3, 3, 1, 0], [2, 2, 3, 3], [2, None, None, 3]]
- assert c.p == [0, 1, 2, 3, 3]
- assert c.n == 4
- assert c.omega == [0, 1, 2, 3]
- @slow
- def test_coset_enumeration():
- # this test function contains the combined tests for the two strategies
- # i.e. HLT and Felsch strategies.
- # Example 5.1 from [1]
- F, x, y = free_group("x, y")
- f = FpGroup(F, [x**3, y**3, x**-1*y**-1*x*y])
- C_r = coset_enumeration_r(f, [x])
- C_r.compress(); C_r.standardize()
- C_c = coset_enumeration_c(f, [x])
- C_c.compress(); C_c.standardize()
- table1 = [[0, 0, 1, 2], [1, 1, 2, 0], [2, 2, 0, 1]]
- assert C_r.table == table1
- assert C_c.table == table1
- # E1 from [2] Pg. 474
- F, r, s, t = free_group("r, s, t")
- E1 = FpGroup(F, [t**-1*r*t*r**-2, r**-1*s*r*s**-2, s**-1*t*s*t**-2])
- C_r = coset_enumeration_r(E1, [])
- C_r.compress()
- C_c = coset_enumeration_c(E1, [])
- C_c.compress()
- table2 = [[0, 0, 0, 0, 0, 0]]
- assert C_r.table == table2
- # test for issue #11449
- assert C_c.table == table2
- # Cox group from [2] Pg. 474
- F, a, b = free_group("a, b")
- Cox = FpGroup(F, [a**6, b**6, (a*b)**2, (a**2*b**2)**2, (a**3*b**3)**5])
- C_r = coset_enumeration_r(Cox, [a])
- C_r.compress(); C_r.standardize()
- C_c = coset_enumeration_c(Cox, [a])
- C_c.compress(); C_c.standardize()
- table3 = [[0, 0, 1, 2],
- [2, 3, 4, 0],
- [5, 1, 0, 6],
- [1, 7, 8, 9],
- [9, 10, 11, 1],
- [12, 2, 9, 13],
- [14, 9, 2, 11],
- [3, 12, 15, 16],
- [16, 17, 18, 3],
- [6, 4, 3, 5],
- [4, 19, 20, 21],
- [21, 22, 6, 4],
- [7, 5, 23, 24],
- [25, 23, 5, 18],
- [19, 6, 22, 26],
- [24, 27, 28, 7],
- [29, 8, 7, 30],
- [8, 31, 32, 33],
- [33, 34, 13, 8],
- [10, 14, 35, 35],
- [35, 36, 37, 10],
- [30, 11, 10, 29],
- [11, 38, 39, 14],
- [13, 39, 38, 12],
- [40, 15, 12, 41],
- [42, 13, 34, 43],
- [44, 35, 14, 45],
- [15, 46, 47, 34],
- [34, 48, 49, 15],
- [50, 16, 21, 51],
- [52, 21, 16, 49],
- [17, 50, 53, 54],
- [54, 55, 56, 17],
- [41, 18, 17, 40],
- [18, 28, 27, 25],
- [26, 20, 19, 19],
- [20, 57, 58, 59],
- [59, 60, 51, 20],
- [22, 52, 61, 23],
- [23, 62, 63, 22],
- [64, 24, 33, 65],
- [48, 33, 24, 61],
- [62, 25, 54, 66],
- [67, 54, 25, 68],
- [57, 26, 59, 69],
- [70, 59, 26, 63],
- [27, 64, 71, 72],
- [72, 73, 68, 27],
- [28, 41, 74, 75],
- [75, 76, 30, 28],
- [31, 29, 77, 78],
- [79, 77, 29, 37],
- [38, 30, 76, 80],
- [78, 81, 82, 31],
- [43, 32, 31, 42],
- [32, 83, 84, 85],
- [85, 86, 65, 32],
- [36, 44, 87, 88],
- [88, 89, 90, 36],
- [45, 37, 36, 44],
- [37, 82, 81, 79],
- [80, 74, 41, 38],
- [39, 42, 91, 92],
- [92, 93, 45, 39],
- [46, 40, 94, 95],
- [96, 94, 40, 56],
- [97, 91, 42, 82],
- [83, 43, 98, 99],
- [100, 98, 43, 47],
- [101, 87, 44, 90],
- [82, 45, 93, 97],
- [95, 102, 103, 46],
- [104, 47, 46, 105],
- [47, 106, 107, 100],
- [61, 108, 109, 48],
- [105, 49, 48, 104],
- [49, 110, 111, 52],
- [51, 111, 110, 50],
- [112, 53, 50, 113],
- [114, 51, 60, 115],
- [116, 61, 52, 117],
- [53, 118, 119, 60],
- [60, 70, 66, 53],
- [55, 67, 120, 121],
- [121, 122, 123, 55],
- [113, 56, 55, 112],
- [56, 103, 102, 96],
- [69, 124, 125, 57],
- [115, 58, 57, 114],
- [58, 126, 127, 128],
- [128, 128, 69, 58],
- [66, 129, 130, 62],
- [117, 63, 62, 116],
- [63, 125, 124, 70],
- [65, 109, 108, 64],
- [131, 71, 64, 132],
- [133, 65, 86, 134],
- [135, 66, 70, 136],
- [68, 130, 129, 67],
- [137, 120, 67, 138],
- [132, 68, 73, 131],
- [139, 69, 128, 140],
- [71, 141, 142, 86],
- [86, 143, 144, 71],
- [145, 72, 75, 146],
- [147, 75, 72, 144],
- [73, 145, 148, 120],
- [120, 149, 150, 73],
- [74, 151, 152, 94],
- [94, 153, 146, 74],
- [76, 147, 154, 77],
- [77, 155, 156, 76],
- [157, 78, 85, 158],
- [143, 85, 78, 154],
- [155, 79, 88, 159],
- [160, 88, 79, 161],
- [151, 80, 92, 162],
- [163, 92, 80, 156],
- [81, 157, 164, 165],
- [165, 166, 161, 81],
- [99, 107, 106, 83],
- [134, 84, 83, 133],
- [84, 167, 168, 169],
- [169, 170, 158, 84],
- [87, 171, 172, 93],
- [93, 163, 159, 87],
- [89, 160, 173, 174],
- [174, 175, 176, 89],
- [90, 90, 89, 101],
- [91, 177, 178, 98],
- [98, 179, 162, 91],
- [180, 95, 100, 181],
- [179, 100, 95, 152],
- [153, 96, 121, 148],
- [182, 121, 96, 183],
- [177, 97, 165, 184],
- [185, 165, 97, 172],
- [186, 99, 169, 187],
- [188, 169, 99, 178],
- [171, 101, 174, 189],
- [190, 174, 101, 176],
- [102, 180, 191, 192],
- [192, 193, 183, 102],
- [103, 113, 194, 195],
- [195, 196, 105, 103],
- [106, 104, 197, 198],
- [199, 197, 104, 109],
- [110, 105, 196, 200],
- [198, 201, 133, 106],
- [107, 186, 202, 203],
- [203, 204, 181, 107],
- [108, 116, 205, 206],
- [206, 207, 132, 108],
- [109, 133, 201, 199],
- [200, 194, 113, 110],
- [111, 114, 208, 209],
- [209, 210, 117, 111],
- [118, 112, 211, 212],
- [213, 211, 112, 123],
- [214, 208, 114, 125],
- [126, 115, 215, 216],
- [217, 215, 115, 119],
- [218, 205, 116, 130],
- [125, 117, 210, 214],
- [212, 219, 220, 118],
- [136, 119, 118, 135],
- [119, 221, 222, 217],
- [122, 182, 223, 224],
- [224, 225, 226, 122],
- [138, 123, 122, 137],
- [123, 220, 219, 213],
- [124, 139, 227, 228],
- [228, 229, 136, 124],
- [216, 222, 221, 126],
- [140, 127, 126, 139],
- [127, 230, 231, 232],
- [232, 233, 140, 127],
- [129, 135, 234, 235],
- [235, 236, 138, 129],
- [130, 132, 207, 218],
- [141, 131, 237, 238],
- [239, 237, 131, 150],
- [167, 134, 240, 241],
- [242, 240, 134, 142],
- [243, 234, 135, 220],
- [221, 136, 229, 244],
- [149, 137, 245, 246],
- [247, 245, 137, 226],
- [220, 138, 236, 243],
- [244, 227, 139, 221],
- [230, 140, 233, 248],
- [238, 249, 250, 141],
- [251, 142, 141, 252],
- [142, 253, 254, 242],
- [154, 255, 256, 143],
- [252, 144, 143, 251],
- [144, 257, 258, 147],
- [146, 258, 257, 145],
- [259, 148, 145, 260],
- [261, 146, 153, 262],
- [263, 154, 147, 264],
- [148, 265, 266, 153],
- [246, 267, 268, 149],
- [260, 150, 149, 259],
- [150, 250, 249, 239],
- [162, 269, 270, 151],
- [262, 152, 151, 261],
- [152, 271, 272, 179],
- [159, 273, 274, 155],
- [264, 156, 155, 263],
- [156, 270, 269, 163],
- [158, 256, 255, 157],
- [275, 164, 157, 276],
- [277, 158, 170, 278],
- [279, 159, 163, 280],
- [161, 274, 273, 160],
- [281, 173, 160, 282],
- [276, 161, 166, 275],
- [283, 162, 179, 284],
- [164, 285, 286, 170],
- [170, 188, 184, 164],
- [166, 185, 189, 173],
- [173, 287, 288, 166],
- [241, 254, 253, 167],
- [278, 168, 167, 277],
- [168, 289, 290, 291],
- [291, 292, 187, 168],
- [189, 293, 294, 171],
- [280, 172, 171, 279],
- [172, 295, 296, 185],
- [175, 190, 297, 297],
- [297, 298, 299, 175],
- [282, 176, 175, 281],
- [176, 294, 293, 190],
- [184, 296, 295, 177],
- [284, 178, 177, 283],
- [178, 300, 301, 188],
- [181, 272, 271, 180],
- [302, 191, 180, 303],
- [304, 181, 204, 305],
- [183, 266, 265, 182],
- [306, 223, 182, 307],
- [303, 183, 193, 302],
- [308, 184, 188, 309],
- [310, 189, 185, 311],
- [187, 301, 300, 186],
- [305, 202, 186, 304],
- [312, 187, 292, 313],
- [314, 297, 190, 315],
- [191, 316, 317, 204],
- [204, 318, 319, 191],
- [320, 192, 195, 321],
- [322, 195, 192, 319],
- [193, 320, 323, 223],
- [223, 324, 325, 193],
- [194, 326, 327, 211],
- [211, 328, 321, 194],
- [196, 322, 329, 197],
- [197, 330, 331, 196],
- [332, 198, 203, 333],
- [318, 203, 198, 329],
- [330, 199, 206, 334],
- [335, 206, 199, 336],
- [326, 200, 209, 337],
- [338, 209, 200, 331],
- [201, 332, 339, 240],
- [240, 340, 336, 201],
- [202, 341, 342, 292],
- [292, 343, 333, 202],
- [205, 344, 345, 210],
- [210, 338, 334, 205],
- [207, 335, 346, 237],
- [237, 347, 348, 207],
- [208, 349, 350, 215],
- [215, 351, 337, 208],
- [352, 212, 217, 353],
- [351, 217, 212, 327],
- [328, 213, 224, 323],
- [354, 224, 213, 355],
- [349, 214, 228, 356],
- [357, 228, 214, 345],
- [358, 216, 232, 359],
- [360, 232, 216, 350],
- [344, 218, 235, 361],
- [362, 235, 218, 348],
- [219, 352, 363, 364],
- [364, 365, 355, 219],
- [222, 358, 366, 367],
- [367, 368, 353, 222],
- [225, 354, 369, 370],
- [370, 371, 372, 225],
- [307, 226, 225, 306],
- [226, 268, 267, 247],
- [227, 373, 374, 233],
- [233, 360, 356, 227],
- [229, 357, 361, 234],
- [234, 375, 376, 229],
- [248, 231, 230, 230],
- [231, 377, 378, 379],
- [379, 380, 359, 231],
- [236, 362, 381, 245],
- [245, 382, 383, 236],
- [384, 238, 242, 385],
- [340, 242, 238, 346],
- [347, 239, 246, 381],
- [386, 246, 239, 387],
- [388, 241, 291, 389],
- [343, 291, 241, 339],
- [375, 243, 364, 390],
- [391, 364, 243, 383],
- [373, 244, 367, 392],
- [393, 367, 244, 376],
- [382, 247, 370, 394],
- [395, 370, 247, 396],
- [377, 248, 379, 397],
- [398, 379, 248, 374],
- [249, 384, 399, 400],
- [400, 401, 387, 249],
- [250, 260, 402, 403],
- [403, 404, 252, 250],
- [253, 251, 405, 406],
- [407, 405, 251, 256],
- [257, 252, 404, 408],
- [406, 409, 277, 253],
- [254, 388, 410, 411],
- [411, 412, 385, 254],
- [255, 263, 413, 414],
- [414, 415, 276, 255],
- [256, 277, 409, 407],
- [408, 402, 260, 257],
- [258, 261, 416, 417],
- [417, 418, 264, 258],
- [265, 259, 419, 420],
- [421, 419, 259, 268],
- [422, 416, 261, 270],
- [271, 262, 423, 424],
- [425, 423, 262, 266],
- [426, 413, 263, 274],
- [270, 264, 418, 422],
- [420, 427, 307, 265],
- [266, 303, 428, 425],
- [267, 386, 429, 430],
- [430, 431, 396, 267],
- [268, 307, 427, 421],
- [269, 283, 432, 433],
- [433, 434, 280, 269],
- [424, 428, 303, 271],
- [272, 304, 435, 436],
- [436, 437, 284, 272],
- [273, 279, 438, 439],
- [439, 440, 282, 273],
- [274, 276, 415, 426],
- [285, 275, 441, 442],
- [443, 441, 275, 288],
- [289, 278, 444, 445],
- [446, 444, 278, 286],
- [447, 438, 279, 294],
- [295, 280, 434, 448],
- [287, 281, 449, 450],
- [451, 449, 281, 299],
- [294, 282, 440, 447],
- [448, 432, 283, 295],
- [300, 284, 437, 452],
- [442, 453, 454, 285],
- [309, 286, 285, 308],
- [286, 455, 456, 446],
- [450, 457, 458, 287],
- [311, 288, 287, 310],
- [288, 454, 453, 443],
- [445, 456, 455, 289],
- [313, 290, 289, 312],
- [290, 459, 460, 461],
- [461, 462, 389, 290],
- [293, 310, 463, 464],
- [464, 465, 315, 293],
- [296, 308, 466, 467],
- [467, 468, 311, 296],
- [298, 314, 469, 470],
- [470, 471, 472, 298],
- [315, 299, 298, 314],
- [299, 458, 457, 451],
- [452, 435, 304, 300],
- [301, 312, 473, 474],
- [474, 475, 309, 301],
- [316, 302, 476, 477],
- [478, 476, 302, 325],
- [341, 305, 479, 480],
- [481, 479, 305, 317],
- [324, 306, 482, 483],
- [484, 482, 306, 372],
- [485, 466, 308, 454],
- [455, 309, 475, 486],
- [487, 463, 310, 458],
- [454, 311, 468, 485],
- [486, 473, 312, 455],
- [459, 313, 488, 489],
- [490, 488, 313, 342],
- [491, 469, 314, 472],
- [458, 315, 465, 487],
- [477, 492, 485, 316],
- [463, 317, 316, 468],
- [317, 487, 493, 481],
- [329, 447, 464, 318],
- [468, 319, 318, 463],
- [319, 467, 448, 322],
- [321, 448, 467, 320],
- [475, 323, 320, 466],
- [432, 321, 328, 437],
- [438, 329, 322, 434],
- [323, 474, 452, 328],
- [483, 494, 486, 324],
- [466, 325, 324, 475],
- [325, 485, 492, 478],
- [337, 422, 433, 326],
- [437, 327, 326, 432],
- [327, 436, 424, 351],
- [334, 426, 439, 330],
- [434, 331, 330, 438],
- [331, 433, 422, 338],
- [333, 464, 447, 332],
- [449, 339, 332, 440],
- [465, 333, 343, 469],
- [413, 334, 338, 418],
- [336, 439, 426, 335],
- [441, 346, 335, 415],
- [440, 336, 340, 449],
- [416, 337, 351, 423],
- [339, 451, 470, 343],
- [346, 443, 450, 340],
- [480, 493, 487, 341],
- [469, 342, 341, 465],
- [342, 491, 495, 490],
- [361, 407, 414, 344],
- [418, 345, 344, 413],
- [345, 417, 408, 357],
- [381, 446, 442, 347],
- [415, 348, 347, 441],
- [348, 414, 407, 362],
- [356, 408, 417, 349],
- [423, 350, 349, 416],
- [350, 425, 420, 360],
- [353, 424, 436, 352],
- [479, 363, 352, 435],
- [428, 353, 368, 476],
- [355, 452, 474, 354],
- [488, 369, 354, 473],
- [435, 355, 365, 479],
- [402, 356, 360, 419],
- [405, 361, 357, 404],
- [359, 420, 425, 358],
- [476, 366, 358, 428],
- [427, 359, 380, 482],
- [444, 381, 362, 409],
- [363, 481, 477, 368],
- [368, 393, 390, 363],
- [365, 391, 394, 369],
- [369, 490, 480, 365],
- [366, 478, 483, 380],
- [380, 398, 392, 366],
- [371, 395, 496, 497],
- [497, 498, 489, 371],
- [473, 372, 371, 488],
- [372, 486, 494, 484],
- [392, 400, 403, 373],
- [419, 374, 373, 402],
- [374, 421, 430, 398],
- [390, 411, 406, 375],
- [404, 376, 375, 405],
- [376, 403, 400, 393],
- [397, 430, 421, 377],
- [482, 378, 377, 427],
- [378, 484, 497, 499],
- [499, 499, 397, 378],
- [394, 461, 445, 382],
- [409, 383, 382, 444],
- [383, 406, 411, 391],
- [385, 450, 443, 384],
- [492, 399, 384, 453],
- [457, 385, 412, 493],
- [387, 442, 446, 386],
- [494, 429, 386, 456],
- [453, 387, 401, 492],
- [389, 470, 451, 388],
- [493, 410, 388, 457],
- [471, 389, 462, 495],
- [412, 390, 393, 399],
- [462, 394, 391, 410],
- [401, 392, 398, 429],
- [396, 445, 461, 395],
- [498, 496, 395, 460],
- [456, 396, 431, 494],
- [431, 397, 499, 496],
- [399, 477, 481, 412],
- [429, 483, 478, 401],
- [410, 480, 490, 462],
- [496, 497, 484, 431],
- [489, 495, 491, 459],
- [495, 460, 459, 471],
- [460, 489, 498, 498],
- [472, 472, 471, 491]]
- assert C_r.table == table3
- assert C_c.table == table3
- # Group denoted by B2,4 from [2] Pg. 474
- F, a, b = free_group("a, b")
- B_2_4 = FpGroup(F, [a**4, b**4, (a*b)**4, (a**-1*b)**4, (a**2*b)**4, \
- (a*b**2)**4, (a**2*b**2)**4, (a**-1*b*a*b)**4, (a*b**-1*a*b)**4])
- C_r = coset_enumeration_r(B_2_4, [a])
- C_c = coset_enumeration_c(B_2_4, [a])
- index_r = 0
- for i in range(len(C_r.p)):
- if C_r.p[i] == i:
- index_r += 1
- assert index_r == 1024
- index_c = 0
- for i in range(len(C_c.p)):
- if C_c.p[i] == i:
- index_c += 1
- assert index_c == 1024
- # trivial Macdonald group G(2,2) from [2] Pg. 480
- M = FpGroup(F, [b**-1*a**-1*b*a*b**-1*a*b*a**-2, a**-1*b**-1*a*b*a**-1*b*a*b**-2])
- C_r = coset_enumeration_r(M, [a])
- C_r.compress(); C_r.standardize()
- C_c = coset_enumeration_c(M, [a])
- C_c.compress(); C_c.standardize()
- table4 = [[0, 0, 0, 0]]
- assert C_r.table == table4
- assert C_c.table == table4
- def test_look_ahead():
- # Section 3.2 [Test Example] Example (d) from [2]
- F, a, b, c = free_group("a, b, c")
- f = FpGroup(F, [a**11, b**5, c**4, (a*c)**3, b**2*c**-1*b**-1*c, a**4*b**-1*a**-1*b])
- H = [c, b, c**2]
- table0 = [[1, 2, 0, 0, 0, 0],
- [3, 0, 4, 5, 6, 7],
- [0, 8, 9, 10, 11, 12],
- [5, 1, 10, 13, 14, 15],
- [16, 5, 16, 1, 17, 18],
- [4, 3, 1, 8, 19, 20],
- [12, 21, 22, 23, 24, 1],
- [25, 26, 27, 28, 1, 24],
- [2, 10, 5, 16, 22, 28],
- [10, 13, 13, 2, 29, 30]]
- CosetTable.max_stack_size = 10
- C_c = coset_enumeration_c(f, H)
- C_c.compress(); C_c.standardize()
- assert C_c.table[: 10] == table0
- def test_modified_methods():
- '''
- Tests for modified coset table methods.
- Example 5.7 from [1] Holt, D., Eick, B., O'Brien
- "Handbook of Computational Group Theory".
- '''
- F, x, y = free_group("x, y")
- f = FpGroup(F, [x**3, y**5, (x*y)**2])
- H = [x*y, x**-1*y**-1*x*y*x]
- C = CosetTable(f, H)
- C.modified_define(0, x)
- identity = C._grp.identity
- a_0 = C._grp.generators[0]
- a_1 = C._grp.generators[1]
- assert C.P == [[identity, None, None, None],
- [None, identity, None, None]]
- assert C.table == [[1, None, None, None],
- [None, 0, None, None]]
- C.modified_define(1, x)
- assert C.table == [[1, None, None, None],
- [2, 0, None, None],
- [None, 1, None, None]]
- assert C.P == [[identity, None, None, None],
- [identity, identity, None, None],
- [None, identity, None, None]]
- C.modified_scan(0, x**3, C._grp.identity, fill=False)
- assert C.P == [[identity, identity, None, None],
- [identity, identity, None, None],
- [identity, identity, None, None]]
- assert C.table == [[1, 2, None, None],
- [2, 0, None, None],
- [0, 1, None, None]]
- C.modified_scan(0, x*y, C._grp.generators[0], fill=False)
- assert C.P == [[identity, identity, None, a_0**-1],
- [identity, identity, a_0, None],
- [identity, identity, None, None]]
- assert C.table == [[1, 2, None, 1],
- [2, 0, 0, None],
- [0, 1, None, None]]
- C.modified_define(2, y**-1)
- assert C.table == [[1, 2, None, 1],
- [2, 0, 0, None],
- [0, 1, None, 3],
- [None, None, 2, None]]
- assert C.P == [[identity, identity, None, a_0**-1],
- [identity, identity, a_0, None],
- [identity, identity, None, identity],
- [None, None, identity, None]]
- C.modified_scan(0, x**-1*y**-1*x*y*x, C._grp.generators[1])
- assert C.table == [[1, 2, None, 1],
- [2, 0, 0, None],
- [0, 1, None, 3],
- [3, 3, 2, None]]
- assert C.P == [[identity, identity, None, a_0**-1],
- [identity, identity, a_0, None],
- [identity, identity, None, identity],
- [a_1, a_1**-1, identity, None]]
- C.modified_scan(2, (x*y)**2, C._grp.identity)
- assert C.table == [[1, 2, 3, 1],
- [2, 0, 0, None],
- [0, 1, None, 3],
- [3, 3, 2, 0]]
- assert C.P == [[identity, identity, a_1**-1, a_0**-1],
- [identity, identity, a_0, None],
- [identity, identity, None, identity],
- [a_1, a_1**-1, identity, a_1]]
- C.modified_define(2, y)
- assert C.table == [[1, 2, 3, 1],
- [2, 0, 0, None],
- [0, 1, 4, 3],
- [3, 3, 2, 0],
- [None, None, None, 2]]
- assert C.P == [[identity, identity, a_1**-1, a_0**-1],
- [identity, identity, a_0, None],
- [identity, identity, identity, identity],
- [a_1, a_1**-1, identity, a_1],
- [None, None, None, identity]]
- C.modified_scan(0, y**5, C._grp.identity)
- assert C.table == [[1, 2, 3, 1], [2, 0, 0, 4], [0, 1, 4, 3], [3, 3, 2, 0], [None, None, 1, 2]]
- assert C.P == [[identity, identity, a_1**-1, a_0**-1],
- [identity, identity, a_0, a_0*a_1**-1],
- [identity, identity, identity, identity],
- [a_1, a_1**-1, identity, a_1],
- [None, None, a_1*a_0**-1, identity]]
- C.modified_scan(1, (x*y)**2, C._grp.identity)
- assert C.table == [[1, 2, 3, 1],
- [2, 0, 0, 4],
- [0, 1, 4, 3],
- [3, 3, 2, 0],
- [4, 4, 1, 2]]
- assert C.P == [[identity, identity, a_1**-1, a_0**-1],
- [identity, identity, a_0, a_0*a_1**-1],
- [identity, identity, identity, identity],
- [a_1, a_1**-1, identity, a_1],
- [a_0*a_1**-1, a_1*a_0**-1, a_1*a_0**-1, identity]]
- # Modified coset enumeration test
- f = FpGroup(F, [x**3, y**3, x**-1*y**-1*x*y])
- C = coset_enumeration_r(f, [x])
- C_m = modified_coset_enumeration_r(f, [x])
- assert C_m.table == C.table
|