compatibility.py 57 KB

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