Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2022
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.35 KB | None | 0 0
  1.  
  2.  
  3. def getMat(k):
  4.     vs = [(m, M) for m in range(k) for M in range(m,k)]
  5.     vToInd = {v:i for i,v in enumerate(vs)}
  6.     mat = matrix(QQ, len(vs))
  7.     for i1, (m,M) in enumerate(vs):
  8.         for x1 in range(m, k):
  9.             for x2 in range(m, k):
  10.                 if max(x1,x2)<M: continue
  11.                 v2 = (min(x1,x2), max(x1,x2))
  12.                 mat.add_to_entry(i1, vToInd[v2], 1)
  13.     return mat
  14.  
  15. def getGraph(k):
  16.     g = DiGraph()
  17.     g.allow_loops(True)
  18.     mat = getMat(k)
  19.     vs = [(m, M) for m in range(k) for M in range(m,k)]
  20.     for i1, v1 in enumerate(vs):
  21.         for i2, v2 in enumerate(vs):
  22.             if mat[i1,i2]>0:
  23.                 g.add_edge(v1,v2,mat[i1,i2])
  24.     return g
  25.  
  26.  
  27. def f(n, k):
  28.     mat = getMat(k)
  29.     return sum((mat^n)[0])
  30.  
  31.  
  32. #g = getGraph(3)
  33. #show(g.plot(figsize=6, edge_labels=True))
  34. #show(getMat(3))
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41. def getFormula(k, verbose=0):
  42.     if verbose: print ("Finding formula for k = ", k)
  43.    
  44.     #b = 2^n
  45.     R.<n, b> = PolynomialRing(QQ, 2)
  46.  
  47.     #ell is the eigenvalue, either 1 or 2
  48.     def jord(m, ell):
  49.         return matrix([[binomial(n,j-i)*(1 if ell==1 else b/ell^(j-i)) if j>=i else 0 for j in range(m)] for i in range(m)])
  50.    
  51.    
  52.     A = getMat(k)
  53.     matN = A.dimensions()[0]
  54.     D, J = A.jordan_form(transformation=True)
  55.     divs = D.subdivisions()[0]
  56.     #assuming len(divs)>0
  57.     ms = [divs[0]]
  58.     eigs = [D[0,0]]
  59.     for j in range(len(divs)-1):
  60.         ms.append(divs[j+1]-divs[j])
  61.         eigs.append(D[divs[j], divs[j]])
  62.     ms.append(matN-divs[-1])
  63.     eigs.append(D[matN-1,matN-1])
  64.     if verbose: print ("Jordan blocks: " + ", ".join("J_{%d}(%d)" %(m,l) for m,l in zip(ms,eigs)))
  65.     if verbose==2: show(D)
  66.     #show(J*D*J^(-1), A)
  67.     vMat = block_diagonal_matrix(*(jord(m,l) for m,l in zip(ms, eigs)))
  68.     return sum((J*vMat*J^(-1))[0])
  69.  
  70.  
  71. #testK = 7
  72. #g = getFormula(testK)
  73. #show(factor(g))
  74. #test
  75. #print ([f(n,testK) for n in range(1, 10)])
  76. #print ([g(n=n, b=2^n) for n in range(1, 10)])
  77.  
  78. for k in range(2, 10):
  79.     show (k, ": ", factor(getFormula(k)))
  80.  
  81.  
  82. #print ([2^(n+2)-n-3 for n in range(1,10)])
  83. #print ([1/2*(n+2)*(2^(n+2)*(n-1)+n+5) for n in range(1,10)])
  84. #print ([sum(j*2^(n+1-j) for j in range(n+2)) for n in range(1, 10)])
  85.  
  86. #print ([list(r) for r in getMat(3)])
  87.  
  88. #a = matrix([[f(n,k) for n in range(1, 10)] for k in range(1, 10)])
  89. #show(a)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement