passagemath-brial 10.6.39__cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

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.
Files changed (39) hide show
  1. passagemath_brial/__init__.py +3 -0
  2. passagemath_brial-10.6.39.dist-info/METADATA +97 -0
  3. passagemath_brial-10.6.39.dist-info/RECORD +39 -0
  4. passagemath_brial-10.6.39.dist-info/WHEEL +6 -0
  5. passagemath_brial-10.6.39.dist-info/top_level.txt +3 -0
  6. passagemath_brial.libs/libbrial-c4edc49f.so.3.0.7 +0 -0
  7. passagemath_brial.libs/libbrial_groebner-630cf042.so.3.0.7 +0 -0
  8. passagemath_brial.libs/libgmp-6e109695.so.10.5.0 +0 -0
  9. passagemath_brial.libs/libm4ri-9da2b874.so.1.0.0 +0 -0
  10. passagemath_brial.libs/libpng16-b4a91cd1.so.16.43.0 +0 -0
  11. sage/all__sagemath_brial.py +9 -0
  12. sage/libs/all__sagemath_brial.py +1 -0
  13. sage/libs/polybori/__init__.pxd +2 -0
  14. sage/libs/polybori/decl.pxd +401 -0
  15. sage/libs/polybori/pb_wrap.h +133 -0
  16. sage/rings/all__sagemath_brial.py +1 -0
  17. sage/rings/polynomial/all__sagemath_brial.py +1 -0
  18. sage/rings/polynomial/pbori/PyPolyBoRi.py +123 -0
  19. sage/rings/polynomial/pbori/__init__.py +44 -0
  20. sage/rings/polynomial/pbori/blocks.py +443 -0
  21. sage/rings/polynomial/pbori/cnf.py +241 -0
  22. sage/rings/polynomial/pbori/easy_polynomials.py +56 -0
  23. sage/rings/polynomial/pbori/fglm.py +93 -0
  24. sage/rings/polynomial/pbori/frontend.py +70 -0
  25. sage/rings/polynomial/pbori/gbcore.py +634 -0
  26. sage/rings/polynomial/pbori/gbrefs.py +127 -0
  27. sage/rings/polynomial/pbori/heuristics.py +35 -0
  28. sage/rings/polynomial/pbori/interpolate.py +115 -0
  29. sage/rings/polynomial/pbori/interred.py +35 -0
  30. sage/rings/polynomial/pbori/ll.py +292 -0
  31. sage/rings/polynomial/pbori/nf.py +662 -0
  32. sage/rings/polynomial/pbori/parallel.py +298 -0
  33. sage/rings/polynomial/pbori/pbori.cpython-314-x86_64-linux-gnu.so +0 -0
  34. sage/rings/polynomial/pbori/pbori.pxd +127 -0
  35. sage/rings/polynomial/pbori/pbori.pyx +8107 -0
  36. sage/rings/polynomial/pbori/randompoly.py +105 -0
  37. sage/rings/polynomial/pbori/rank.py +27 -0
  38. sage/rings/polynomial/pbori/specialsets.py +112 -0
  39. sage/rings/polynomial/pbori/statistics.py +31 -0
