schubmult 1.3.5__tar.gz → 1.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {schubmult-1.3.5 → schubmult-1.3.6}/PKG-INFO +1 -1
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/perm_lib.py +13 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q/schubmult_q.py +1 -2
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_yz/schubmult_q_yz.py +83 -10
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/PKG-INFO +1 -1
- {schubmult-1.3.5 → schubmult-1.3.6}/setup.py +1 -1
- {schubmult-1.3.5 → schubmult-1.3.6}/LICENSE +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/README.md +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_double/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_double/__main__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_double/schubmult_double.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_py/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_py/__main__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_py/schubmult_py.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q/__main__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_double/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_double/__main__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_double/schubmult_q_double.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_yz/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_yz/__main__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_yz/__init__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_yz/__main__.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_yz/schubmult_yz.py +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/SOURCES.txt +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/dependency_links.txt +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/entry_points.txt +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/requires.txt +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/top_level.txt +0 -0
- {schubmult-1.3.5 → schubmult-1.3.6}/setup.cfg +0 -0
@@ -139,6 +139,19 @@ def elem_sym_perms(orig_perm,p,k):
|
|
139
139
|
up_perm_list = perm_list
|
140
140
|
return total_list
|
141
141
|
|
142
|
+
def strict_theta(u):
|
143
|
+
ret = [*trimcode(u)]
|
144
|
+
did_one = True
|
145
|
+
while did_one:
|
146
|
+
did_one = False
|
147
|
+
for i in range(len(ret)-2,-1,-1):
|
148
|
+
if ret[i+1]!=0 and ret[i] <= ret[i+1]:
|
149
|
+
ret[i], ret[i+1] = ret[i+1] + 1, ret[i]
|
150
|
+
did_one = True
|
151
|
+
break
|
152
|
+
while len(ret)>0 and ret[-1] == 0:
|
153
|
+
ret.pop()
|
154
|
+
return ret
|
142
155
|
|
143
156
|
def elem_sym_perms_q(orig_perm,p,k):
|
144
157
|
total_list = [(orig_perm,0,1)]
|
@@ -21,8 +21,7 @@ for i in range(1,n):
|
|
21
21
|
subs_dict[var2[i]] = sm
|
22
22
|
|
23
23
|
def schubmult(perm_dict,v):
|
24
|
-
|
25
|
-
th = [len(v)-i for i in range(1,len(v)+1)]
|
24
|
+
th = strict_theta(inverse(v))
|
26
25
|
mu = permtrim(uncode(th))
|
27
26
|
vmu = permtrim(mulperm([*v],mu))
|
28
27
|
#print(f"{th=} {mu=} {vmu=}")
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from schubmult.perm_lib import *
|
2
|
-
from schubmult.schubmult_yz import compute_positive_rep
|
2
|
+
from schubmult.schubmult_yz import compute_positive_rep, posify
|
3
3
|
from symengine import *
|
4
4
|
import sys
|
5
5
|
|
@@ -15,7 +15,7 @@ var3 = symarray("z",100)
|
|
15
15
|
|
16
16
|
|
17
17
|
def schubmult(perm_dict,v,var2=var2,var3=var3):
|
18
|
-
th =
|
18
|
+
th = strict_theta(inverse(v))
|
19
19
|
mu = permtrim(uncode(th))
|
20
20
|
vmu = permtrim(mulperm([*v],mu))
|
21
21
|
inv_vmu = inv(vmu)
|
@@ -54,10 +54,64 @@ def schubmult(perm_dict,v,var2=var2,var3=var3):
|
|
54
54
|
ret_dict = add_perm_dict({ep: vpathsums[ep].get(toget,0) for ep in vpathsums},ret_dict)
|
55
55
|
return ret_dict
|
56
56
|
|
57
|
+
q_var2 = q_var.tolist()
|
58
|
+
|
59
|
+
def sum_q_dict(q_dict1,q_dict2):
|
60
|
+
ret = {**q_dict1}
|
61
|
+
for key in q_dict2:
|
62
|
+
ret[key] = ret.get(key,0) + q_dict2[key]
|
63
|
+
return ret
|
64
|
+
|
65
|
+
def mul_q_dict(q_dict1,q_dict2):
|
66
|
+
ret = {}
|
67
|
+
for key1 in q_dict1:
|
68
|
+
for key2 in q_dict2:
|
69
|
+
key3 = key1*key2
|
70
|
+
ret[key3] = ret.get(key3,0) + q_dict1[key1]*q_dict2[key2]
|
71
|
+
return ret
|
72
|
+
|
73
|
+
def factor_out_q_keep_factored(poly):
|
74
|
+
ret = {}
|
75
|
+
if str(poly).find("q") == -1:
|
76
|
+
ret[1] = poly
|
77
|
+
return ret
|
78
|
+
elif poly in q_var2:
|
79
|
+
ret[poly] = 1
|
80
|
+
return ret
|
81
|
+
elif isinstance(poly,Add):
|
82
|
+
ag = poly.args
|
83
|
+
ret = factor_out_q_keep_factored(ag[0])
|
84
|
+
for i in range(1,len(ag)):
|
85
|
+
ret = sum_q_dict(ret,factor_out_q_keep_factored(ag[i]))
|
86
|
+
return ret
|
87
|
+
elif isinstance(poly,Mul):
|
88
|
+
ag = poly.args
|
89
|
+
ret = factor_out_q_keep_factored(ag[0])
|
90
|
+
for i in range(1,len(ag)):
|
91
|
+
ret = mul_q_dict(ret,factor_out_q_keep_factored(ag[i]))
|
92
|
+
return ret
|
93
|
+
elif isinstance(poly,Pow):
|
94
|
+
base = poly.args[0]
|
95
|
+
exponent = int(poly.args[1])
|
96
|
+
#print(f"exponent {exponent}")
|
97
|
+
work_val = factor_out_q_keep_factored(base)
|
98
|
+
ret = {1: 1}
|
99
|
+
while exponent > 0:
|
100
|
+
if exponent % 2 == 1:
|
101
|
+
if ret == {1: 1}:
|
102
|
+
ret = {**work_val}
|
103
|
+
else:
|
104
|
+
ret = mul_q_dict(ret,work_val)
|
105
|
+
exponent -= 1
|
106
|
+
else:
|
107
|
+
work_val = mul_q_dict(work_val,work_val)
|
108
|
+
exponent //= 2
|
109
|
+
return ret
|
110
|
+
return ret
|
111
|
+
|
57
112
|
def factor_out_q(poly):
|
58
113
|
coeff_dict = expand(poly).as_coefficients_dict()
|
59
|
-
ret = {}
|
60
|
-
q_var2 = q_var.tolist()
|
114
|
+
ret = {}
|
61
115
|
for key in coeff_dict:
|
62
116
|
coeff = coeff_dict[key]
|
63
117
|
if coeff == 0:
|
@@ -92,7 +146,10 @@ def factor_out_q(poly):
|
|
92
146
|
|
93
147
|
ret[q_part] = ret.get(q_part,0) + yz_part
|
94
148
|
return ret
|
95
|
-
|
149
|
+
|
150
|
+
var2_t = tuple(var2.tolist())
|
151
|
+
var3_t = tuple(var3.tolist())
|
152
|
+
|
96
153
|
def main():
|
97
154
|
global var2
|
98
155
|
try:
|
@@ -179,19 +236,35 @@ def main():
|
|
179
236
|
notint = True
|
180
237
|
val2 = 0
|
181
238
|
if display_positive:
|
182
|
-
q_dict =
|
239
|
+
q_dict = factor_out_q_keep_factored(val)
|
183
240
|
for q_part in q_dict:
|
184
241
|
#print(f"{q_part=} {q_dict[q_part]=}")
|
185
242
|
try:
|
186
243
|
val2 += q_part*int(q_dict[q_part])
|
187
244
|
except Exception:
|
188
245
|
try:
|
189
|
-
|
190
|
-
|
191
|
-
|
246
|
+
if len(perms) == 2 and q_part == 1:
|
247
|
+
u = permtrim([*perms[0]])
|
248
|
+
v = permtrim([*perms[1]])
|
249
|
+
val2 += posify(q_dict[q_part],tuple(u),tuple(v),perm,var2_t,var3_t,msg,False)
|
250
|
+
elif len(perms) == 2 and q_part in q_var2:
|
251
|
+
i = q_var2.index(q_part)
|
252
|
+
u = permtrim([*perms[0]])
|
253
|
+
v = permtrim([*perms[1]])
|
254
|
+
#print(f"{u=} {v=} {q_part=} {q_dict[q_part]=}")
|
255
|
+
if i<len(u) and i<len(v) and u[i-1]>u[i] and v[i-1]>v[i]:
|
256
|
+
u[i], u[i-1] = u[i-1], u[i]
|
257
|
+
v[i], v[i-1] = v[i-1], v[i]
|
258
|
+
#print(f"new {u=} {v=}")
|
259
|
+
val2 += q_part*posify(q_dict[q_part],tuple(permtrim(u)),tuple(permtrim(v)),perm,var2_t,var3_t,msg,False)
|
260
|
+
else:
|
261
|
+
val2 += q_part*compute_positive_rep(q_dict[q_part],var2_t,var3_t,msg,False)
|
262
|
+
except Exception as e:
|
263
|
+
print(f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {coeff_dict.get(perm,0)=}")
|
264
|
+
print(f"Exception: {e}")
|
192
265
|
exit(1)
|
193
266
|
if check and expand(val - val2)!=0:
|
194
|
-
print(f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {
|
267
|
+
print(f"error: value not equal; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {coeff_dict.get(perm,0)=}")
|
195
268
|
exit(1)
|
196
269
|
val = val2
|
197
270
|
if val!=0:
|
@@ -6,7 +6,7 @@ long_description = (this_directory / "README.md").read_text()
|
|
6
6
|
|
7
7
|
setup(
|
8
8
|
name="schubmult",
|
9
|
-
version="1.3.
|
9
|
+
version="1.3.6",
|
10
10
|
description="Computing Littlewood-Richardson coefficients of Schubert polynomials",
|
11
11
|
long_description=long_description,
|
12
12
|
long_description_content_type='text/markdown',
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|