예제 #1
0
파일: lie.py 프로젝트: punkdit/bruhat
def test_graded_sl3():
    # ---------------------------------------------------------------
    # slightly more explicit calculation than test_hilbert above

    ring = Q
    zero = Poly({}, ring)
    one = Poly({():1}, ring)
    x = Poly("x", ring)
    y = Poly("y", ring)
    z = Poly("z", ring)
    u = Poly("u", ring)
    v = Poly("v", ring)
    w = Poly("w", ring)

    rel = x*u + y*v + z*w
    rels = [rel]
    rels = grobner(rels)

    for a in range(4):
      for b in range(4):
        gens = []
        for p in all_monomials([x, y, z], a, ring):
          for q in all_monomials([u, v, w], b, ring):
            rem = p*q
            #gens.append(pq)
            for rel in rels:
                div, rem = rel.reduce(rem)
                #print(pq, div, rem)
            gens.append(rem)

        basis = grobner(gens)
        assert len(basis) == dim_sl3(a, b)
        print(len(basis), end=' ', flush=True)
      print()
예제 #2
0
파일: lie.py 프로젝트: punkdit/bruhat
def get_weights_sl3(a, b):
    ring = Q
    zero = Poly({}, ring)
    one = Poly({():1}, ring)
    x = Poly("x", ring)
    y = Poly("y", ring)
    z = Poly("z", ring)
    u = Poly("u", ring)
    v = Poly("v", ring)
    w = Poly("w", ring)

    # See: Fulton & Harris, page 183
    grades = {
        #      L_1, L_3
        'x' : ( 0,   1),
        'y' : (-1,  -1),
        'z' : ( 1,   0),
        'u' : ( 0,  -1),
        'v' : ( 1,   1),
        'w' : (-1,   0),
    }
    rel = x*u + y*v + z*w
    rels = [rel]
    rels = grobner(rels)

    gens = []
    for p in all_monomials([x, y, z], a, ring):
      for q in all_monomials([u, v, w], b, ring):
        rem = p*q
        for rel in rels:
            div, rem = rel.reduce(rem)
        gens.append(rem)

    basis = grobner(gens)

    size = sage_grobner(gens)
    assert size == len(basis)

    weights = {}
    for p in basis:
        g = find_grade(grades, p)
        weights[g] = weights.get(g, 0) + 1
    return weights
예제 #3
0
파일: lie.py 프로젝트: punkdit/bruhat
def test_so5():
    # Plucker embedding for SO(5) ~= SO(2,3)

    ring = Q
    zero = Poly({}, ring)
    one = Poly({():1}, ring)

    a = Poly("a", ring)
    b = Poly("b", ring)
    c = Poly("c", ring)
    d = Poly("d", ring)

    # (2,3) space-time
    u = Poly("u", ring) # time coord
    v = Poly("v", ring) # time coord
    x = Poly("x", ring) # space coord
    y = Poly("y", ring) # space coord
    z = Poly("z", ring) # space coord

    # got from test_quaternion :
    rels = [
        u**2+v**2-x**2-y**2-z**2,
        a*u + d*v -(a*x + c*z - d*y),
        a*v - d*u -(a*y - b*z + d*x),
        -b*u - c*v -(-b*x - c*y - d*z),
        b*v - c*u -(-a*z - b*y + c*x),
    ]
    rels = grobner(rels)

    for idx in range(6):
      for jdx in range(6):
        gens = []
        for p in all_monomials([a, b, c, d], idx, ring):
          for q in all_monomials([u, v, x, y, z], jdx, ring):
            rem = p*q
            #for count in range(3):
            while 1:
                rem0 = rem
                for rel in rels:
                    div, rem = rel.reduce(rem)
                if rem == rem0:
                    break
            gens.append(rem)
    
        #print("gens:", len(gens))
        n = sage_grobner(gens)
        #basis = grobner(gens)
        print("%3d"%n, end=' ', flush=True)
      print()
예제 #4
0
파일: lie.py 프로젝트: punkdit/bruhat
def test_graded_1():


    ring = Q
    zero = Poly({}, ring)
    one = Poly({():1}, ring)

    h = Poly("h", ring) # grade 1
    x = Poly("x", ring) # grade 3
    y = Poly("y", ring) # grade 5
    lookup = {h:1, x:3, y:5}

    rels = [
        x**5 - y**3 - h**15, # grade == 15
    ]
    print("rels:")
    for rel in rels:
        print(rel)
    print()
    rels = grobner(rels)

    n = argv.get("n", 10)
    grades = dict((i, []) for i in range(n))
    for i in range(n):
      for j in range(n):
       for k in range(n):
        g = 1*i + 3*j + 5*k
        if g >= n:
            continue
        for mh in all_monomials([h], i, ring):
         for mx in all_monomials([x], j, ring):
          for my in all_monomials([y], k, ring):
            rem = mh*mx*my
            while 1:
                rem0 = rem
                for rel in rels:
                    div, rem = rel.reduce(rem)
                if rem == rem0:
                    break
            grades[g].append(rem)
    
    for i in range(n):
        gens = grades[i]
        #basis = grobner(gens) if gens else []
        #count = len(basis)
        count = sage_grobner(gens)
        print(count, end=",", flush=True)
    print()
예제 #5
0
파일: lie.py 프로젝트: punkdit/bruhat
def test_graded_2():

    if argv.rational:
        ring = Q
    elif argv.gf2:
        ring = FiniteField(2)
    else:
        return

    zero = Poly({}, ring)
    one = Poly({():1}, ring)

    h = Poly("h", ring)
    x = Poly("x", ring)
    y = Poly("y", ring)
    z = Poly("z", ring)
    lookup = {h:1, x:3, y:4, z:5}
    vs = list(lookup.keys())
    vs.sort(key = str)
    print("vs", vs)

    rels = [
        #z*x + y*y,
        #x**3 + z*y,
        #z*z + y*x*h*h*h,
        y*x*h,
        #z*x*h, # grade 9
        #z*z, # grade 10
        #z*y*h,
    ]
    print("rels:")
    for rel in rels:
        print(rel)
    print()
    rels = grobner(rels)

    n = argv.get("n", 10)
    grades = dict((i, []) for i in range(n))
    for i in range(n):
     for j in range(n):
      for k in range(n):
       #for l in range(n):
        g = 1*i + 2*j + 3*k # + 5*l
        if g >= n:
            continue
        for mh in all_monomials([h], i, ring):
         for mx in all_monomials([x], j, ring):
          for my in all_monomials([y], k, ring):
           #for mz in all_monomials([z], l, ring):
            rem = mh*mx*my #*mz
            while 1:
                rem0 = rem
                for rel in rels:
                    div, rem = rel.reduce(rem)
                if rem == rem0:
                    break
            grades[g].append(rem)
    
    for i in range(n):
        gens = grades[i]
        #print(gens)
        if argv.sage:
            count = sage_grobner(gens)
        else:
            basis = grobner(gens) if gens else []
            count = len(basis)
        print(count, end=",", flush=True)
    print()
