-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomplexities.sage
54 lines (42 loc) · 1.61 KB
/
complexities.sage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -----------------------------------------------------------------------------------------------------
# General complexities: C_alg = 2^(k*w+d)
# -----------------------------------------------------------------------------------------------------
def gb_compl_kd(dreg, nv, ne):
# Assumption: nv=ne
# Returns: k,d such that C_GB = 2^(k*w+d)
if dreg == None:
return None, None
# Formula used for C_GB: binomial(nv + dreg, nv)**w
k = float(log(binomial(ne + dreg, ne),2))
d = 0
k = round(ceil(k * 10) / 10, 1)
d = round(ceil(d * 10) / 10, 1)
return k,d
def fglm_compl_kd(dI, nv, ne):
# Assumption: nv=ne
# Returns: k,d such that C_FGLM = 2^(k*w+d)
if dI == None:
return None, None
# Formula used for C_FGLM: nv * dI**w.
k = float(log(dI,2))
d = float(log(nv,2))
k = round(ceil(k * 10) / 10, 1)
d = round(ceil(d * 10) / 10, 1)
return k,d
def print_stats(eqs,w_gb=2.37,w_fglm=3):
print('='*80)
eqs = Sequence(eqs)
neqs = len(eqs)
nvars = Sequence(eqs).nvariables()
print(f"{neqs} equations in {nvars} variables", flush=True)
print('-'*80)
mac = macaulay_bound(eqs)
k,d = gb_compl_kd(mac, nvars, neqs)
print(f"Macaulay bound: {mac}", flush=True)
print(f"GB complexity: {k:.1f}w + {d:.1f} ({round(k*w_gb+d,1)})", flush=True)
print('-'*80)
bez = bezout_bound(eqs)
k,d = fglm_compl_kd(bez, nvars, neqs)
print(f"Bézout bound: {factor(bez)}", flush=True)
print(f"FGLM complexity: {k:.1f}w + {d:.1f} ({round(k*w_fglm+d,1)})", flush=True)
print('='*80)