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

1"""Compatibility interface between dense and sparse polys. """ 

2 

3 

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 

210 

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) 

215 

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) 

226 

227from sympy.utilities import public 

228 

229@public 

230class IPolys: 

231 symbols = None 

232 ngens = None 

233 domain = None 

234 order = None 

235 gens = None 

236 

237 def drop(self, gen): 

238 pass 

239 

240 def clone(self, symbols=None, domain=None, order=None): 

241 pass 

242 

243 def to_ground(self): 

244 pass 

245 

246 def ground_new(self, element): 

247 pass 

248 

249 def domain_new(self, element): 

250 pass 

251 

252 def from_dict(self, d): 

253 pass 

254 

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) 

264 

265 def to_dense(self, element): 

266 return self.wrap(element).to_dense() 

267 

268 def from_dense(self, element): 

269 return self.from_dict(dmp_to_dict(element, self.ngens-1, self.domain)) 

270 

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)) 

283 

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)) 

304 

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)) 

309 

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)) 

314 

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)) 

319 

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)) 

324 

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)) 

329 

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)) 

338 

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)) 

343 

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)) 

352 

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)) 

362 

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)) 

372 

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)) 

385 

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)) 

395 

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)) 

405 

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) 

410 

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) 

415 

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) 

420 

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)) 

425 

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 

442 

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) 

447 

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)) 

458 

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)) 

463 

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)) 

468 

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) 

474 

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) 

481 

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 

488 

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)) 

495 

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)) 

500 

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)) 

507 

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)) 

511 

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)) 

520 

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)) 

525 

526 def dup_decompose(self, f): 

527 components = dup_decompose(self.to_dense(f), self.domain) 

528 return list(map(self.from_dense, components)) 

529 

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) 

533 

534 def dup_sign_variations(self, f): 

535 return dup_sign_variations(self.to_dense(f), self.domain) 

536 

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)) 

551 

552 def dup_revert(self, f, n): 

553 return self.from_dense(dup_revert(self.to_dense(f), n, self.domain)) 

554 

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)) 

567 

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)) 

572 

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)) 

585 

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) 

592 

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)) 

599 

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))) 

606 

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) 

616 

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 

625 

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 

634 

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) 

689 

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) 

696 

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)) 

709 

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)) 

716 

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)) 

733 

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 ] 

740 

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) 

745 

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)) 

754 

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 ] 

758 

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)) 

772 

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) 

776 

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) 

780 

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)) 

789 

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)) 

794 

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)) 

799 

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)) 

808 

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 ] 

812 

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 ]) 

816 

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 ]) 

823 

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 ]) 

830 

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 ]) 

837 

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 ]) 

844 

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 ]) 

851 

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 ] 

858 

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 ] 

865 

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) 

870 

871 def dup_sturm(self, f): 

872 seq = dup_sturm(self.to_dense(f), self.domain) 

873 return list(map(self.from_dense, seq)) 

874 

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) 

879 

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)) 

886 

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)) 

895 

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 ]) 

902 

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 ] 

915 

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 ] 

922 

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) 

927 

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) 

958 

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))) 

968 

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() ]) 

971 

972 def from_gf_dense(self, element): 

973 return self.from_dict(dmp_to_dict(element, self.ngens-1, self.domain.dom)) 

974 

975 def gf_degree(self, f): 

976 return gf_degree(self.to_gf_dense(f)) 

977 

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) 

982 

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)) 

989 

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) 

994 

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) 

999 

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)) 

1002 

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)) 

1011 

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)) 

1020 

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)) 

1025 

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)) 

1028 

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)) 

1038 

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)) 

1043 

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)) 

1048 

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)) 

1058 

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)) 

1063 

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) 

1068 

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)) 

1073 

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) 

1081 

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)) 

1086 

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) 

1095 

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 ] 

1101 

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 ] 

1107 

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 ] 

1114 

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 ] 

1121 

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 ] 

1128 

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 ]