Coverage for /usr/lib/python3/dist-packages/sympy/polys/compatibility.py: 52%
973 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1"""Compatibility interface between dense and sparse polys. """
4from sympy.polys.densearith import dup_add_term
5from sympy.polys.densearith import dmp_add_term
6from sympy.polys.densearith import dup_sub_term
7from sympy.polys.densearith import dmp_sub_term
8from sympy.polys.densearith import dup_mul_term
9from sympy.polys.densearith import dmp_mul_term
10from sympy.polys.densearith import dup_add_ground
11from sympy.polys.densearith import dmp_add_ground
12from sympy.polys.densearith import dup_sub_ground
13from sympy.polys.densearith import dmp_sub_ground
14from sympy.polys.densearith import dup_mul_ground
15from sympy.polys.densearith import dmp_mul_ground
16from sympy.polys.densearith import dup_quo_ground
17from sympy.polys.densearith import dmp_quo_ground
18from sympy.polys.densearith import dup_exquo_ground
19from sympy.polys.densearith import dmp_exquo_ground
20from sympy.polys.densearith import dup_lshift
21from sympy.polys.densearith import dup_rshift
22from sympy.polys.densearith import dup_abs
23from sympy.polys.densearith import dmp_abs
24from sympy.polys.densearith import dup_neg
25from sympy.polys.densearith import dmp_neg
26from sympy.polys.densearith import dup_add
27from sympy.polys.densearith import dmp_add
28from sympy.polys.densearith import dup_sub
29from sympy.polys.densearith import dmp_sub
30from sympy.polys.densearith import dup_add_mul
31from sympy.polys.densearith import dmp_add_mul
32from sympy.polys.densearith import dup_sub_mul
33from sympy.polys.densearith import dmp_sub_mul
34from sympy.polys.densearith import dup_mul
35from sympy.polys.densearith import dmp_mul
36from sympy.polys.densearith import dup_sqr
37from sympy.polys.densearith import dmp_sqr
38from sympy.polys.densearith import dup_pow
39from sympy.polys.densearith import dmp_pow
40from sympy.polys.densearith import dup_pdiv
41from sympy.polys.densearith import dup_prem
42from sympy.polys.densearith import dup_pquo
43from sympy.polys.densearith import dup_pexquo
44from sympy.polys.densearith import dmp_pdiv
45from sympy.polys.densearith import dmp_prem
46from sympy.polys.densearith import dmp_pquo
47from sympy.polys.densearith import dmp_pexquo
48from sympy.polys.densearith import dup_rr_div
49from sympy.polys.densearith import dmp_rr_div
50from sympy.polys.densearith import dup_ff_div
51from sympy.polys.densearith import dmp_ff_div
52from sympy.polys.densearith import dup_div
53from sympy.polys.densearith import dup_rem
54from sympy.polys.densearith import dup_quo
55from sympy.polys.densearith import dup_exquo
56from sympy.polys.densearith import dmp_div
57from sympy.polys.densearith import dmp_rem
58from sympy.polys.densearith import dmp_quo
59from sympy.polys.densearith import dmp_exquo
60from sympy.polys.densearith import dup_max_norm
61from sympy.polys.densearith import dmp_max_norm
62from sympy.polys.densearith import dup_l1_norm
63from sympy.polys.densearith import dmp_l1_norm
64from sympy.polys.densearith import dup_l2_norm_squared
65from sympy.polys.densearith import dmp_l2_norm_squared
66from sympy.polys.densearith import dup_expand
67from sympy.polys.densearith import dmp_expand
68from sympy.polys.densebasic import dup_LC
69from sympy.polys.densebasic import dmp_LC
70from sympy.polys.densebasic import dup_TC
71from sympy.polys.densebasic import dmp_TC
72from sympy.polys.densebasic import dmp_ground_LC
73from sympy.polys.densebasic import dmp_ground_TC
74from sympy.polys.densebasic import dup_degree
75from sympy.polys.densebasic import dmp_degree
76from sympy.polys.densebasic import dmp_degree_in
77from sympy.polys.densebasic import dmp_to_dict
78from sympy.polys.densetools import dup_integrate
79from sympy.polys.densetools import dmp_integrate
80from sympy.polys.densetools import dmp_integrate_in
81from sympy.polys.densetools import dup_diff
82from sympy.polys.densetools import dmp_diff
83from sympy.polys.densetools import dmp_diff_in
84from sympy.polys.densetools import dup_eval
85from sympy.polys.densetools import dmp_eval
86from sympy.polys.densetools import dmp_eval_in
87from sympy.polys.densetools import dmp_eval_tail
88from sympy.polys.densetools import dmp_diff_eval_in
89from sympy.polys.densetools import dup_trunc
90from sympy.polys.densetools import dmp_trunc
91from sympy.polys.densetools import dmp_ground_trunc
92from sympy.polys.densetools import dup_monic
93from sympy.polys.densetools import dmp_ground_monic
94from sympy.polys.densetools import dup_content
95from sympy.polys.densetools import dmp_ground_content
96from sympy.polys.densetools import dup_primitive
97from sympy.polys.densetools import dmp_ground_primitive
98from sympy.polys.densetools import dup_extract
99from sympy.polys.densetools import dmp_ground_extract
100from sympy.polys.densetools import dup_real_imag
101from sympy.polys.densetools import dup_mirror
102from sympy.polys.densetools import dup_scale
103from sympy.polys.densetools import dup_shift
104from sympy.polys.densetools import dup_transform
105from sympy.polys.densetools import dup_compose
106from sympy.polys.densetools import dmp_compose
107from sympy.polys.densetools import dup_decompose
108from sympy.polys.densetools import dmp_lift
109from sympy.polys.densetools import dup_sign_variations
110from sympy.polys.densetools import dup_clear_denoms
111from sympy.polys.densetools import dmp_clear_denoms
112from sympy.polys.densetools import dup_revert
113from sympy.polys.euclidtools import dup_half_gcdex
114from sympy.polys.euclidtools import dmp_half_gcdex
115from sympy.polys.euclidtools import dup_gcdex
116from sympy.polys.euclidtools import dmp_gcdex
117from sympy.polys.euclidtools import dup_invert
118from sympy.polys.euclidtools import dmp_invert
119from sympy.polys.euclidtools import dup_euclidean_prs
120from sympy.polys.euclidtools import dmp_euclidean_prs
121from sympy.polys.euclidtools import dup_primitive_prs
122from sympy.polys.euclidtools import dmp_primitive_prs
123from sympy.polys.euclidtools import dup_inner_subresultants
124from sympy.polys.euclidtools import dup_subresultants
125from sympy.polys.euclidtools import dup_prs_resultant
126from sympy.polys.euclidtools import dup_resultant
127from sympy.polys.euclidtools import dmp_inner_subresultants
128from sympy.polys.euclidtools import dmp_subresultants
129from sympy.polys.euclidtools import dmp_prs_resultant
130from sympy.polys.euclidtools import dmp_zz_modular_resultant
131from sympy.polys.euclidtools import dmp_zz_collins_resultant
132from sympy.polys.euclidtools import dmp_qq_collins_resultant
133from sympy.polys.euclidtools import dmp_resultant
134from sympy.polys.euclidtools import dup_discriminant
135from sympy.polys.euclidtools import dmp_discriminant
136from sympy.polys.euclidtools import dup_rr_prs_gcd
137from sympy.polys.euclidtools import dup_ff_prs_gcd
138from sympy.polys.euclidtools import dmp_rr_prs_gcd
139from sympy.polys.euclidtools import dmp_ff_prs_gcd
140from sympy.polys.euclidtools import dup_zz_heu_gcd
141from sympy.polys.euclidtools import dmp_zz_heu_gcd
142from sympy.polys.euclidtools import dup_qq_heu_gcd
143from sympy.polys.euclidtools import dmp_qq_heu_gcd
144from sympy.polys.euclidtools import dup_inner_gcd
145from sympy.polys.euclidtools import dmp_inner_gcd
146from sympy.polys.euclidtools import dup_gcd
147from sympy.polys.euclidtools import dmp_gcd
148from sympy.polys.euclidtools import dup_rr_lcm
149from sympy.polys.euclidtools import dup_ff_lcm
150from sympy.polys.euclidtools import dup_lcm
151from sympy.polys.euclidtools import dmp_rr_lcm
152from sympy.polys.euclidtools import dmp_ff_lcm
153from sympy.polys.euclidtools import dmp_lcm
154from sympy.polys.euclidtools import dmp_content
155from sympy.polys.euclidtools import dmp_primitive
156from sympy.polys.euclidtools import dup_cancel
157from sympy.polys.euclidtools import dmp_cancel
158from sympy.polys.factortools import dup_trial_division
159from sympy.polys.factortools import dmp_trial_division
160from sympy.polys.factortools import dup_zz_mignotte_bound
161from sympy.polys.factortools import dmp_zz_mignotte_bound
162from sympy.polys.factortools import dup_zz_hensel_step
163from sympy.polys.factortools import dup_zz_hensel_lift
164from sympy.polys.factortools import dup_zz_zassenhaus
165from sympy.polys.factortools import dup_zz_irreducible_p
166from sympy.polys.factortools import dup_cyclotomic_p
167from sympy.polys.factortools import dup_zz_cyclotomic_poly
168from sympy.polys.factortools import dup_zz_cyclotomic_factor
169from sympy.polys.factortools import dup_zz_factor_sqf
170from sympy.polys.factortools import dup_zz_factor
171from sympy.polys.factortools import dmp_zz_wang_non_divisors
172from sympy.polys.factortools import dmp_zz_wang_lead_coeffs
173from sympy.polys.factortools import dup_zz_diophantine
174from sympy.polys.factortools import dmp_zz_diophantine
175from sympy.polys.factortools import dmp_zz_wang_hensel_lifting
176from sympy.polys.factortools import dmp_zz_wang
177from sympy.polys.factortools import dmp_zz_factor
178from sympy.polys.factortools import dup_qq_i_factor
179from sympy.polys.factortools import dup_zz_i_factor
180from sympy.polys.factortools import dmp_qq_i_factor
181from sympy.polys.factortools import dmp_zz_i_factor
182from sympy.polys.factortools import dup_ext_factor
183from sympy.polys.factortools import dmp_ext_factor
184from sympy.polys.factortools import dup_gf_factor
185from sympy.polys.factortools import dmp_gf_factor
186from sympy.polys.factortools import dup_factor_list
187from sympy.polys.factortools import dup_factor_list_include
188from sympy.polys.factortools import dmp_factor_list
189from sympy.polys.factortools import dmp_factor_list_include
190from sympy.polys.factortools import dup_irreducible_p
191from sympy.polys.factortools import dmp_irreducible_p
192from sympy.polys.rootisolation import dup_sturm
193from sympy.polys.rootisolation import dup_root_upper_bound
194from sympy.polys.rootisolation import dup_root_lower_bound
195from sympy.polys.rootisolation import dup_step_refine_real_root
196from sympy.polys.rootisolation import dup_inner_refine_real_root
197from sympy.polys.rootisolation import dup_outer_refine_real_root
198from sympy.polys.rootisolation import dup_refine_real_root
199from sympy.polys.rootisolation import dup_inner_isolate_real_roots
200from sympy.polys.rootisolation import dup_inner_isolate_positive_roots
201from sympy.polys.rootisolation import dup_inner_isolate_negative_roots
202from sympy.polys.rootisolation import dup_isolate_real_roots_sqf
203from sympy.polys.rootisolation import dup_isolate_real_roots
204from sympy.polys.rootisolation import dup_isolate_real_roots_list
205from sympy.polys.rootisolation import dup_count_real_roots
206from sympy.polys.rootisolation import dup_count_complex_roots
207from sympy.polys.rootisolation import dup_isolate_complex_roots_sqf
208from sympy.polys.rootisolation import dup_isolate_all_roots_sqf
209from sympy.polys.rootisolation import dup_isolate_all_roots
211from sympy.polys.sqfreetools import (
212 dup_sqf_p, dmp_sqf_p, dup_sqf_norm, dmp_sqf_norm, dup_gf_sqf_part, dmp_gf_sqf_part,
213 dup_sqf_part, dmp_sqf_part, dup_gf_sqf_list, dmp_gf_sqf_list, dup_sqf_list,
214 dup_sqf_list_include, dmp_sqf_list, dmp_sqf_list_include, dup_gff_list, dmp_gff_list)
216from sympy.polys.galoistools import (
217 gf_degree, gf_LC, gf_TC, gf_strip, gf_from_dict,
218 gf_to_dict, gf_from_int_poly, gf_to_int_poly, gf_neg, gf_add_ground, gf_sub_ground,
219 gf_mul_ground, gf_quo_ground, gf_add, gf_sub, gf_mul, gf_sqr, gf_add_mul, gf_sub_mul,
220 gf_expand, gf_div, gf_rem, gf_quo, gf_exquo, gf_lshift, gf_rshift, gf_pow, gf_pow_mod,
221 gf_gcd, gf_lcm, gf_cofactors, gf_gcdex, gf_monic, gf_diff, gf_eval, gf_multi_eval,
222 gf_compose, gf_compose_mod, gf_trace_map, gf_random, gf_irreducible, gf_irred_p_ben_or,
223 gf_irred_p_rabin, gf_irreducible_p, gf_sqf_p, gf_sqf_part, gf_Qmatrix,
224 gf_berlekamp, gf_ddf_zassenhaus, gf_edf_zassenhaus, gf_ddf_shoup, gf_edf_shoup,
225 gf_zassenhaus, gf_shoup, gf_factor_sqf, gf_factor)
227from sympy.utilities import public
229@public
230class IPolys:
231 symbols = None
232 ngens = None
233 domain = None
234 order = None
235 gens = None
237 def drop(self, gen):
238 pass
240 def clone(self, symbols=None, domain=None, order=None):
241 pass
243 def to_ground(self):
244 pass
246 def ground_new(self, element):
247 pass
249 def domain_new(self, element):
250 pass
252 def from_dict(self, d):
253 pass
255 def wrap(self, element):
256 from sympy.polys.rings import PolyElement
257 if isinstance(element, PolyElement):
258 if element.ring == self:
259 return element
260 else:
261 raise NotImplementedError("domain conversions")
262 else:
263 return self.ground_new(element)
265 def to_dense(self, element):
266 return self.wrap(element).to_dense()
268 def from_dense(self, element):
269 return self.from_dict(dmp_to_dict(element, self.ngens-1, self.domain))
271 def dup_add_term(self, f, c, i):
272 return self.from_dense(dup_add_term(self.to_dense(f), c, i, self.domain))
273 def dmp_add_term(self, f, c, i):
274 return self.from_dense(dmp_add_term(self.to_dense(f), self.wrap(c).drop(0).to_dense(), i, self.ngens-1, self.domain))
275 def dup_sub_term(self, f, c, i):
276 return self.from_dense(dup_sub_term(self.to_dense(f), c, i, self.domain))
277 def dmp_sub_term(self, f, c, i):
278 return self.from_dense(dmp_sub_term(self.to_dense(f), self.wrap(c).drop(0).to_dense(), i, self.ngens-1, self.domain))
279 def dup_mul_term(self, f, c, i):
280 return self.from_dense(dup_mul_term(self.to_dense(f), c, i, self.domain))
281 def dmp_mul_term(self, f, c, i):
282 return self.from_dense(dmp_mul_term(self.to_dense(f), self.wrap(c).drop(0).to_dense(), i, self.ngens-1, self.domain))
284 def dup_add_ground(self, f, c):
285 return self.from_dense(dup_add_ground(self.to_dense(f), c, self.domain))
286 def dmp_add_ground(self, f, c):
287 return self.from_dense(dmp_add_ground(self.to_dense(f), c, self.ngens-1, self.domain))
288 def dup_sub_ground(self, f, c):
289 return self.from_dense(dup_sub_ground(self.to_dense(f), c, self.domain))
290 def dmp_sub_ground(self, f, c):
291 return self.from_dense(dmp_sub_ground(self.to_dense(f), c, self.ngens-1, self.domain))
292 def dup_mul_ground(self, f, c):
293 return self.from_dense(dup_mul_ground(self.to_dense(f), c, self.domain))
294 def dmp_mul_ground(self, f, c):
295 return self.from_dense(dmp_mul_ground(self.to_dense(f), c, self.ngens-1, self.domain))
296 def dup_quo_ground(self, f, c):
297 return self.from_dense(dup_quo_ground(self.to_dense(f), c, self.domain))
298 def dmp_quo_ground(self, f, c):
299 return self.from_dense(dmp_quo_ground(self.to_dense(f), c, self.ngens-1, self.domain))
300 def dup_exquo_ground(self, f, c):
301 return self.from_dense(dup_exquo_ground(self.to_dense(f), c, self.domain))
302 def dmp_exquo_ground(self, f, c):
303 return self.from_dense(dmp_exquo_ground(self.to_dense(f), c, self.ngens-1, self.domain))
305 def dup_lshift(self, f, n):
306 return self.from_dense(dup_lshift(self.to_dense(f), n, self.domain))
307 def dup_rshift(self, f, n):
308 return self.from_dense(dup_rshift(self.to_dense(f), n, self.domain))
310 def dup_abs(self, f):
311 return self.from_dense(dup_abs(self.to_dense(f), self.domain))
312 def dmp_abs(self, f):
313 return self.from_dense(dmp_abs(self.to_dense(f), self.ngens-1, self.domain))
315 def dup_neg(self, f):
316 return self.from_dense(dup_neg(self.to_dense(f), self.domain))
317 def dmp_neg(self, f):
318 return self.from_dense(dmp_neg(self.to_dense(f), self.ngens-1, self.domain))
320 def dup_add(self, f, g):
321 return self.from_dense(dup_add(self.to_dense(f), self.to_dense(g), self.domain))
322 def dmp_add(self, f, g):
323 return self.from_dense(dmp_add(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
325 def dup_sub(self, f, g):
326 return self.from_dense(dup_sub(self.to_dense(f), self.to_dense(g), self.domain))
327 def dmp_sub(self, f, g):
328 return self.from_dense(dmp_sub(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
330 def dup_add_mul(self, f, g, h):
331 return self.from_dense(dup_add_mul(self.to_dense(f), self.to_dense(g), self.to_dense(h), self.domain))
332 def dmp_add_mul(self, f, g, h):
333 return self.from_dense(dmp_add_mul(self.to_dense(f), self.to_dense(g), self.to_dense(h), self.ngens-1, self.domain))
334 def dup_sub_mul(self, f, g, h):
335 return self.from_dense(dup_sub_mul(self.to_dense(f), self.to_dense(g), self.to_dense(h), self.domain))
336 def dmp_sub_mul(self, f, g, h):
337 return self.from_dense(dmp_sub_mul(self.to_dense(f), self.to_dense(g), self.to_dense(h), self.ngens-1, self.domain))
339 def dup_mul(self, f, g):
340 return self.from_dense(dup_mul(self.to_dense(f), self.to_dense(g), self.domain))
341 def dmp_mul(self, f, g):
342 return self.from_dense(dmp_mul(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
344 def dup_sqr(self, f):
345 return self.from_dense(dup_sqr(self.to_dense(f), self.domain))
346 def dmp_sqr(self, f):
347 return self.from_dense(dmp_sqr(self.to_dense(f), self.ngens-1, self.domain))
348 def dup_pow(self, f, n):
349 return self.from_dense(dup_pow(self.to_dense(f), n, self.domain))
350 def dmp_pow(self, f, n):
351 return self.from_dense(dmp_pow(self.to_dense(f), n, self.ngens-1, self.domain))
353 def dup_pdiv(self, f, g):
354 q, r = dup_pdiv(self.to_dense(f), self.to_dense(g), self.domain)
355 return (self.from_dense(q), self.from_dense(r))
356 def dup_prem(self, f, g):
357 return self.from_dense(dup_prem(self.to_dense(f), self.to_dense(g), self.domain))
358 def dup_pquo(self, f, g):
359 return self.from_dense(dup_pquo(self.to_dense(f), self.to_dense(g), self.domain))
360 def dup_pexquo(self, f, g):
361 return self.from_dense(dup_pexquo(self.to_dense(f), self.to_dense(g), self.domain))
363 def dmp_pdiv(self, f, g):
364 q, r = dmp_pdiv(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
365 return (self.from_dense(q), self.from_dense(r))
366 def dmp_prem(self, f, g):
367 return self.from_dense(dmp_prem(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
368 def dmp_pquo(self, f, g):
369 return self.from_dense(dmp_pquo(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
370 def dmp_pexquo(self, f, g):
371 return self.from_dense(dmp_pexquo(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
373 def dup_rr_div(self, f, g):
374 q, r = dup_rr_div(self.to_dense(f), self.to_dense(g), self.domain)
375 return (self.from_dense(q), self.from_dense(r))
376 def dmp_rr_div(self, f, g):
377 q, r = dmp_rr_div(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
378 return (self.from_dense(q), self.from_dense(r))
379 def dup_ff_div(self, f, g):
380 q, r = dup_ff_div(self.to_dense(f), self.to_dense(g), self.domain)
381 return (self.from_dense(q), self.from_dense(r))
382 def dmp_ff_div(self, f, g):
383 q, r = dmp_ff_div(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
384 return (self.from_dense(q), self.from_dense(r))
386 def dup_div(self, f, g):
387 q, r = dup_div(self.to_dense(f), self.to_dense(g), self.domain)
388 return (self.from_dense(q), self.from_dense(r))
389 def dup_rem(self, f, g):
390 return self.from_dense(dup_rem(self.to_dense(f), self.to_dense(g), self.domain))
391 def dup_quo(self, f, g):
392 return self.from_dense(dup_quo(self.to_dense(f), self.to_dense(g), self.domain))
393 def dup_exquo(self, f, g):
394 return self.from_dense(dup_exquo(self.to_dense(f), self.to_dense(g), self.domain))
396 def dmp_div(self, f, g):
397 q, r = dmp_div(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
398 return (self.from_dense(q), self.from_dense(r))
399 def dmp_rem(self, f, g):
400 return self.from_dense(dmp_rem(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
401 def dmp_quo(self, f, g):
402 return self.from_dense(dmp_quo(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
403 def dmp_exquo(self, f, g):
404 return self.from_dense(dmp_exquo(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
406 def dup_max_norm(self, f):
407 return dup_max_norm(self.to_dense(f), self.domain)
408 def dmp_max_norm(self, f):
409 return dmp_max_norm(self.to_dense(f), self.ngens-1, self.domain)
411 def dup_l1_norm(self, f):
412 return dup_l1_norm(self.to_dense(f), self.domain)
413 def dmp_l1_norm(self, f):
414 return dmp_l1_norm(self.to_dense(f), self.ngens-1, self.domain)
416 def dup_l2_norm_squared(self, f):
417 return dup_l2_norm_squared(self.to_dense(f), self.domain)
418 def dmp_l2_norm_squared(self, f):
419 return dmp_l2_norm_squared(self.to_dense(f), self.ngens-1, self.domain)
421 def dup_expand(self, polys):
422 return self.from_dense(dup_expand(list(map(self.to_dense, polys)), self.domain))
423 def dmp_expand(self, polys):
424 return self.from_dense(dmp_expand(list(map(self.to_dense, polys)), self.ngens-1, self.domain))
426 def dup_LC(self, f):
427 return dup_LC(self.to_dense(f), self.domain)
428 def dmp_LC(self, f):
429 LC = dmp_LC(self.to_dense(f), self.domain)
430 if isinstance(LC, list):
431 return self[1:].from_dense(LC)
432 else:
433 return LC
434 def dup_TC(self, f):
435 return dup_TC(self.to_dense(f), self.domain)
436 def dmp_TC(self, f):
437 TC = dmp_TC(self.to_dense(f), self.domain)
438 if isinstance(TC, list):
439 return self[1:].from_dense(TC)
440 else:
441 return TC
443 def dmp_ground_LC(self, f):
444 return dmp_ground_LC(self.to_dense(f), self.ngens-1, self.domain)
445 def dmp_ground_TC(self, f):
446 return dmp_ground_TC(self.to_dense(f), self.ngens-1, self.domain)
448 def dup_degree(self, f):
449 return dup_degree(self.to_dense(f))
450 def dmp_degree(self, f):
451 return dmp_degree(self.to_dense(f), self.ngens-1)
452 def dmp_degree_in(self, f, j):
453 return dmp_degree_in(self.to_dense(f), j, self.ngens-1)
454 def dup_integrate(self, f, m):
455 return self.from_dense(dup_integrate(self.to_dense(f), m, self.domain))
456 def dmp_integrate(self, f, m):
457 return self.from_dense(dmp_integrate(self.to_dense(f), m, self.ngens-1, self.domain))
459 def dup_diff(self, f, m):
460 return self.from_dense(dup_diff(self.to_dense(f), m, self.domain))
461 def dmp_diff(self, f, m):
462 return self.from_dense(dmp_diff(self.to_dense(f), m, self.ngens-1, self.domain))
464 def dmp_diff_in(self, f, m, j):
465 return self.from_dense(dmp_diff_in(self.to_dense(f), m, j, self.ngens-1, self.domain))
466 def dmp_integrate_in(self, f, m, j):
467 return self.from_dense(dmp_integrate_in(self.to_dense(f), m, j, self.ngens-1, self.domain))
469 def dup_eval(self, f, a):
470 return dup_eval(self.to_dense(f), a, self.domain)
471 def dmp_eval(self, f, a):
472 result = dmp_eval(self.to_dense(f), a, self.ngens-1, self.domain)
473 return self[1:].from_dense(result)
475 def dmp_eval_in(self, f, a, j):
476 result = dmp_eval_in(self.to_dense(f), a, j, self.ngens-1, self.domain)
477 return self.drop(j).from_dense(result)
478 def dmp_diff_eval_in(self, f, m, a, j):
479 result = dmp_diff_eval_in(self.to_dense(f), m, a, j, self.ngens-1, self.domain)
480 return self.drop(j).from_dense(result)
482 def dmp_eval_tail(self, f, A):
483 result = dmp_eval_tail(self.to_dense(f), A, self.ngens-1, self.domain)
484 if isinstance(result, list):
485 return self[:-len(A)].from_dense(result)
486 else:
487 return result
489 def dup_trunc(self, f, p):
490 return self.from_dense(dup_trunc(self.to_dense(f), p, self.domain))
491 def dmp_trunc(self, f, g):
492 return self.from_dense(dmp_trunc(self.to_dense(f), self[1:].to_dense(g), self.ngens-1, self.domain))
493 def dmp_ground_trunc(self, f, p):
494 return self.from_dense(dmp_ground_trunc(self.to_dense(f), p, self.ngens-1, self.domain))
496 def dup_monic(self, f):
497 return self.from_dense(dup_monic(self.to_dense(f), self.domain))
498 def dmp_ground_monic(self, f):
499 return self.from_dense(dmp_ground_monic(self.to_dense(f), self.ngens-1, self.domain))
501 def dup_extract(self, f, g):
502 c, F, G = dup_extract(self.to_dense(f), self.to_dense(g), self.domain)
503 return (c, self.from_dense(F), self.from_dense(G))
504 def dmp_ground_extract(self, f, g):
505 c, F, G = dmp_ground_extract(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
506 return (c, self.from_dense(F), self.from_dense(G))
508 def dup_real_imag(self, f):
509 p, q = dup_real_imag(self.wrap(f).drop(1).to_dense(), self.domain)
510 return (self.from_dense(p), self.from_dense(q))
512 def dup_mirror(self, f):
513 return self.from_dense(dup_mirror(self.to_dense(f), self.domain))
514 def dup_scale(self, f, a):
515 return self.from_dense(dup_scale(self.to_dense(f), a, self.domain))
516 def dup_shift(self, f, a):
517 return self.from_dense(dup_shift(self.to_dense(f), a, self.domain))
518 def dup_transform(self, f, p, q):
519 return self.from_dense(dup_transform(self.to_dense(f), self.to_dense(p), self.to_dense(q), self.domain))
521 def dup_compose(self, f, g):
522 return self.from_dense(dup_compose(self.to_dense(f), self.to_dense(g), self.domain))
523 def dmp_compose(self, f, g):
524 return self.from_dense(dmp_compose(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
526 def dup_decompose(self, f):
527 components = dup_decompose(self.to_dense(f), self.domain)
528 return list(map(self.from_dense, components))
530 def dmp_lift(self, f):
531 result = dmp_lift(self.to_dense(f), self.ngens-1, self.domain)
532 return self.to_ground().from_dense(result)
534 def dup_sign_variations(self, f):
535 return dup_sign_variations(self.to_dense(f), self.domain)
537 def dup_clear_denoms(self, f, convert=False):
538 c, F = dup_clear_denoms(self.to_dense(f), self.domain, convert=convert)
539 if convert:
540 ring = self.clone(domain=self.domain.get_ring())
541 else:
542 ring = self
543 return (c, ring.from_dense(F))
544 def dmp_clear_denoms(self, f, convert=False):
545 c, F = dmp_clear_denoms(self.to_dense(f), self.ngens-1, self.domain, convert=convert)
546 if convert:
547 ring = self.clone(domain=self.domain.get_ring())
548 else:
549 ring = self
550 return (c, ring.from_dense(F))
552 def dup_revert(self, f, n):
553 return self.from_dense(dup_revert(self.to_dense(f), n, self.domain))
555 def dup_half_gcdex(self, f, g):
556 s, h = dup_half_gcdex(self.to_dense(f), self.to_dense(g), self.domain)
557 return (self.from_dense(s), self.from_dense(h))
558 def dmp_half_gcdex(self, f, g):
559 s, h = dmp_half_gcdex(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
560 return (self.from_dense(s), self.from_dense(h))
561 def dup_gcdex(self, f, g):
562 s, t, h = dup_gcdex(self.to_dense(f), self.to_dense(g), self.domain)
563 return (self.from_dense(s), self.from_dense(t), self.from_dense(h))
564 def dmp_gcdex(self, f, g):
565 s, t, h = dmp_gcdex(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
566 return (self.from_dense(s), self.from_dense(t), self.from_dense(h))
568 def dup_invert(self, f, g):
569 return self.from_dense(dup_invert(self.to_dense(f), self.to_dense(g), self.domain))
570 def dmp_invert(self, f, g):
571 return self.from_dense(dmp_invert(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain))
573 def dup_euclidean_prs(self, f, g):
574 prs = dup_euclidean_prs(self.to_dense(f), self.to_dense(g), self.domain)
575 return list(map(self.from_dense, prs))
576 def dmp_euclidean_prs(self, f, g):
577 prs = dmp_euclidean_prs(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
578 return list(map(self.from_dense, prs))
579 def dup_primitive_prs(self, f, g):
580 prs = dup_primitive_prs(self.to_dense(f), self.to_dense(g), self.domain)
581 return list(map(self.from_dense, prs))
582 def dmp_primitive_prs(self, f, g):
583 prs = dmp_primitive_prs(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
584 return list(map(self.from_dense, prs))
586 def dup_inner_subresultants(self, f, g):
587 prs, sres = dup_inner_subresultants(self.to_dense(f), self.to_dense(g), self.domain)
588 return (list(map(self.from_dense, prs)), sres)
589 def dmp_inner_subresultants(self, f, g):
590 prs, sres = dmp_inner_subresultants(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
591 return (list(map(self.from_dense, prs)), sres)
593 def dup_subresultants(self, f, g):
594 prs = dup_subresultants(self.to_dense(f), self.to_dense(g), self.domain)
595 return list(map(self.from_dense, prs))
596 def dmp_subresultants(self, f, g):
597 prs = dmp_subresultants(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
598 return list(map(self.from_dense, prs))
600 def dup_prs_resultant(self, f, g):
601 res, prs = dup_prs_resultant(self.to_dense(f), self.to_dense(g), self.domain)
602 return (res, list(map(self.from_dense, prs)))
603 def dmp_prs_resultant(self, f, g):
604 res, prs = dmp_prs_resultant(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
605 return (self[1:].from_dense(res), list(map(self.from_dense, prs)))
607 def dmp_zz_modular_resultant(self, f, g, p):
608 res = dmp_zz_modular_resultant(self.to_dense(f), self.to_dense(g), self.domain_new(p), self.ngens-1, self.domain)
609 return self[1:].from_dense(res)
610 def dmp_zz_collins_resultant(self, f, g):
611 res = dmp_zz_collins_resultant(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
612 return self[1:].from_dense(res)
613 def dmp_qq_collins_resultant(self, f, g):
614 res = dmp_qq_collins_resultant(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
615 return self[1:].from_dense(res)
617 def dup_resultant(self, f, g): #, includePRS=False):
618 return dup_resultant(self.to_dense(f), self.to_dense(g), self.domain) #, includePRS=includePRS)
619 def dmp_resultant(self, f, g): #, includePRS=False):
620 res = dmp_resultant(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain) #, includePRS=includePRS)
621 if isinstance(res, list):
622 return self[1:].from_dense(res)
623 else:
624 return res
626 def dup_discriminant(self, f):
627 return dup_discriminant(self.to_dense(f), self.domain)
628 def dmp_discriminant(self, f):
629 disc = dmp_discriminant(self.to_dense(f), self.ngens-1, self.domain)
630 if isinstance(disc, list):
631 return self[1:].from_dense(disc)
632 else:
633 return disc
635 def dup_rr_prs_gcd(self, f, g):
636 H, F, G = dup_rr_prs_gcd(self.to_dense(f), self.to_dense(g), self.domain)
637 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
638 def dup_ff_prs_gcd(self, f, g):
639 H, F, G = dup_ff_prs_gcd(self.to_dense(f), self.to_dense(g), self.domain)
640 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
641 def dmp_rr_prs_gcd(self, f, g):
642 H, F, G = dmp_rr_prs_gcd(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
643 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
644 def dmp_ff_prs_gcd(self, f, g):
645 H, F, G = dmp_ff_prs_gcd(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
646 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
647 def dup_zz_heu_gcd(self, f, g):
648 H, F, G = dup_zz_heu_gcd(self.to_dense(f), self.to_dense(g), self.domain)
649 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
650 def dmp_zz_heu_gcd(self, f, g):
651 H, F, G = dmp_zz_heu_gcd(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
652 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
653 def dup_qq_heu_gcd(self, f, g):
654 H, F, G = dup_qq_heu_gcd(self.to_dense(f), self.to_dense(g), self.domain)
655 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
656 def dmp_qq_heu_gcd(self, f, g):
657 H, F, G = dmp_qq_heu_gcd(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
658 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
659 def dup_inner_gcd(self, f, g):
660 H, F, G = dup_inner_gcd(self.to_dense(f), self.to_dense(g), self.domain)
661 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
662 def dmp_inner_gcd(self, f, g):
663 H, F, G = dmp_inner_gcd(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
664 return (self.from_dense(H), self.from_dense(F), self.from_dense(G))
665 def dup_gcd(self, f, g):
666 H = dup_gcd(self.to_dense(f), self.to_dense(g), self.domain)
667 return self.from_dense(H)
668 def dmp_gcd(self, f, g):
669 H = dmp_gcd(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
670 return self.from_dense(H)
671 def dup_rr_lcm(self, f, g):
672 H = dup_rr_lcm(self.to_dense(f), self.to_dense(g), self.domain)
673 return self.from_dense(H)
674 def dup_ff_lcm(self, f, g):
675 H = dup_ff_lcm(self.to_dense(f), self.to_dense(g), self.domain)
676 return self.from_dense(H)
677 def dup_lcm(self, f, g):
678 H = dup_lcm(self.to_dense(f), self.to_dense(g), self.domain)
679 return self.from_dense(H)
680 def dmp_rr_lcm(self, f, g):
681 H = dmp_rr_lcm(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
682 return self.from_dense(H)
683 def dmp_ff_lcm(self, f, g):
684 H = dmp_ff_lcm(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
685 return self.from_dense(H)
686 def dmp_lcm(self, f, g):
687 H = dmp_lcm(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain)
688 return self.from_dense(H)
690 def dup_content(self, f):
691 cont = dup_content(self.to_dense(f), self.domain)
692 return cont
693 def dup_primitive(self, f):
694 cont, prim = dup_primitive(self.to_dense(f), self.domain)
695 return cont, self.from_dense(prim)
697 def dmp_content(self, f):
698 cont = dmp_content(self.to_dense(f), self.ngens-1, self.domain)
699 if isinstance(cont, list):
700 return self[1:].from_dense(cont)
701 else:
702 return cont
703 def dmp_primitive(self, f):
704 cont, prim = dmp_primitive(self.to_dense(f), self.ngens-1, self.domain)
705 if isinstance(cont, list):
706 return (self[1:].from_dense(cont), self.from_dense(prim))
707 else:
708 return (cont, self.from_dense(prim))
710 def dmp_ground_content(self, f):
711 cont = dmp_ground_content(self.to_dense(f), self.ngens-1, self.domain)
712 return cont
713 def dmp_ground_primitive(self, f):
714 cont, prim = dmp_ground_primitive(self.to_dense(f), self.ngens-1, self.domain)
715 return (cont, self.from_dense(prim))
717 def dup_cancel(self, f, g, include=True):
718 result = dup_cancel(self.to_dense(f), self.to_dense(g), self.domain, include=include)
719 if not include:
720 cf, cg, F, G = result
721 return (cf, cg, self.from_dense(F), self.from_dense(G))
722 else:
723 F, G = result
724 return (self.from_dense(F), self.from_dense(G))
725 def dmp_cancel(self, f, g, include=True):
726 result = dmp_cancel(self.to_dense(f), self.to_dense(g), self.ngens-1, self.domain, include=include)
727 if not include:
728 cf, cg, F, G = result
729 return (cf, cg, self.from_dense(F), self.from_dense(G))
730 else:
731 F, G = result
732 return (self.from_dense(F), self.from_dense(G))
734 def dup_trial_division(self, f, factors):
735 factors = dup_trial_division(self.to_dense(f), list(map(self.to_dense, factors)), self.domain)
736 return [ (self.from_dense(g), k) for g, k in factors ]
737 def dmp_trial_division(self, f, factors):
738 factors = dmp_trial_division(self.to_dense(f), list(map(self.to_dense, factors)), self.ngens-1, self.domain)
739 return [ (self.from_dense(g), k) for g, k in factors ]
741 def dup_zz_mignotte_bound(self, f):
742 return dup_zz_mignotte_bound(self.to_dense(f), self.domain)
743 def dmp_zz_mignotte_bound(self, f):
744 return dmp_zz_mignotte_bound(self.to_dense(f), self.ngens-1, self.domain)
746 def dup_zz_hensel_step(self, m, f, g, h, s, t):
747 D = self.to_dense
748 G, H, S, T = dup_zz_hensel_step(m, D(f), D(g), D(h), D(s), D(t), self.domain)
749 return (self.from_dense(G), self.from_dense(H), self.from_dense(S), self.from_dense(T))
750 def dup_zz_hensel_lift(self, p, f, f_list, l):
751 D = self.to_dense
752 polys = dup_zz_hensel_lift(p, D(f), list(map(D, f_list)), l, self.domain)
753 return list(map(self.from_dense, polys))
755 def dup_zz_zassenhaus(self, f):
756 factors = dup_zz_zassenhaus(self.to_dense(f), self.domain)
757 return [ (self.from_dense(g), k) for g, k in factors ]
759 def dup_zz_irreducible_p(self, f):
760 return dup_zz_irreducible_p(self.to_dense(f), self.domain)
761 def dup_cyclotomic_p(self, f, irreducible=False):
762 return dup_cyclotomic_p(self.to_dense(f), self.domain, irreducible=irreducible)
763 def dup_zz_cyclotomic_poly(self, n):
764 F = dup_zz_cyclotomic_poly(n, self.domain)
765 return self.from_dense(F)
766 def dup_zz_cyclotomic_factor(self, f):
767 result = dup_zz_cyclotomic_factor(self.to_dense(f), self.domain)
768 if result is None:
769 return result
770 else:
771 return list(map(self.from_dense, result))
773 # E: List[ZZ], cs: ZZ, ct: ZZ
774 def dmp_zz_wang_non_divisors(self, E, cs, ct):
775 return dmp_zz_wang_non_divisors(E, cs, ct, self.domain)
777 # f: Poly, T: List[(Poly, int)], ct: ZZ, A: List[ZZ]
778 #def dmp_zz_wang_test_points(f, T, ct, A):
779 # dmp_zz_wang_test_points(self.to_dense(f), T, ct, A, self.ngens-1, self.domain)
781 # f: Poly, T: List[(Poly, int)], cs: ZZ, E: List[ZZ], H: List[Poly], A: List[ZZ]
782 def dmp_zz_wang_lead_coeffs(self, f, T, cs, E, H, A):
783 mv = self[1:]
784 T = [ (mv.to_dense(t), k) for t, k in T ]
785 uv = self[:1]
786 H = list(map(uv.to_dense, H))
787 f, HH, CC = dmp_zz_wang_lead_coeffs(self.to_dense(f), T, cs, E, H, A, self.ngens-1, self.domain)
788 return self.from_dense(f), list(map(uv.from_dense, HH)), list(map(mv.from_dense, CC))
790 # f: List[Poly], m: int, p: ZZ
791 def dup_zz_diophantine(self, F, m, p):
792 result = dup_zz_diophantine(list(map(self.to_dense, F)), m, p, self.domain)
793 return list(map(self.from_dense, result))
795 # f: List[Poly], c: List[Poly], A: List[ZZ], d: int, p: ZZ
796 def dmp_zz_diophantine(self, F, c, A, d, p):
797 result = dmp_zz_diophantine(list(map(self.to_dense, F)), self.to_dense(c), A, d, p, self.ngens-1, self.domain)
798 return list(map(self.from_dense, result))
800 # f: Poly, H: List[Poly], LC: List[Poly], A: List[ZZ], p: ZZ
801 def dmp_zz_wang_hensel_lifting(self, f, H, LC, A, p):
802 uv = self[:1]
803 mv = self[1:]
804 H = list(map(uv.to_dense, H))
805 LC = list(map(mv.to_dense, LC))
806 result = dmp_zz_wang_hensel_lifting(self.to_dense(f), H, LC, A, p, self.ngens-1, self.domain)
807 return list(map(self.from_dense, result))
809 def dmp_zz_wang(self, f, mod=None, seed=None):
810 factors = dmp_zz_wang(self.to_dense(f), self.ngens-1, self.domain, mod=mod, seed=seed)
811 return [ self.from_dense(g) for g in factors ]
813 def dup_zz_factor_sqf(self, f):
814 coeff, factors = dup_zz_factor_sqf(self.to_dense(f), self.domain)
815 return (coeff, [ self.from_dense(g) for g in factors ])
817 def dup_zz_factor(self, f):
818 coeff, factors = dup_zz_factor(self.to_dense(f), self.domain)
819 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
820 def dmp_zz_factor(self, f):
821 coeff, factors = dmp_zz_factor(self.to_dense(f), self.ngens-1, self.domain)
822 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
824 def dup_qq_i_factor(self, f):
825 coeff, factors = dup_qq_i_factor(self.to_dense(f), self.domain)
826 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
827 def dmp_qq_i_factor(self, f):
828 coeff, factors = dmp_qq_i_factor(self.to_dense(f), self.ngens-1, self.domain)
829 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
831 def dup_zz_i_factor(self, f):
832 coeff, factors = dup_zz_i_factor(self.to_dense(f), self.domain)
833 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
834 def dmp_zz_i_factor(self, f):
835 coeff, factors = dmp_zz_i_factor(self.to_dense(f), self.ngens-1, self.domain)
836 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
838 def dup_ext_factor(self, f):
839 coeff, factors = dup_ext_factor(self.to_dense(f), self.domain)
840 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
841 def dmp_ext_factor(self, f):
842 coeff, factors = dmp_ext_factor(self.to_dense(f), self.ngens-1, self.domain)
843 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
845 def dup_gf_factor(self, f):
846 coeff, factors = dup_gf_factor(self.to_dense(f), self.domain)
847 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
848 def dmp_gf_factor(self, f):
849 coeff, factors = dmp_gf_factor(self.to_dense(f), self.ngens-1, self.domain)
850 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
852 def dup_factor_list(self, f):
853 coeff, factors = dup_factor_list(self.to_dense(f), self.domain)
854 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
855 def dup_factor_list_include(self, f):
856 factors = dup_factor_list_include(self.to_dense(f), self.domain)
857 return [ (self.from_dense(g), k) for g, k in factors ]
859 def dmp_factor_list(self, f):
860 coeff, factors = dmp_factor_list(self.to_dense(f), self.ngens-1, self.domain)
861 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
862 def dmp_factor_list_include(self, f):
863 factors = dmp_factor_list_include(self.to_dense(f), self.ngens-1, self.domain)
864 return [ (self.from_dense(g), k) for g, k in factors ]
866 def dup_irreducible_p(self, f):
867 return dup_irreducible_p(self.to_dense(f), self.domain)
868 def dmp_irreducible_p(self, f):
869 return dmp_irreducible_p(self.to_dense(f), self.ngens-1, self.domain)
871 def dup_sturm(self, f):
872 seq = dup_sturm(self.to_dense(f), self.domain)
873 return list(map(self.from_dense, seq))
875 def dup_sqf_p(self, f):
876 return dup_sqf_p(self.to_dense(f), self.domain)
877 def dmp_sqf_p(self, f):
878 return dmp_sqf_p(self.to_dense(f), self.ngens-1, self.domain)
880 def dup_sqf_norm(self, f):
881 s, F, R = dup_sqf_norm(self.to_dense(f), self.domain)
882 return (s, self.from_dense(F), self.to_ground().from_dense(R))
883 def dmp_sqf_norm(self, f):
884 s, F, R = dmp_sqf_norm(self.to_dense(f), self.ngens-1, self.domain)
885 return (s, self.from_dense(F), self.to_ground().from_dense(R))
887 def dup_gf_sqf_part(self, f):
888 return self.from_dense(dup_gf_sqf_part(self.to_dense(f), self.domain))
889 def dmp_gf_sqf_part(self, f):
890 return self.from_dense(dmp_gf_sqf_part(self.to_dense(f), self.domain))
891 def dup_sqf_part(self, f):
892 return self.from_dense(dup_sqf_part(self.to_dense(f), self.domain))
893 def dmp_sqf_part(self, f):
894 return self.from_dense(dmp_sqf_part(self.to_dense(f), self.ngens-1, self.domain))
896 def dup_gf_sqf_list(self, f, all=False):
897 coeff, factors = dup_gf_sqf_list(self.to_dense(f), self.domain, all=all)
898 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
899 def dmp_gf_sqf_list(self, f, all=False):
900 coeff, factors = dmp_gf_sqf_list(self.to_dense(f), self.ngens-1, self.domain, all=all)
901 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
903 def dup_sqf_list(self, f, all=False):
904 coeff, factors = dup_sqf_list(self.to_dense(f), self.domain, all=all)
905 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
906 def dup_sqf_list_include(self, f, all=False):
907 factors = dup_sqf_list_include(self.to_dense(f), self.domain, all=all)
908 return [ (self.from_dense(g), k) for g, k in factors ]
909 def dmp_sqf_list(self, f, all=False):
910 coeff, factors = dmp_sqf_list(self.to_dense(f), self.ngens-1, self.domain, all=all)
911 return (coeff, [ (self.from_dense(g), k) for g, k in factors ])
912 def dmp_sqf_list_include(self, f, all=False):
913 factors = dmp_sqf_list_include(self.to_dense(f), self.ngens-1, self.domain, all=all)
914 return [ (self.from_dense(g), k) for g, k in factors ]
916 def dup_gff_list(self, f):
917 factors = dup_gff_list(self.to_dense(f), self.domain)
918 return [ (self.from_dense(g), k) for g, k in factors ]
919 def dmp_gff_list(self, f):
920 factors = dmp_gff_list(self.to_dense(f), self.ngens-1, self.domain)
921 return [ (self.from_dense(g), k) for g, k in factors ]
923 def dup_root_upper_bound(self, f):
924 return dup_root_upper_bound(self.to_dense(f), self.domain)
925 def dup_root_lower_bound(self, f):
926 return dup_root_lower_bound(self.to_dense(f), self.domain)
928 def dup_step_refine_real_root(self, f, M, fast=False):
929 return dup_step_refine_real_root(self.to_dense(f), M, self.domain, fast=fast)
930 def dup_inner_refine_real_root(self, f, M, eps=None, steps=None, disjoint=None, fast=False, mobius=False):
931 return dup_inner_refine_real_root(self.to_dense(f), M, self.domain, eps=eps, steps=steps, disjoint=disjoint, fast=fast, mobius=mobius)
932 def dup_outer_refine_real_root(self, f, s, t, eps=None, steps=None, disjoint=None, fast=False):
933 return dup_outer_refine_real_root(self.to_dense(f), s, t, self.domain, eps=eps, steps=steps, disjoint=disjoint, fast=fast)
934 def dup_refine_real_root(self, f, s, t, eps=None, steps=None, disjoint=None, fast=False):
935 return dup_refine_real_root(self.to_dense(f), s, t, self.domain, eps=eps, steps=steps, disjoint=disjoint, fast=fast)
936 def dup_inner_isolate_real_roots(self, f, eps=None, fast=False):
937 return dup_inner_isolate_real_roots(self.to_dense(f), self.domain, eps=eps, fast=fast)
938 def dup_inner_isolate_positive_roots(self, f, eps=None, inf=None, sup=None, fast=False, mobius=False):
939 return dup_inner_isolate_positive_roots(self.to_dense(f), self.domain, eps=eps, inf=inf, sup=sup, fast=fast, mobius=mobius)
940 def dup_inner_isolate_negative_roots(self, f, inf=None, sup=None, eps=None, fast=False, mobius=False):
941 return dup_inner_isolate_negative_roots(self.to_dense(f), self.domain, inf=inf, sup=sup, eps=eps, fast=fast, mobius=mobius)
942 def dup_isolate_real_roots_sqf(self, f, eps=None, inf=None, sup=None, fast=False, blackbox=False):
943 return dup_isolate_real_roots_sqf(self.to_dense(f), self.domain, eps=eps, inf=inf, sup=sup, fast=fast, blackbox=blackbox)
944 def dup_isolate_real_roots(self, f, eps=None, inf=None, sup=None, basis=False, fast=False):
945 return dup_isolate_real_roots(self.to_dense(f), self.domain, eps=eps, inf=inf, sup=sup, basis=basis, fast=fast)
946 def dup_isolate_real_roots_list(self, polys, eps=None, inf=None, sup=None, strict=False, basis=False, fast=False):
947 return dup_isolate_real_roots_list(list(map(self.to_dense, polys)), self.domain, eps=eps, inf=inf, sup=sup, strict=strict, basis=basis, fast=fast)
948 def dup_count_real_roots(self, f, inf=None, sup=None):
949 return dup_count_real_roots(self.to_dense(f), self.domain, inf=inf, sup=sup)
950 def dup_count_complex_roots(self, f, inf=None, sup=None, exclude=None):
951 return dup_count_complex_roots(self.to_dense(f), self.domain, inf=inf, sup=sup, exclude=exclude)
952 def dup_isolate_complex_roots_sqf(self, f, eps=None, inf=None, sup=None, blackbox=False):
953 return dup_isolate_complex_roots_sqf(self.to_dense(f), self.domain, eps=eps, inf=inf, sup=sup, blackbox=blackbox)
954 def dup_isolate_all_roots_sqf(self, f, eps=None, inf=None, sup=None, fast=False, blackbox=False):
955 return dup_isolate_all_roots_sqf(self.to_dense(f), self.domain, eps=eps, inf=inf, sup=sup, fast=fast, blackbox=blackbox)
956 def dup_isolate_all_roots(self, f, eps=None, inf=None, sup=None, fast=False):
957 return dup_isolate_all_roots(self.to_dense(f), self.domain, eps=eps, inf=inf, sup=sup, fast=fast)
959 def fateman_poly_F_1(self):
960 from sympy.polys.specialpolys import dmp_fateman_poly_F_1
961 return tuple(map(self.from_dense, dmp_fateman_poly_F_1(self.ngens-1, self.domain)))
962 def fateman_poly_F_2(self):
963 from sympy.polys.specialpolys import dmp_fateman_poly_F_2
964 return tuple(map(self.from_dense, dmp_fateman_poly_F_2(self.ngens-1, self.domain)))
965 def fateman_poly_F_3(self):
966 from sympy.polys.specialpolys import dmp_fateman_poly_F_3
967 return tuple(map(self.from_dense, dmp_fateman_poly_F_3(self.ngens-1, self.domain)))
969 def to_gf_dense(self, element):
970 return gf_strip([ self.domain.dom.convert(c, self.domain) for c in self.wrap(element).to_dense() ])
972 def from_gf_dense(self, element):
973 return self.from_dict(dmp_to_dict(element, self.ngens-1, self.domain.dom))
975 def gf_degree(self, f):
976 return gf_degree(self.to_gf_dense(f))
978 def gf_LC(self, f):
979 return gf_LC(self.to_gf_dense(f), self.domain.dom)
980 def gf_TC(self, f):
981 return gf_TC(self.to_gf_dense(f), self.domain.dom)
983 def gf_strip(self, f):
984 return self.from_gf_dense(gf_strip(self.to_gf_dense(f)))
985 def gf_trunc(self, f):
986 return self.from_gf_dense(gf_strip(self.to_gf_dense(f), self.domain.mod))
987 def gf_normal(self, f):
988 return self.from_gf_dense(gf_strip(self.to_gf_dense(f), self.domain.mod, self.domain.dom))
990 def gf_from_dict(self, f):
991 return self.from_gf_dense(gf_from_dict(f, self.domain.mod, self.domain.dom))
992 def gf_to_dict(self, f, symmetric=True):
993 return gf_to_dict(self.to_gf_dense(f), self.domain.mod, symmetric=symmetric)
995 def gf_from_int_poly(self, f):
996 return self.from_gf_dense(gf_from_int_poly(f, self.domain.mod))
997 def gf_to_int_poly(self, f, symmetric=True):
998 return gf_to_int_poly(self.to_gf_dense(f), self.domain.mod, symmetric=symmetric)
1000 def gf_neg(self, f):
1001 return self.from_gf_dense(gf_neg(self.to_gf_dense(f), self.domain.mod, self.domain.dom))
1003 def gf_add_ground(self, f, a):
1004 return self.from_gf_dense(gf_add_ground(self.to_gf_dense(f), a, self.domain.mod, self.domain.dom))
1005 def gf_sub_ground(self, f, a):
1006 return self.from_gf_dense(gf_sub_ground(self.to_gf_dense(f), a, self.domain.mod, self.domain.dom))
1007 def gf_mul_ground(self, f, a):
1008 return self.from_gf_dense(gf_mul_ground(self.to_gf_dense(f), a, self.domain.mod, self.domain.dom))
1009 def gf_quo_ground(self, f, a):
1010 return self.from_gf_dense(gf_quo_ground(self.to_gf_dense(f), a, self.domain.mod, self.domain.dom))
1012 def gf_add(self, f, g):
1013 return self.from_gf_dense(gf_add(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1014 def gf_sub(self, f, g):
1015 return self.from_gf_dense(gf_sub(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1016 def gf_mul(self, f, g):
1017 return self.from_gf_dense(gf_mul(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1018 def gf_sqr(self, f):
1019 return self.from_gf_dense(gf_sqr(self.to_gf_dense(f), self.domain.mod, self.domain.dom))
1021 def gf_add_mul(self, f, g, h):
1022 return self.from_gf_dense(gf_add_mul(self.to_gf_dense(f), self.to_gf_dense(g), self.to_gf_dense(h), self.domain.mod, self.domain.dom))
1023 def gf_sub_mul(self, f, g, h):
1024 return self.from_gf_dense(gf_sub_mul(self.to_gf_dense(f), self.to_gf_dense(g), self.to_gf_dense(h), self.domain.mod, self.domain.dom))
1026 def gf_expand(self, F):
1027 return self.from_gf_dense(gf_expand(list(map(self.to_gf_dense, F)), self.domain.mod, self.domain.dom))
1029 def gf_div(self, f, g):
1030 q, r = gf_div(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom)
1031 return self.from_gf_dense(q), self.from_gf_dense(r)
1032 def gf_rem(self, f, g):
1033 return self.from_gf_dense(gf_rem(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1034 def gf_quo(self, f, g):
1035 return self.from_gf_dense(gf_quo(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1036 def gf_exquo(self, f, g):
1037 return self.from_gf_dense(gf_exquo(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1039 def gf_lshift(self, f, n):
1040 return self.from_gf_dense(gf_lshift(self.to_gf_dense(f), n, self.domain.dom))
1041 def gf_rshift(self, f, n):
1042 return self.from_gf_dense(gf_rshift(self.to_gf_dense(f), n, self.domain.dom))
1044 def gf_pow(self, f, n):
1045 return self.from_gf_dense(gf_pow(self.to_gf_dense(f), n, self.domain.mod, self.domain.dom))
1046 def gf_pow_mod(self, f, n, g):
1047 return self.from_gf_dense(gf_pow_mod(self.to_gf_dense(f), n, self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1049 def gf_cofactors(self, f, g):
1050 h, cff, cfg = gf_cofactors(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom)
1051 return self.from_gf_dense(h), self.from_gf_dense(cff), self.from_gf_dense(cfg)
1052 def gf_gcd(self, f, g):
1053 return self.from_gf_dense(gf_gcd(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1054 def gf_lcm(self, f, g):
1055 return self.from_gf_dense(gf_lcm(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1056 def gf_gcdex(self, f, g):
1057 return self.from_gf_dense(gf_gcdex(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1059 def gf_monic(self, f):
1060 return self.from_gf_dense(gf_monic(self.to_gf_dense(f), self.domain.mod, self.domain.dom))
1061 def gf_diff(self, f):
1062 return self.from_gf_dense(gf_diff(self.to_gf_dense(f), self.domain.mod, self.domain.dom))
1064 def gf_eval(self, f, a):
1065 return gf_eval(self.to_gf_dense(f), a, self.domain.mod, self.domain.dom)
1066 def gf_multi_eval(self, f, A):
1067 return gf_multi_eval(self.to_gf_dense(f), A, self.domain.mod, self.domain.dom)
1069 def gf_compose(self, f, g):
1070 return self.from_gf_dense(gf_compose(self.to_gf_dense(f), self.to_gf_dense(g), self.domain.mod, self.domain.dom))
1071 def gf_compose_mod(self, g, h, f):
1072 return self.from_gf_dense(gf_compose_mod(self.to_gf_dense(g), self.to_gf_dense(h), self.to_gf_dense(f), self.domain.mod, self.domain.dom))
1074 def gf_trace_map(self, a, b, c, n, f):
1075 a = self.to_gf_dense(a)
1076 b = self.to_gf_dense(b)
1077 c = self.to_gf_dense(c)
1078 f = self.to_gf_dense(f)
1079 U, V = gf_trace_map(a, b, c, n, f, self.domain.mod, self.domain.dom)
1080 return self.from_gf_dense(U), self.from_gf_dense(V)
1082 def gf_random(self, n):
1083 return self.from_gf_dense(gf_random(n, self.domain.mod, self.domain.dom))
1084 def gf_irreducible(self, n):
1085 return self.from_gf_dense(gf_irreducible(n, self.domain.mod, self.domain.dom))
1087 def gf_irred_p_ben_or(self, f):
1088 return gf_irred_p_ben_or(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1089 def gf_irred_p_rabin(self, f):
1090 return gf_irred_p_rabin(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1091 def gf_irreducible_p(self, f):
1092 return gf_irreducible_p(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1093 def gf_sqf_p(self, f):
1094 return gf_sqf_p(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1096 def gf_sqf_part(self, f):
1097 return self.from_gf_dense(gf_sqf_part(self.to_gf_dense(f), self.domain.mod, self.domain.dom))
1098 def gf_sqf_list(self, f, all=False):
1099 coeff, factors = gf_sqf_part(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1100 return coeff, [ (self.from_gf_dense(g), k) for g, k in factors ]
1102 def gf_Qmatrix(self, f):
1103 return gf_Qmatrix(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1104 def gf_berlekamp(self, f):
1105 factors = gf_berlekamp(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1106 return [ self.from_gf_dense(g) for g in factors ]
1108 def gf_ddf_zassenhaus(self, f):
1109 factors = gf_ddf_zassenhaus(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1110 return [ (self.from_gf_dense(g), k) for g, k in factors ]
1111 def gf_edf_zassenhaus(self, f, n):
1112 factors = gf_edf_zassenhaus(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1113 return [ self.from_gf_dense(g) for g in factors ]
1115 def gf_ddf_shoup(self, f):
1116 factors = gf_ddf_shoup(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1117 return [ (self.from_gf_dense(g), k) for g, k in factors ]
1118 def gf_edf_shoup(self, f, n):
1119 factors = gf_edf_shoup(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1120 return [ self.from_gf_dense(g) for g in factors ]
1122 def gf_zassenhaus(self, f):
1123 factors = gf_zassenhaus(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1124 return [ self.from_gf_dense(g) for g in factors ]
1125 def gf_shoup(self, f):
1126 factors = gf_shoup(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1127 return [ self.from_gf_dense(g) for g in factors ]
1129 def gf_factor_sqf(self, f, method=None):
1130 coeff, factors = gf_factor_sqf(self.to_gf_dense(f), self.domain.mod, self.domain.dom, method=method)
1131 return coeff, [ self.from_gf_dense(g) for g in factors ]
1132 def gf_factor(self, f):
1133 coeff, factors = gf_factor(self.to_gf_dense(f), self.domain.mod, self.domain.dom)
1134 return coeff, [ (self.from_gf_dense(g), k) for g, k in factors ]