@@ -0,0 +1,105 @@
1
+ # sage_setup: distribution = sagemath-brial
2
+ # sage.doctest: needs sage.rings.polynomial.pbori
3
+ from random import Random
4
+ from pprint import pformat
5
+
6
+ from .PyPolyBoRi import (Monomial, Polynomial, Variable)
7
+ from .pbori import random_set, set_random_seed, ll_red_nf_redsb
8
+ from .ll import ll_encode
9
+ from .blocks import declare_ring
10
+
11
+
12
+ def gen_random_poly(ring, l, deg, vars_set, seed=123):
13
+ """
14
+ Generate a random polynomial with coefficients in ``ring``.
15
+
16
+ EXAMPLES::
17
+
18
+ sage: from sage.rings.polynomial.pbori.PyPolyBoRi import Ring, Variable
19
+ sage: from sage.rings.polynomial.pbori.randompoly import gen_random_poly
20
+ sage: r = Ring(16)
21
+ sage: vars = [Variable(i,r) for i in range(10)]
22
+ sage: gen_random_poly(r, 4, 10, vars) # random
23
+ x(0)*x(1)*x(2)*x(5)*x(8)*x(9) + x(0)*x(1)*x(4)*x(6) + x(0)*x(2)*x(3)*x(7)*x(9) + x(5)*x(8)
24
+ """
25
+ myrange = vars_set
26
+ r = Random(seed)
27
+
28
+ def helper(samples):
29
+ if samples == 0:
30
+ return Polynomial(ring.zero())
31
+ if samples == 1:
32
+ d = r.randint(0, deg)
33
+ variables = r.sample(myrange, d)
34
+ m = Monomial(ring)
35
+ for v in sorted(set(variables), reverse=True):
36
+ m = m * Variable(v, ring)
37
+ return Polynomial(m)
38
+ assert samples >= 2
39
+ return helper(samples // 2) + helper(samples - samples // 2)
40
+ p = Polynomial(ring.zero())
41
+ while len(p) < l:
42
+ p = Polynomial(p.set().union(helper(l - len(p)).set()))
43
+ return p
44
+
45
+
46
+ def sparse_random_system(ring, number_of_polynomials, variables_per_polynomial,
47
+ degree, random_seed=None):
48
+ r"""
49
+ Generate a sparse random system.
50
+
51
+ Generate a system, which is sparse in the sense, that each polynomial
52
+ contains only a small subset of variables. In each variable that occurs
53
+ in a polynomial it is dense in the terms up to the given degree
54
+ (every term occurs with probability 1/2).
55
+
56
+ The system will be satisfiable by at least one solution.
57
+
58
+ TESTS::
59
+
60
+ sage: from sage.rings.polynomial.pbori import Ring, groebner_basis
61
+ sage: r = Ring(10)
62
+ sage: from sage.rings.polynomial.pbori.randompoly import sparse_random_system
63
+ sage: s = sparse_random_system(r, number_of_polynomials=20, variables_per_polynomial=3, degree=2, random_seed=int(123))
64
+ sage: [p.deg() for p in s]
65
+ [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
66
+ sage: sorted(groebner_basis(s), reverse=True)
67
+ [x(0), x(1) + 1, x(2), x(3) + 1, x(4) + 1, x(5), x(6), x(7) + 1, x(8) + 1, x(9) + 1]
68
+ """
69
+ if random_seed is not None:
70
+ set_random_seed(random_seed)
71
+ random_generator = Random(random_seed)
72
+ variables = [ring.variable(i) for i in range(ring.n_variables())]
73
+ solutions = [v + random_generator.randint(0, 1) for v in variables]
74
+ solutions = ll_encode(solutions)
75
+ res = []
76
+ while len(res) < number_of_polynomials:
77
+ variables_as_monomial = Monomial(
78
+ random_generator.sample(
79
+ variables,
80
+ variables_per_polynomial)
81
+ )
82
+ p = Polynomial(random_set(variables_as_monomial, 2 ** (
83
+ variables_per_polynomial - 1)))
84
+ p = sum([p.graded_part(i) for i in range(degree + 1)])
85
+ if p.deg() == degree:
86
+ res.append(p)
87
+ # evaluate it to guarantee a solution
88
+ return [p + ll_red_nf_redsb(p, solutions) for p in res]
89
+
90
+
91
+ def sparse_random_system_data_file_content(number_of_variables, **kwds):
92
+ r"""
93
+ TESTS::
94
+
95
+ sage: from sage.rings.polynomial.pbori.randompoly import sparse_random_system_data_file_content
96
+ sage: sparse_random_system_data_file_content(10, number_of_polynomials=5, variables_per_polynomial=3, degree=2, random_seed=int(123))
97
+ "declare_ring(['x'+str(i) for in range(10)])\nideal=\\\n[...]\n\n"
98
+ """
99
+ dummy_dict = {}
100
+ r = declare_ring(['x' + str(i) for i in range(number_of_variables)],
101
+ dummy_dict)
102
+ polynomials = sparse_random_system(r, **kwds)
103
+ polynomials = pformat(polynomials)
104
+ return "declare_ring(['x'+str(i) for in range({})])\nideal=\\\n{}\n\n".format(
105
+ number_of_variables, polynomials)
@@ -0,0 +1,27 @@
1
+ # sage_setup: distribution = sagemath-brial
2
+ # sage.doctest: needs sage.rings.polynomial.pbori
3
+ def input_signals(p):
4
+ return list((p + p.lex_lead()).vars_as_monomial().variables())
5
+
6
+
7
+ def output_signal(p):
8
+ return next(iter(p.lex_lead().variables()))
9
+
10
+
11
+ def rank(data):
12
+ parents = {}
13
+ res = {}
14
+ for p in data:
15
+ out = output_signal(p)
16
+ parents.setdefault(out, [])
17
+ for v in input_signals(p):
18
+ parents.setdefault(v, []).append(out)
19
+
20
+ def do_rank(v):
21
+ if v in res:
22
+ return res[v]
23
+ my_res = res[v] = max((do_rank(p) + 1 for p in parents[v]), default=0)
24
+ return my_res
25
+ for v in parents:
26
+ do_rank(v)
27
+ return res
@@ -0,0 +1,112 @@
1
+ # sage_setup: distribution = sagemath-brial
2
+ # sage.doctest: needs sage.rings.polynomial.pbori
3
+ from .pbori import (top_index, if_then_else,
4
+ mod_mon_set, BooleSet, BooleConstant)
5
+ from .PyPolyBoRi import (Polynomial, Monomial, Variable)
6
+
7
+
8
+ def all_monomials_of_degree_d_old(d, variables):
9
+ """
10
+ Return monomials of degree d in the given variables.
11
+
12
+ Obsolete version ?
13
+ """
14
+ if d == 0:
15
+ return BooleConstant(1)
16
+
17
+ if not variables:
18
+ return []
19
+ variables = sorted(set(variables), reverse=True, key=top_index)
20
+
21
+ m = variables[-1]
22
+ for v in variables[:-1]:
23
+ m = v + m
24
+ m = m.set()
25
+ i = 0
26
+ res = Polynomial(variables[0].ring().one()).set()
27
+ while i < d:
28
+ i += 1
29
+ res = res.cartesian_product(m).diff(res)
30
+ return res
31
+
32
+
33
+ def all_monomials_of_degree_d(d, variables):
34
+ """
35
+ Return monomials of degree d in the given variables.
36
+ """
37
+ variables = Monomial(variables)
38
+ variables = list(variables.variables())
39
+ if not variables:
40
+ assert d == 0
41
+ return BooleConstant(1)
42
+ ring = variables[0].ring()
43
+ if d > len(variables):
44
+ return Polynomial(0, ring)
45
+ if d < 0:
46
+ return Polynomial(1, ring)
47
+
48
+ deg_variables = variables[-d:]
49
+ # this ensures sorting by indices
50
+ res = Monomial(deg_variables)
51
+
52
+ for i in range(1, len(variables) - d + 1):
53
+ deg_variables = variables[-d - i:-i]
54
+ res = Polynomial(res)
55
+ nav = res.navigation()
56
+ navs = []
57
+ while not nav.constant():
58
+ navs.append(BooleSet(nav, ring))
59
+ nav = nav.then_branch()
60
+ acc = Polynomial(1, ring)
61
+ for (nav, v) in reversed(zip(navs, deg_variables)):
62
+ acc = if_then_else(v, acc, nav)
63
+ res = acc
64
+ return res.set()
65
+
66
+
67
+ def power_set(variables):
68
+ """
69
+ Return all subsets of the given variables.
70
+ """
71
+ if not variables:
72
+ return BooleConstant(1)
73
+ variables = sorted(set(variables), reverse=True, key=top_index)
74
+ res = Polynomial(1, variables[0].ring()).set()
75
+ for v in variables:
76
+ res = if_then_else(v, res, res)
77
+ return res
78
+
79
+
80
+ if __name__ == '__main__':
81
+ from .blocks import declare_ring, Block
82
+ r = declare_ring([Block("x", 10000)], globals())
83
+ print(list(all_monomials_of_degree_d(0, [Variable(i) for i in range(100)])))
84
+ print(list(all_monomials_of_degree_d(1, [Variable(i) for i in range(10)])))
85
+ print(list(all_monomials_of_degree_d(2, [Variable(i) for i in range(4)])))
86
+ print(list(all_monomials_of_degree_d(3, [Variable(i) for i in range(4)])))
87
+ print(list(all_monomials_of_degree_d(4, [Variable(i) for i in range(4)])))
88
+ print(list(all_monomials_of_degree_d(0, [])))
89
+ print(list(all_monomials_of_degree_d(1, [])))
90
+ print(list(power_set([Variable(i) for i in range(2)])))
91
+ print(list(power_set([Variable(i) for i in range(4)])))
92
+ print(list(power_set()))
93
+ # every monomial in the first 8 var, which is at most linear in the first 5
94
+ print(list(mod_mon_set(
95
+ power_set([Variable(i) for i in range(8)]),
96
+ all_monomials_of_degree_d(2, [Variable(i) for i in range(5)]))))
97
+
98
+ # specialized normal form computation
99
+ print(Polynomial(
100
+ mod_mon_set(
101
+ (x(1) * x(2) + x(1) + 1).set(),
102
+ all_monomials_of_degree_d(2, [Variable(i) for i in range(1000)]))))
103
+ print(list(mod_mon_set(
104
+ power_set([Variable(i) for i in range(50)]),
105
+ all_monomials_of_degree_d(2, [Variable(i) for i in range(1000)]))))
106
+
107
+
108
+ def monomial_from_indices(ring, indices):
109
+ res = Monomial(ring)
110
+ for i in sorted(indices, reverse=True):
111
+ res = res * ring.variable(i)
112
+ return res
@@ -0,0 +1,31 @@
1
+ # sage_setup: distribution = sagemath-brial
2
+ # sage.doctest: needs sage.rings.polynomial.pbori
3
+ from .pbori import top_index, BooleConstant
4
+ from .PyPolyBoRi import Monomial, Polynomial
5
+
6
+
7
+ def used_vars(l, bound=None):
8
+ if not l:
9
+ return BooleConstant(1)
10
+ m = Monomial(Polynomial(next(iter(l))).vars_as_monomial())
11
+ for p in l[1:]:
12
+ m = m * Polynomial(p).vars_as_monomial()
13
+ if bound and len(m) > bound:
14
+ return m
15
+ return m
16
+
17
+
18
+ def used_vars_set(l, bound=None):
19
+ if not l:
20
+ return BooleConstant(1)
21
+ s = set()
22
+ for p in l:
23
+ s.update(Polynomial(p).vars_as_monomial().variables())
24
+ if bound and len(s) > bound:
25
+ break
26
+ sorted_s = sorted(s, key=top_index, reverse=True)
27
+ m = Monomial(next(iter(l)).ring())
28
+ for v in sorted_s:
29
+ m = v * m
30
+
31
+ return m