예제 #6
0
파일: lie.py 프로젝트: punkdit/bruhat
def get_weights_so5(idx=0, jdx=0):
    # Plucker embedding for SO(5) ~= SO(2+3)

    ring = Q
    zero = Poly({}, ring)
    one = Poly({():1}, ring)

    a = Poly("a", ring)
    b = Poly("b", ring)
    c = Poly("c", ring)
    d = Poly("d", ring)

    z = Poly("z", ring)

    e = Poly("e", ring)
    f = Poly("f", ring)
    g = Poly("g", ring)
    h = Poly("h", ring)

    half = one/2
    u = half*(e+g)
    v = half*(f+h)
    x = half*(e-g)
    y = half*(h-f)

    assert u**2+v**2-x**2-y**2-z**2 == e*g + f*h - z**2


    # got from test_quaternion :
    rels = [
        e*g + f*h - z**2,
        a*u + d*v -(a*x + c*z - d*y),
        a*v - d*u -(a*y - b*z + d*x),
        -b*u - c*v -(-b*x - c*y - d*z),
        b*v - c*u -(-a*z - b*y + c*x),
    ]
    print("rels:")
    for rel in rels:
        print(rel)
    print()
    rels = grobner(rels)

    gens = []
    for p in all_monomials([a, b, c, d], idx, ring):
      for q in all_monomials([e, f, g, h, z], jdx, ring):
        rem = p*q
        #for count in range(3):
        while 1:
            rem0 = rem
            for rel in rels:
                div, rem = rel.reduce(rem)
            if rem == rem0:
                break
        gens.append(rem)

    #print("gens:", len(gens))
    basis = grobner(gens)
    for p in basis:
        print(p)
    n = sage_grobner(gens)
    assert n == len(basis)
    print("%3d"%n)

    grades = {
        #       s    q
        'e' : ( 0,   1),
        'b' : (-1,   1),
        'f' : (-2,   1),
        'a' : ( 1,   0),
        'z' : ( 0,   0),
        'd' : (-1,   0),
        'h' : ( 2,  -1),
        'c' : ( 1,  -1),
        'g' : ( 0,  -1),
    }

    weights = {}
    for p in basis:
        g = find_grade(grades, p)
        weights[g] = weights.get(g, 0) + 1
    return weights
예제 #7
0
파일: lie.py 프로젝트: punkdit/bruhat
def test_graded_sl4():
    # See: Miller & Sturmfels, p276

    ring = Q
    zero = Poly({}, ring)
    one = Poly({():1}, ring)
    poly = lambda v : Poly(v, ring)

    p1 = poly("p1")
    p2 = poly("p2")
    p3 = poly("p3")
    p4 = poly("p4")
    p12 = poly("p12")
    p13 = poly("p13")
    p14 = poly("p14")
    p23 = poly("p23")
    p24 = poly("p24")
    p34 = poly("p34")
    p123 = poly("p123")
    p124 = poly("p124")
    p134 = poly("p134")
    p234 = poly("p234")

    rels = [
        p23*p1 - p13*p2 + p12*p3,       p24*p1 - p14*p2 + p12*p4,
        p34*p1 - p14*p3 + p13*p4,       p34*p2 - p24*p3 + p23*p4,
        p14*p23 - p13*p24 + p12*p34,    p234*p1 - p134*p2 + p124*p3 - p123*p4,
        p134*p12 - p124*p13 + p123*p14, p234*p12 - p124*p23 + p123*p24,
        p234*p13 - p134*p23 + p123*p34, p234*p14 - p134*p24 + p124*p34,
    ]
    rels = grobner(rels, verbose=True)
    print("rels:", rels)
    print()

    grades = [
        [p1, p2, p3, p4],
        [p12, p13, p14, p23, p24, p34],
        [p123, p124, p134, p234],
    ]
    multi = argv.get("multi")
    n = 5 if multi is None else sum(multi)+1
    n = argv.get("n", n)
    for g0 in range(n):
     for g1 in range(n):
      for g2 in range(n):
        if multi is not None and (g0, g1, g2)!=multi:
            #print(".  ", end='')
            continue
        elif g0+g1+g2 > n-1:
            print(".  ", end='')
            continue
        gens = []
        for m0 in all_monomials(grades[0], g0, ring):
         for m1 in all_monomials(grades[1], g1, ring):
          for m2 in all_monomials(grades[2], g2, ring):
            m = m0*m1*m2
            #for rel in rels:
            #    div, m = rel.reduce(m)
            m = reduce_many(rels, m)
            if m != 0:
                gens.append(m)
            
        print(len(gens), end=':', flush=True)
        basis = grobner(gens)
        lhs = len(basis)
        rhs = (g0+1)*(g1+1)*(g2+1)*(g0+g1+2)*(g1+g2+2)*(g0+g1+g2+3)//12
        assert lhs==rhs, ("%s != %s"%(lhs, rhs))
        print(len(basis), end=' ', flush=True)

#        basis.sort(key=str)
#        heads = {}
#        for p in basis:
#            print(p.head, p)
#            heads[p.head] = p
#        print(len(heads))
#        return

      print()
     print()