passagemath-sirocco 10.8.1a1__cp314-cp314-macosx_13_0_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.
@@ -0,0 +1,3 @@
1
+ # sage_setup: distribution = sagemath-sirocco
2
+
3
+ from sage.all__sagemath_sirocco import *
@@ -0,0 +1,123 @@
1
+ Metadata-Version: 2.4
2
+ Name: passagemath-sirocco
3
+ Version: 10.8.1a1
4
+ Summary: passagemath: Certified root continuation with sirocco
5
+ Author-email: The Sage Developers <sage-support@googlegroups.com>
6
+ Maintainer: Matthias Köppe, passagemath contributors
7
+ License-Expression: GPL-2.0-or-later
8
+ Project-URL: release notes, https://github.com/passagemath/passagemath/releases
9
+ Project-URL: repo (upstream), https://github.com/sagemath/sage
10
+ Project-URL: repo, https://github.com/passagemath/passagemath
11
+ Project-URL: documentation, https://passagemath.org/docs/latest
12
+ Project-URL: homepage (upstream), https://www.sagemath.org
13
+ Project-URL: discourse, https://passagemath.discourse.group
14
+ Project-URL: tracker (upstream), https://github.com/sagemath/sage/issues
15
+ Project-URL: tracker, https://github.com/passagemath/passagemath/issues
16
+ Classifier: Development Status :: 6 - Mature
17
+ Classifier: Intended Audience :: Education
18
+ Classifier: Intended Audience :: Science/Research
19
+ Classifier: Operating System :: POSIX
20
+ Classifier: Operating System :: POSIX :: Linux
21
+ Classifier: Operating System :: MacOS :: MacOS X
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: Implementation :: CPython
28
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
29
+ Requires-Python: <3.15,>=3.11
30
+ Description-Content-Type: text/x-rst
31
+ Requires-Dist: cysignals!=1.12.4; sys_platform == "win32"
32
+ Requires-Dist: cysignals!=1.12.0,>=1.11.2
33
+ Requires-Dist: passagemath-modules==10.8.1.alpha1
34
+ Provides-Extra: test
35
+ Requires-Dist: passagemath-combinat; extra == "test"
36
+ Requires-Dist: passagemath-graphs; extra == "test"
37
+ Requires-Dist: passagemath-groups; extra == "test"
38
+ Requires-Dist: passagemath-polyhedra; extra == "test"
39
+ Requires-Dist: passagemath-repl; extra == "test"
40
+ Requires-Dist: passagemath-schemes; extra == "test"
41
+
42
+ ==================================================================================
43
+ passagemath: Certified root continuation with sirocco
44
+ ==================================================================================
45
+
46
+ `passagemath <https://github.com/passagemath/passagemath>`__ is open
47
+ source mathematical software in Python, released under the GNU General
48
+ Public Licence GPLv2+.
49
+
50
+ It is a fork of `SageMath <https://www.sagemath.org/>`__, which has been
51
+ developed 2005-2025 under the motto “Creating a Viable Open Source
52
+ Alternative to Magma, Maple, Mathematica, and MATLAB”.
53
+
54
+ The passagemath fork uses the motto "Creating a Free Passage Between the
55
+ Scientific Python Ecosystem and Mathematical Software Communities."
56
+ It was created in October 2024 with the following goals:
57
+
58
+ - providing modularized installation with pip,
59
+ - establishing first-class membership in the scientific Python
60
+ ecosystem,
61
+ - giving `clear attribution of upstream
62
+ projects <https://groups.google.com/g/sage-devel/c/6HO1HEtL1Fs/m/G002rPGpAAAJ>`__,
63
+ - providing independently usable Python interfaces to upstream
64
+ libraries,
65
+ - offering `platform portability and integration testing
66
+ services <https://github.com/passagemath/passagemath/issues/704>`__
67
+ to upstream projects,
68
+ - inviting collaborations with upstream projects,
69
+ - `building a professional, respectful, inclusive
70
+ community <https://groups.google.com/g/sage-devel/c/xBzaINHWwUQ>`__,
71
+ - `empowering Sage users to participate in the scientific Python ecosystem
72
+ <https://github.com/passagemath/passagemath/issues/248>`__ by publishing packages,
73
+ - developing a port to `Pyodide <https://pyodide.org/en/stable/>`__ for
74
+ serverless deployment with Javascript,
75
+ - developing a native Windows port.
76
+
77
+ `Full documentation <https://passagemath.org/docs/latest/html/en/index.html>`__ is
78
+ available online.
79
+
80
+ passagemath attempts to support and provides binary wheels suitable for
81
+ all major Linux distributions and recent versions of macOS.
82
+
83
+ Binary wheels for native Windows (x86_64) are are available for a subset of
84
+ the passagemath distributions. Use of the full functionality of passagemath
85
+ on Windows currently requires the use of Windows Subsystem for Linux (WSL)
86
+ or virtualization.
87
+
88
+ The supported Python versions in the passagemath 10.6.x series are 3.10.x-3.14.x.
89
+
90
+
91
+ About this pip-installable distribution package
92
+ -----------------------------------------------
93
+
94
+ This pip-installable distribution ``passagemath-sirocco`` provides a Cython interface
95
+ to the `sirocco <https://github.com/miguelmarco/SIROCCO2>`_ library for computing
96
+ topologically certified root continuation of bivariate polynomials.
97
+
98
+
99
+ What is included
100
+ ----------------
101
+
102
+ * `sage.libs.sirocco <https://github.com/passagemath/passagemath/blob/main/src/sage/libs/sirocco.pyx>`_
103
+
104
+
105
+ Examples
106
+ --------
107
+
108
+ ::
109
+
110
+ $ pipx run --pip-args="--prefer-binary" --spec "passagemath-sirocco[test]" ipython
111
+
112
+ In [1]: from passagemath_sirocco import *
113
+
114
+ In [2]: from sage.libs.sirocco import contpath
115
+
116
+ In [3]: pol = list(map(RR,[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
117
+
118
+ In [4]: contpath(2, pol, RR(0), RR(0))
119
+ Out[4]:
120
+ [(0.0, 0.0, 0.0),
121
+ (0.3535533905932738, -0.12500000000000003, 0.0),
122
+ (0.7071067811865476, -0.5000000000000001, 0.0),
123
+ (1.0, -1.0, 0.0)]
@@ -0,0 +1,12 @@
1
+ passagemath_sirocco-10.8.1a1.dist-info/RECORD,,
2
+ passagemath_sirocco-10.8.1a1.dist-info/WHEEL,sha256=0b5LPYpZuejuC45Qy8kskxCl_dBB2BB2HJGLhdQK0sg,155
3
+ passagemath_sirocco-10.8.1a1.dist-info/top_level.txt,sha256=WaBfhxtou-FhXK710boiIi1wnus0aQ5K02SO4T3yCrg,26
4
+ passagemath_sirocco-10.8.1a1.dist-info/METADATA,sha256=mCzMaVx6b-Yh-d0UlByTZpWDk1AKWUAxzFxkJiSwqGU,5355
5
+ passagemath_sirocco/__init__.py,sha256=13fj3jvtMS6cIdUTHWR6olfV09gKD0e2Wi5JIMSxNik,88
6
+ passagemath_sirocco/.dylibs/libgmp.10.dylib,sha256=3gZLlmh46b7M66MbRtnJRyeyZTWVot1LFBCkoybABUA,488712
7
+ passagemath_sirocco/.dylibs/libmpfr.6.dylib,sha256=OIhUMaY-7wDA4oIMu2xb9oBWQwoQt-eRlelpay9g6m4,465224
8
+ passagemath_sirocco/.dylibs/libsirocco.0.0.0.dylib,sha256=QePj41ApE_cGG2XI-CzNp8T3cUAsHv1dq2EojAM0RII,236856
9
+ sage/all__sagemath_sirocco.py,sha256=DETVlVgWYtPIsdw2wOM9oqCp-RfID9ymRYZCbm70-io,188
10
+ sage/libs/sirocco.cpython-314-darwin.so,sha256=oGSwqfYVTRIda55HQhCQf2BUmofY_C5PvdTSaRM1vuU,133176
11
+ sage/libs/sirocco.pyx,sha256=7YNwWX3wbNUoa2V6_OE9IjaVcdhCfdy5_4lO6Sgvv7E,11095
12
+ sage/libs/all__sagemath_sirocco.py,sha256=BnLb9I-8oMsUKI5uRle_hxp92wdAAez3PgwDyMK-KRc,46
@@ -0,0 +1,6 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.1)
3
+ Root-Is-Purelib: false
4
+ Tag: cp314-cp314-macosx_13_0_x86_64
5
+ Generator: delocate 0.13.1.dev42+ga0af70b54
6
+
@@ -0,0 +1,3 @@
1
+
2
+ passagemath_sirocco
3
+ sage
@@ -0,0 +1,9 @@
1
+ # sage_setup: distribution = sagemath-sirocco
2
+ # delvewheel: patch
3
+
4
+ try:
5
+ from sage.all__sagemath_schemes import *
6
+ except ImportError:
7
+ pass
8
+
9
+ from sage.all__sagemath_modules import *
@@ -0,0 +1 @@
1
+ # sage_setup: distribution = sagemath-sirocco
Binary file
sage/libs/sirocco.pyx ADDED
@@ -0,0 +1,288 @@
1
+ # cython: boundscheck=False, wraparound=False
2
+ # distutils: libraries = sirocco
3
+ # distutils: language = c++
4
+ # sage_setup: distribution = sagemath-sirocco
5
+
6
+ r"""
7
+ Cython wrapper for sirocco library
8
+
9
+ This is used to call the sirocco library directly from Python.
10
+
11
+ AUTHORS:
12
+
13
+ - Miguel Marco (2016-07-19): initial version.
14
+ """
15
+
16
+ from cysignals.signals cimport sig_on, sig_off
17
+ from cysignals.memory cimport check_allocarray, sig_free as free
18
+
19
+ from sage.libs.mpfr cimport *
20
+ from sage.rings.real_mpfr cimport RealNumber
21
+ from sage.rings.real_mpfr import RealField
22
+
23
+ cdef extern from "sirocco.h":
24
+ mpfr_t* homotopyPath_mp(int degree, mpfr_t *_coef, mpfr_t _y0R, mpfr_t _y0I, int prec)
25
+ double* homotopyPath(int degree, double *_coef, double _y0R, double _y0I)
26
+ mpfr_t* homotopyPath_mp_comps(int degree, mpfr_t *_coef, mpfr_t _y0R, mpfr_t _y0I, int prec, int nothercomps, int *degreescomps, mpfr_t *_coefscomps)
27
+ double* homotopyPath_comps(int degree, double *_coef, double _y0R, double _y0I, int nothercomps, int *degreescomps, double *_coefscomps)
28
+
29
+
30
+ cpdef list[list] contpath_mp(int deg, list values, RealNumber y0r, RealNumber y0i, int prec) noexcept:
31
+ """
32
+ Mimics :func:`contpath`, but with the following differences:
33
+
34
+ - The floating point numbers can be arbitrary precision RealNumbers.
35
+
36
+ - A extra argument is needed, indicating the bits of precision used
37
+ in the computations.
38
+
39
+ EXAMPLES::
40
+
41
+ sage: from sage.libs.sirocco import contpath_mp # optional - sirocco
42
+ sage: from sage.rings.real_mpfr import RR
43
+ sage: pol = list(map(RR, [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
44
+ sage: contpath_mp(2, pol, RR(0), RR(0), 53) # optional - sirocco # abs tol 1e-15
45
+ [(0.000000000000000, 0.000000000000000, 0.000000000000000),
46
+ (0.500000000000000, -0.250000000000000, 0.000000000000000),
47
+ (1.00000000000000, -1.00000000000000, 0.000000000000000)]
48
+ """
49
+ cdef mpfr_t* cvalues = <mpfr_t*> check_allocarray(len(values), sizeof(mpfr_t))
50
+ cdef mpfr_t* rop
51
+ cdef int i, j
52
+ cdef mpfr_t y0R
53
+ cdef mpfr_t y0I
54
+
55
+ for j in range(len(values)):
56
+ mpfr_init2(cvalues[j], prec)
57
+ mpfr_set(cvalues[j], (<RealNumber>values[j]).value, MPFR_RNDN)
58
+
59
+ sig_on()
60
+ mpfr_init2(y0R, prec)
61
+ mpfr_set(y0R, (<RealNumber>y0r).value, MPFR_RNDN)
62
+ mpfr_init2(y0I, prec)
63
+ mpfr_set(y0I, (<RealNumber>y0i).value, MPFR_RNDN)
64
+ rop = homotopyPath_mp(deg, cvalues, y0R, y0I, prec)
65
+ sig_off()
66
+
67
+ for j in range(len(values)):
68
+ mpfr_clear(cvalues[j])
69
+ free(cvalues)
70
+
71
+ if rop == NULL:
72
+ raise ValueError("libsirocco could not guarantee one step")
73
+
74
+ cdef int n = mpfr_get_si(rop[0], MPFR_RNDN)
75
+ cdef list l = []
76
+ cdef list inner
77
+ cdef RealNumber RN
78
+ field = RealField(prec)
79
+ for i in range(n):
80
+ inner = []
81
+ for j in range(3*i+1, 3*(i+1)+1):
82
+ RN = <RealNumber> RealNumber.__new__(RealNumber, field)
83
+ mpfr_set(RN.value, rop[j], MPFR_RNDN)
84
+ mpfr_clear(rop[j])
85
+ inner.append(RN)
86
+ l.append(tuple(inner))
87
+ free(rop)
88
+ return l
89
+
90
+ cpdef list[list] contpath_mp_comps(int deg, list values, RealNumber y0r, RealNumber y0i, int prec, list otherdegs, list othercoefs) noexcept:
91
+ """
92
+ Mimics :func:`contpath`, but with the following differences:
93
+
94
+ - The floating point numbers can be arbitrary precision RealNumbers.
95
+
96
+ - A extra argument is needed, indicating the bits of precision used
97
+ in the computations.
98
+
99
+ EXAMPLES::
100
+
101
+ sage: from sage.libs.sirocco import contpath_mp_comps # optional - sirocco
102
+ sage: from sage.rings.real_mpfr import RR
103
+ sage: pol = list(map(RR,[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
104
+ sage: fac = list(map(RR,[0, 0, 0.1, 0.2, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
105
+ sage: contpath_mp_comps(2, pol, RR(0), RR(0), 53, [2], fac) # optional - sirocco # abs tol 1e-15
106
+ [(0.000000000000000, 0.000000000000000, 0.000000000000000),
107
+ (0.125000000000000, -0.0156250000000000, 0.000000000000000),
108
+ (0.250000000000000, -0.0625000000000000, 0.000000000000000),
109
+ (0.375000000000000, -0.140625000000000, 0.000000000000000),
110
+ (0.500000000000000, -0.250000000000000, 0.000000000000000),
111
+ (0.625000000000000, -0.390625000000000, 0.000000000000000),
112
+ (0.750000000000000, -0.562500000000000, 0.000000000000000),
113
+ (0.875000000000000, -0.765625000000000, 0.000000000000000),
114
+ (1.00000000000000, -1.00000000000000, 0.000000000000000)]
115
+ """
116
+
117
+ cdef mpfr_t* cvalues = <mpfr_t*> check_allocarray(len(values), sizeof(mpfr_t))
118
+ cdef mpfr_t* cothercoefs = <mpfr_t*> check_allocarray(len(othercoefs), sizeof(mpfr_t))
119
+ cdef int* cotherdegs = <int*> check_allocarray(len(otherdegs), sizeof(int))
120
+ cdef mpfr_t* rop
121
+ cdef int i, j
122
+ cdef mpfr_t y0R
123
+ cdef mpfr_t y0I
124
+
125
+ for j in range(len(values)):
126
+ mpfr_init2(cvalues[j], prec)
127
+ mpfr_set(cvalues[j], (<RealNumber>values[j]).value, MPFR_RNDN)
128
+
129
+ for j in range(len(othercoefs)):
130
+ mpfr_init2(cothercoefs[j], prec)
131
+ mpfr_set(cothercoefs[j], (<RealNumber>othercoefs[j]).value, MPFR_RNDN)
132
+
133
+ for j in range(len(otherdegs)):
134
+ cotherdegs[j] = int(otherdegs[j])
135
+ sig_on()
136
+ mpfr_init2(y0R, prec)
137
+ mpfr_set(y0R, (<RealNumber>y0r).value, MPFR_RNDN)
138
+ mpfr_init2(y0I, prec)
139
+ mpfr_set(y0I, (<RealNumber>y0i).value, MPFR_RNDN)
140
+ rop = homotopyPath_mp_comps(deg, cvalues, y0R, y0I, prec, int(len(otherdegs)), cotherdegs, cothercoefs)
141
+ sig_off()
142
+ for j in range(len(values)):
143
+ mpfr_clear(cvalues[j])
144
+ free(cvalues)
145
+ for j in range(len(othercoefs)):
146
+ mpfr_clear(cothercoefs[j])
147
+ free(cothercoefs)
148
+ free(cotherdegs)
149
+ if rop == NULL:
150
+ raise ValueError("libsirocco could not guarantee one step")
151
+ cdef int n = mpfr_get_si(rop[0], MPFR_RNDN)
152
+ cdef list l = []
153
+ cdef list inner
154
+ cdef RealNumber RN
155
+ field = RealField(prec)
156
+ for i in range(n):
157
+ inner = []
158
+ for j in range(3*i+1, 3*(i+1)+1):
159
+ RN = <RealNumber> RealNumber.__new__(RealNumber, field)
160
+ mpfr_set(RN.value, rop[j], MPFR_RNDN)
161
+ mpfr_clear(rop[j])
162
+ inner.append(RN)
163
+ l.append(tuple(inner))
164
+ free(rop)
165
+ return l
166
+
167
+
168
+ cpdef list[list] contpath(int deg, list values, double y0r, double y0i) noexcept:
169
+ """
170
+ INPUT:
171
+
172
+ - An integer, representing the degree of the polynomial
173
+
174
+ - A list of floating point numbers. Each four consecutive elements
175
+ of this list represent the interval corresponding to a coefficient.
176
+ Coefficients are listed in increasing deglex order, and inside each
177
+ coefficients, the four numbers represent the lower real, upper real,
178
+ lower imaginary and real imaginary limits of the interval.
179
+
180
+ - A float representing the real part of the initial root approximation
181
+
182
+ - A float representing the imaginary part of the initial root.
183
+
184
+ OUTPUT:
185
+
186
+ A list of tuples. Each tuple represents the `x` value (between 0 and 1)
187
+ and the real and imaginary parts of the `y` value of a vertex in
188
+ the piecewise linear approximation of the path tracked by the root.
189
+
190
+ EXAMPLES::
191
+
192
+ sage: from sage.libs.sirocco import contpath # optional - sirocco
193
+ sage: from sage.rings.real_mpfr import RR
194
+ sage: pol = list(map(RR,[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
195
+ sage: contpath(2, pol, RR(0), RR(0)) # optional - sirocco # abs tol 1e-15
196
+ [(0.0, 0.0, 0.0),
197
+ (0.3535533905932738, -0.12500000000000003, 0.0),
198
+ (0.7071067811865476, -0.5000000000000001, 0.0),
199
+ (1.0, -1.0, 0.0)]
200
+ """
201
+ cdef double* rop
202
+ cdef double* c_values = <double*> check_allocarray(len(values), sizeof(double))
203
+ cdef int i
204
+ for i, v in enumerate(values):
205
+ c_values[i] = values[i]
206
+ cdef double y0R = y0r
207
+ cdef double y0I = y0i
208
+ sig_on()
209
+ rop = homotopyPath(deg, c_values, y0R, y0I)
210
+ sig_off()
211
+ if rop == NULL:
212
+ raise ValueError("libsirocco could not guarantee one step")
213
+ cdef int n = int(rop[0])
214
+ cdef list l = [0] * n
215
+ for i in range(n):
216
+ l[i] = (rop[3*i+1], rop[3*i+2], rop[3*i+3])
217
+ free(rop)
218
+ free(c_values)
219
+ return l
220
+
221
+ cpdef list[list] contpath_comps(int deg, list values, double y0r, double y0i, list otherdegrees, list othercoefs) noexcept:
222
+ """
223
+ INPUT:
224
+
225
+ - An integer, representing the degree of the polynomial
226
+
227
+ - A list of floating point numbers. Each four consecutive elements
228
+ of this list represent the interval corresponding to a coefficient.
229
+ Coefficients are listed in increasing deglex order, and inside each
230
+ coefficients, the four numbers represent the lower real, upper real,
231
+ lower imaginary and real imaginary limits of the interval.
232
+
233
+ - A float representing the real part of the initial root approximation
234
+
235
+ - A float representing the imaginary part of the initial root.
236
+
237
+ OUTPUT:
238
+
239
+ A list of tuples. Each tuple represents the `x` value (between 0 and 1)
240
+ and the real and imaginary parts of the `y` value of a vertex in
241
+ the piecewise linear approximation of the path tracked by the root.
242
+
243
+ EXAMPLES::
244
+
245
+ sage: from sage.libs.sirocco import contpath_comps # optional - sirocco
246
+ sage: from sage.rings.real_mpfr import RR
247
+ sage: pol = list(map(RR,[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
248
+ sage: fac = list(map(RR,[0, 0, 0.1, 0.2, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
249
+ sage: contpath_comps(2, pol, RR(0), RR(0), [2], fac) # optional - sirocco # abs tol 1e-15
250
+ [(0.0, 0.0, 0.0),
251
+ (0.125, -0.015625, 0.0),
252
+ (0.25, -0.0625, 0.0),
253
+ (0.375, -0.140625, 0.0),
254
+ (0.5, -0.25, 0.0),
255
+ (0.625, -0.390625, 0.0),
256
+ (0.75, -0.5625, 0.0),
257
+ (0.875, -0.765625, 0.0),
258
+ (1.0, -1.0, 0.0)]
259
+ """
260
+ cdef double* rop
261
+ cdef double* c_values = <double*> check_allocarray(len(values), sizeof(double))
262
+ cdef int* c_otherdegrees = <int*> check_allocarray(len(otherdegrees), sizeof(int))
263
+ cdef double* c_othercoefs = <double*> check_allocarray(len(othercoefs), sizeof(double))
264
+ cdef int i
265
+ for i, v in enumerate(values):
266
+ c_values[i] = values[i]
267
+
268
+ for i, v in enumerate(otherdegrees):
269
+ c_otherdegrees[i] = otherdegrees[i]
270
+ for i, v in enumerate(othercoefs):
271
+ c_othercoefs[i] = othercoefs[i]
272
+
273
+ cdef double y0R = y0r
274
+ cdef double y0I = y0i
275
+ sig_on()
276
+ rop = homotopyPath_comps(deg, c_values, y0R, y0I, int(len(otherdegrees)), c_otherdegrees, c_othercoefs)
277
+ sig_off()
278
+ if rop == NULL:
279
+ raise ValueError("libsirocco could not guarantee one step")
280
+ cdef int n = int(rop[0])
281
+ cdef list l = [0] * n
282
+ for i in range(n):
283
+ l[i] = (rop[3*i+1], rop[3*i+2], rop[3*i+3])
284
+ free(rop)
285
+ free(c_values)
286
+ free(c_otherdegrees)
287
+ free(c_othercoefs)
288
+ return l