test_densebasic.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. """Tests for dense recursive polynomials' basic tools. """
  2. from sympy.polys.densebasic import (
  3. dup_LC, dmp_LC,
  4. dup_TC, dmp_TC,
  5. dmp_ground_LC, dmp_ground_TC,
  6. dmp_true_LT,
  7. dup_degree, dmp_degree,
  8. dmp_degree_in, dmp_degree_list,
  9. dup_strip, dmp_strip,
  10. dmp_validate,
  11. dup_reverse,
  12. dup_copy, dmp_copy,
  13. dup_normal, dmp_normal,
  14. dup_convert, dmp_convert,
  15. dup_from_sympy, dmp_from_sympy,
  16. dup_nth, dmp_nth, dmp_ground_nth,
  17. dmp_zero_p, dmp_zero,
  18. dmp_one_p, dmp_one,
  19. dmp_ground_p, dmp_ground,
  20. dmp_negative_p, dmp_positive_p,
  21. dmp_zeros, dmp_grounds,
  22. dup_from_dict, dup_from_raw_dict,
  23. dup_to_dict, dup_to_raw_dict,
  24. dmp_from_dict, dmp_to_dict,
  25. dmp_swap, dmp_permute,
  26. dmp_nest, dmp_raise,
  27. dup_deflate, dmp_deflate,
  28. dup_multi_deflate, dmp_multi_deflate,
  29. dup_inflate, dmp_inflate,
  30. dmp_exclude, dmp_include,
  31. dmp_inject, dmp_eject,
  32. dup_terms_gcd, dmp_terms_gcd,
  33. dmp_list_terms, dmp_apply_pairs,
  34. dup_slice,
  35. dup_random,
  36. )
  37. from sympy.polys.specialpolys import f_polys
  38. from sympy.polys.domains import ZZ, QQ
  39. from sympy.polys.rings import ring
  40. from sympy.core.singleton import S
  41. from sympy.testing.pytest import raises
  42. from sympy.core.numbers import oo
  43. f_0, f_1, f_2, f_3, f_4, f_5, f_6 = [ f.to_dense() for f in f_polys() ]
  44. def test_dup_LC():
  45. assert dup_LC([], ZZ) == 0
  46. assert dup_LC([2, 3, 4, 5], ZZ) == 2
  47. def test_dup_TC():
  48. assert dup_TC([], ZZ) == 0
  49. assert dup_TC([2, 3, 4, 5], ZZ) == 5
  50. def test_dmp_LC():
  51. assert dmp_LC([[]], ZZ) == []
  52. assert dmp_LC([[2, 3, 4], [5]], ZZ) == [2, 3, 4]
  53. assert dmp_LC([[[]]], ZZ) == [[]]
  54. assert dmp_LC([[[2], [3, 4]], [[5]]], ZZ) == [[2], [3, 4]]
  55. def test_dmp_TC():
  56. assert dmp_TC([[]], ZZ) == []
  57. assert dmp_TC([[2, 3, 4], [5]], ZZ) == [5]
  58. assert dmp_TC([[[]]], ZZ) == [[]]
  59. assert dmp_TC([[[2], [3, 4]], [[5]]], ZZ) == [[5]]
  60. def test_dmp_ground_LC():
  61. assert dmp_ground_LC([[]], 1, ZZ) == 0
  62. assert dmp_ground_LC([[2, 3, 4], [5]], 1, ZZ) == 2
  63. assert dmp_ground_LC([[[]]], 2, ZZ) == 0
  64. assert dmp_ground_LC([[[2], [3, 4]], [[5]]], 2, ZZ) == 2
  65. def test_dmp_ground_TC():
  66. assert dmp_ground_TC([[]], 1, ZZ) == 0
  67. assert dmp_ground_TC([[2, 3, 4], [5]], 1, ZZ) == 5
  68. assert dmp_ground_TC([[[]]], 2, ZZ) == 0
  69. assert dmp_ground_TC([[[2], [3, 4]], [[5]]], 2, ZZ) == 5
  70. def test_dmp_true_LT():
  71. assert dmp_true_LT([[]], 1, ZZ) == ((0, 0), 0)
  72. assert dmp_true_LT([[7]], 1, ZZ) == ((0, 0), 7)
  73. assert dmp_true_LT([[1, 0]], 1, ZZ) == ((0, 1), 1)
  74. assert dmp_true_LT([[1], []], 1, ZZ) == ((1, 0), 1)
  75. assert dmp_true_LT([[1, 0], []], 1, ZZ) == ((1, 1), 1)
  76. def test_dup_degree():
  77. assert dup_degree([]) is -oo
  78. assert dup_degree([1]) == 0
  79. assert dup_degree([1, 0]) == 1
  80. assert dup_degree([1, 0, 0, 0, 1]) == 4
  81. def test_dmp_degree():
  82. assert dmp_degree([[]], 1) is -oo
  83. assert dmp_degree([[[]]], 2) is -oo
  84. assert dmp_degree([[1]], 1) == 0
  85. assert dmp_degree([[2], [1]], 1) == 1
  86. def test_dmp_degree_in():
  87. assert dmp_degree_in([[[]]], 0, 2) is -oo
  88. assert dmp_degree_in([[[]]], 1, 2) is -oo
  89. assert dmp_degree_in([[[]]], 2, 2) is -oo
  90. assert dmp_degree_in([[[1]]], 0, 2) == 0
  91. assert dmp_degree_in([[[1]]], 1, 2) == 0
  92. assert dmp_degree_in([[[1]]], 2, 2) == 0
  93. assert dmp_degree_in(f_4, 0, 2) == 9
  94. assert dmp_degree_in(f_4, 1, 2) == 12
  95. assert dmp_degree_in(f_4, 2, 2) == 8
  96. assert dmp_degree_in(f_6, 0, 2) == 4
  97. assert dmp_degree_in(f_6, 1, 2) == 4
  98. assert dmp_degree_in(f_6, 2, 2) == 6
  99. assert dmp_degree_in(f_6, 3, 3) == 3
  100. raises(IndexError, lambda: dmp_degree_in([[1]], -5, 1))
  101. def test_dmp_degree_list():
  102. assert dmp_degree_list([[[[ ]]]], 3) == (-oo, -oo, -oo, -oo)
  103. assert dmp_degree_list([[[[1]]]], 3) == ( 0, 0, 0, 0)
  104. assert dmp_degree_list(f_0, 2) == (2, 2, 2)
  105. assert dmp_degree_list(f_1, 2) == (3, 3, 3)
  106. assert dmp_degree_list(f_2, 2) == (5, 3, 3)
  107. assert dmp_degree_list(f_3, 2) == (5, 4, 7)
  108. assert dmp_degree_list(f_4, 2) == (9, 12, 8)
  109. assert dmp_degree_list(f_5, 2) == (3, 3, 3)
  110. assert dmp_degree_list(f_6, 3) == (4, 4, 6, 3)
  111. def test_dup_strip():
  112. assert dup_strip([]) == []
  113. assert dup_strip([0]) == []
  114. assert dup_strip([0, 0, 0]) == []
  115. assert dup_strip([1]) == [1]
  116. assert dup_strip([0, 1]) == [1]
  117. assert dup_strip([0, 0, 0, 1]) == [1]
  118. assert dup_strip([1, 2, 0]) == [1, 2, 0]
  119. assert dup_strip([0, 1, 2, 0]) == [1, 2, 0]
  120. assert dup_strip([0, 0, 0, 1, 2, 0]) == [1, 2, 0]
  121. def test_dmp_strip():
  122. assert dmp_strip([0, 1, 0], 0) == [1, 0]
  123. assert dmp_strip([[]], 1) == [[]]
  124. assert dmp_strip([[], []], 1) == [[]]
  125. assert dmp_strip([[], [], []], 1) == [[]]
  126. assert dmp_strip([[[]]], 2) == [[[]]]
  127. assert dmp_strip([[[]], [[]]], 2) == [[[]]]
  128. assert dmp_strip([[[]], [[]], [[]]], 2) == [[[]]]
  129. assert dmp_strip([[[1]]], 2) == [[[1]]]
  130. assert dmp_strip([[[]], [[1]]], 2) == [[[1]]]
  131. assert dmp_strip([[[]], [[1]], [[]]], 2) == [[[1]], [[]]]
  132. def test_dmp_validate():
  133. assert dmp_validate([]) == ([], 0)
  134. assert dmp_validate([0, 0, 0, 1, 0]) == ([1, 0], 0)
  135. assert dmp_validate([[[]]]) == ([[[]]], 2)
  136. assert dmp_validate([[0], [], [0], [1], [0]]) == ([[1], []], 1)
  137. raises(ValueError, lambda: dmp_validate([[0], 0, [0], [1], [0]]))
  138. def test_dup_reverse():
  139. assert dup_reverse([1, 2, 0, 3]) == [3, 0, 2, 1]
  140. assert dup_reverse([1, 2, 3, 0]) == [3, 2, 1]
  141. def test_dup_copy():
  142. f = [ZZ(1), ZZ(0), ZZ(2)]
  143. g = dup_copy(f)
  144. g[0], g[2] = ZZ(7), ZZ(0)
  145. assert f != g
  146. def test_dmp_copy():
  147. f = [[ZZ(1)], [ZZ(2), ZZ(0)]]
  148. g = dmp_copy(f, 1)
  149. g[0][0], g[1][1] = ZZ(7), ZZ(1)
  150. assert f != g
  151. def test_dup_normal():
  152. assert dup_normal([0, 0, 2, 1, 0, 11, 0], ZZ) == \
  153. [ZZ(2), ZZ(1), ZZ(0), ZZ(11), ZZ(0)]
  154. def test_dmp_normal():
  155. assert dmp_normal([[0], [], [0, 2, 1], [0], [11], []], 1, ZZ) == \
  156. [[ZZ(2), ZZ(1)], [], [ZZ(11)], []]
  157. def test_dup_convert():
  158. K0, K1 = ZZ['x'], ZZ
  159. f = [K0(1), K0(2), K0(0), K0(3)]
  160. assert dup_convert(f, K0, K1) == \
  161. [ZZ(1), ZZ(2), ZZ(0), ZZ(3)]
  162. def test_dmp_convert():
  163. K0, K1 = ZZ['x'], ZZ
  164. f = [[K0(1)], [K0(2)], [], [K0(3)]]
  165. assert dmp_convert(f, 1, K0, K1) == \
  166. [[ZZ(1)], [ZZ(2)], [], [ZZ(3)]]
  167. def test_dup_from_sympy():
  168. assert dup_from_sympy([S.One, S(2)], ZZ) == \
  169. [ZZ(1), ZZ(2)]
  170. assert dup_from_sympy([S.Half, S(3)], QQ) == \
  171. [QQ(1, 2), QQ(3, 1)]
  172. def test_dmp_from_sympy():
  173. assert dmp_from_sympy([[S.One, S(2)], [S.Zero]], 1, ZZ) == \
  174. [[ZZ(1), ZZ(2)], []]
  175. assert dmp_from_sympy([[S.Half, S(2)]], 1, QQ) == \
  176. [[QQ(1, 2), QQ(2, 1)]]
  177. def test_dup_nth():
  178. assert dup_nth([1, 2, 3], 0, ZZ) == 3
  179. assert dup_nth([1, 2, 3], 1, ZZ) == 2
  180. assert dup_nth([1, 2, 3], 2, ZZ) == 1
  181. assert dup_nth([1, 2, 3], 9, ZZ) == 0
  182. raises(IndexError, lambda: dup_nth([3, 4, 5], -1, ZZ))
  183. def test_dmp_nth():
  184. assert dmp_nth([[1], [2], [3]], 0, 1, ZZ) == [3]
  185. assert dmp_nth([[1], [2], [3]], 1, 1, ZZ) == [2]
  186. assert dmp_nth([[1], [2], [3]], 2, 1, ZZ) == [1]
  187. assert dmp_nth([[1], [2], [3]], 9, 1, ZZ) == []
  188. raises(IndexError, lambda: dmp_nth([[3], [4], [5]], -1, 1, ZZ))
  189. def test_dmp_ground_nth():
  190. assert dmp_ground_nth([[]], (0, 0), 1, ZZ) == 0
  191. assert dmp_ground_nth([[1], [2], [3]], (0, 0), 1, ZZ) == 3
  192. assert dmp_ground_nth([[1], [2], [3]], (1, 0), 1, ZZ) == 2
  193. assert dmp_ground_nth([[1], [2], [3]], (2, 0), 1, ZZ) == 1
  194. assert dmp_ground_nth([[1], [2], [3]], (2, 1), 1, ZZ) == 0
  195. assert dmp_ground_nth([[1], [2], [3]], (3, 0), 1, ZZ) == 0
  196. raises(IndexError, lambda: dmp_ground_nth([[3], [4], [5]], (2, -1), 1, ZZ))
  197. def test_dmp_zero_p():
  198. assert dmp_zero_p([], 0) is True
  199. assert dmp_zero_p([[]], 1) is True
  200. assert dmp_zero_p([[[]]], 2) is True
  201. assert dmp_zero_p([[[1]]], 2) is False
  202. def test_dmp_zero():
  203. assert dmp_zero(0) == []
  204. assert dmp_zero(2) == [[[]]]
  205. def test_dmp_one_p():
  206. assert dmp_one_p([1], 0, ZZ) is True
  207. assert dmp_one_p([[1]], 1, ZZ) is True
  208. assert dmp_one_p([[[1]]], 2, ZZ) is True
  209. assert dmp_one_p([[[12]]], 2, ZZ) is False
  210. def test_dmp_one():
  211. assert dmp_one(0, ZZ) == [ZZ(1)]
  212. assert dmp_one(2, ZZ) == [[[ZZ(1)]]]
  213. def test_dmp_ground_p():
  214. assert dmp_ground_p([], 0, 0) is True
  215. assert dmp_ground_p([[]], 0, 1) is True
  216. assert dmp_ground_p([[]], 1, 1) is False
  217. assert dmp_ground_p([[ZZ(1)]], 1, 1) is True
  218. assert dmp_ground_p([[[ZZ(2)]]], 2, 2) is True
  219. assert dmp_ground_p([[[ZZ(2)]]], 3, 2) is False
  220. assert dmp_ground_p([[[ZZ(3)], []]], 3, 2) is False
  221. assert dmp_ground_p([], None, 0) is True
  222. assert dmp_ground_p([[]], None, 1) is True
  223. assert dmp_ground_p([ZZ(1)], None, 0) is True
  224. assert dmp_ground_p([[[ZZ(1)]]], None, 2) is True
  225. assert dmp_ground_p([[[ZZ(3)], []]], None, 2) is False
  226. def test_dmp_ground():
  227. assert dmp_ground(ZZ(0), 2) == [[[]]]
  228. assert dmp_ground(ZZ(7), -1) == ZZ(7)
  229. assert dmp_ground(ZZ(7), 0) == [ZZ(7)]
  230. assert dmp_ground(ZZ(7), 2) == [[[ZZ(7)]]]
  231. def test_dmp_zeros():
  232. assert dmp_zeros(4, 0, ZZ) == [[], [], [], []]
  233. assert dmp_zeros(0, 2, ZZ) == []
  234. assert dmp_zeros(1, 2, ZZ) == [[[[]]]]
  235. assert dmp_zeros(2, 2, ZZ) == [[[[]]], [[[]]]]
  236. assert dmp_zeros(3, 2, ZZ) == [[[[]]], [[[]]], [[[]]]]
  237. assert dmp_zeros(3, -1, ZZ) == [0, 0, 0]
  238. def test_dmp_grounds():
  239. assert dmp_grounds(ZZ(7), 0, 2) == []
  240. assert dmp_grounds(ZZ(7), 1, 2) == [[[[7]]]]
  241. assert dmp_grounds(ZZ(7), 2, 2) == [[[[7]]], [[[7]]]]
  242. assert dmp_grounds(ZZ(7), 3, 2) == [[[[7]]], [[[7]]], [[[7]]]]
  243. assert dmp_grounds(ZZ(7), 3, -1) == [7, 7, 7]
  244. def test_dmp_negative_p():
  245. assert dmp_negative_p([[[]]], 2, ZZ) is False
  246. assert dmp_negative_p([[[1], [2]]], 2, ZZ) is False
  247. assert dmp_negative_p([[[-1], [2]]], 2, ZZ) is True
  248. def test_dmp_positive_p():
  249. assert dmp_positive_p([[[]]], 2, ZZ) is False
  250. assert dmp_positive_p([[[1], [2]]], 2, ZZ) is True
  251. assert dmp_positive_p([[[-1], [2]]], 2, ZZ) is False
  252. def test_dup_from_to_dict():
  253. assert dup_from_raw_dict({}, ZZ) == []
  254. assert dup_from_dict({}, ZZ) == []
  255. assert dup_to_raw_dict([]) == {}
  256. assert dup_to_dict([]) == {}
  257. assert dup_to_raw_dict([], ZZ, zero=True) == {0: ZZ(0)}
  258. assert dup_to_dict([], ZZ, zero=True) == {(0,): ZZ(0)}
  259. f = [3, 0, 0, 2, 0, 0, 0, 0, 8]
  260. g = {8: 3, 5: 2, 0: 8}
  261. h = {(8,): 3, (5,): 2, (0,): 8}
  262. assert dup_from_raw_dict(g, ZZ) == f
  263. assert dup_from_dict(h, ZZ) == f
  264. assert dup_to_raw_dict(f) == g
  265. assert dup_to_dict(f) == h
  266. R, x,y = ring("x,y", ZZ)
  267. K = R.to_domain()
  268. f = [R(3), R(0), R(2), R(0), R(0), R(8)]
  269. g = {5: R(3), 3: R(2), 0: R(8)}
  270. h = {(5,): R(3), (3,): R(2), (0,): R(8)}
  271. assert dup_from_raw_dict(g, K) == f
  272. assert dup_from_dict(h, K) == f
  273. assert dup_to_raw_dict(f) == g
  274. assert dup_to_dict(f) == h
  275. def test_dmp_from_to_dict():
  276. assert dmp_from_dict({}, 1, ZZ) == [[]]
  277. assert dmp_to_dict([[]], 1) == {}
  278. assert dmp_to_dict([], 0, ZZ, zero=True) == {(0,): ZZ(0)}
  279. assert dmp_to_dict([[]], 1, ZZ, zero=True) == {(0, 0): ZZ(0)}
  280. f = [[3], [], [], [2], [], [], [], [], [8]]
  281. g = {(8, 0): 3, (5, 0): 2, (0, 0): 8}
  282. assert dmp_from_dict(g, 1, ZZ) == f
  283. assert dmp_to_dict(f, 1) == g
  284. def test_dmp_swap():
  285. f = dmp_normal([[1, 0, 0], [], [1, 0], [], [1]], 1, ZZ)
  286. g = dmp_normal([[1, 0, 0, 0, 0], [1, 0, 0], [1]], 1, ZZ)
  287. assert dmp_swap(f, 1, 1, 1, ZZ) == f
  288. assert dmp_swap(f, 0, 1, 1, ZZ) == g
  289. assert dmp_swap(g, 0, 1, 1, ZZ) == f
  290. raises(IndexError, lambda: dmp_swap(f, -1, -7, 1, ZZ))
  291. def test_dmp_permute():
  292. f = dmp_normal([[1, 0, 0], [], [1, 0], [], [1]], 1, ZZ)
  293. g = dmp_normal([[1, 0, 0, 0, 0], [1, 0, 0], [1]], 1, ZZ)
  294. assert dmp_permute(f, [0, 1], 1, ZZ) == f
  295. assert dmp_permute(g, [0, 1], 1, ZZ) == g
  296. assert dmp_permute(f, [1, 0], 1, ZZ) == g
  297. assert dmp_permute(g, [1, 0], 1, ZZ) == f
  298. def test_dmp_nest():
  299. assert dmp_nest(ZZ(1), 2, ZZ) == [[[1]]]
  300. assert dmp_nest([[1]], 0, ZZ) == [[1]]
  301. assert dmp_nest([[1]], 1, ZZ) == [[[1]]]
  302. assert dmp_nest([[1]], 2, ZZ) == [[[[1]]]]
  303. def test_dmp_raise():
  304. assert dmp_raise([], 2, 0, ZZ) == [[[]]]
  305. assert dmp_raise([[1]], 0, 1, ZZ) == [[1]]
  306. assert dmp_raise([[1, 2, 3], [], [2, 3]], 2, 1, ZZ) == \
  307. [[[[1]], [[2]], [[3]]], [[[]]], [[[2]], [[3]]]]
  308. def test_dup_deflate():
  309. assert dup_deflate([], ZZ) == (1, [])
  310. assert dup_deflate([2], ZZ) == (1, [2])
  311. assert dup_deflate([1, 2, 3], ZZ) == (1, [1, 2, 3])
  312. assert dup_deflate([1, 0, 2, 0, 3], ZZ) == (2, [1, 2, 3])
  313. assert dup_deflate(dup_from_raw_dict({7: 1, 1: 1}, ZZ), ZZ) == \
  314. (1, [1, 0, 0, 0, 0, 0, 1, 0])
  315. assert dup_deflate(dup_from_raw_dict({7: 1, 0: 1}, ZZ), ZZ) == \
  316. (7, [1, 1])
  317. assert dup_deflate(dup_from_raw_dict({7: 1, 3: 1}, ZZ), ZZ) == \
  318. (1, [1, 0, 0, 0, 1, 0, 0, 0])
  319. assert dup_deflate(dup_from_raw_dict({7: 1, 4: 1}, ZZ), ZZ) == \
  320. (1, [1, 0, 0, 1, 0, 0, 0, 0])
  321. assert dup_deflate(dup_from_raw_dict({8: 1, 4: 1}, ZZ), ZZ) == \
  322. (4, [1, 1, 0])
  323. assert dup_deflate(dup_from_raw_dict({8: 1}, ZZ), ZZ) == \
  324. (8, [1, 0])
  325. assert dup_deflate(dup_from_raw_dict({7: 1}, ZZ), ZZ) == \
  326. (7, [1, 0])
  327. assert dup_deflate(dup_from_raw_dict({1: 1}, ZZ), ZZ) == \
  328. (1, [1, 0])
  329. def test_dmp_deflate():
  330. assert dmp_deflate([[]], 1, ZZ) == ((1, 1), [[]])
  331. assert dmp_deflate([[2]], 1, ZZ) == ((1, 1), [[2]])
  332. f = [[1, 0, 0], [], [1, 0], [], [1]]
  333. assert dmp_deflate(f, 1, ZZ) == ((2, 1), [[1, 0, 0], [1, 0], [1]])
  334. def test_dup_multi_deflate():
  335. assert dup_multi_deflate(([2],), ZZ) == (1, ([2],))
  336. assert dup_multi_deflate(([], []), ZZ) == (1, ([], []))
  337. assert dup_multi_deflate(([1, 2, 3],), ZZ) == (1, ([1, 2, 3],))
  338. assert dup_multi_deflate(([1, 0, 2, 0, 3],), ZZ) == (2, ([1, 2, 3],))
  339. assert dup_multi_deflate(([1, 0, 2, 0, 3], [2, 0, 0]), ZZ) == \
  340. (2, ([1, 2, 3], [2, 0]))
  341. assert dup_multi_deflate(([1, 0, 2, 0, 3], [2, 1, 0]), ZZ) == \
  342. (1, ([1, 0, 2, 0, 3], [2, 1, 0]))
  343. def test_dmp_multi_deflate():
  344. assert dmp_multi_deflate(([[]],), 1, ZZ) == \
  345. ((1, 1), ([[]],))
  346. assert dmp_multi_deflate(([[]], [[]]), 1, ZZ) == \
  347. ((1, 1), ([[]], [[]]))
  348. assert dmp_multi_deflate(([[1]], [[]]), 1, ZZ) == \
  349. ((1, 1), ([[1]], [[]]))
  350. assert dmp_multi_deflate(([[1]], [[2]]), 1, ZZ) == \
  351. ((1, 1), ([[1]], [[2]]))
  352. assert dmp_multi_deflate(([[1]], [[2, 0]]), 1, ZZ) == \
  353. ((1, 1), ([[1]], [[2, 0]]))
  354. assert dmp_multi_deflate(([[2, 0]], [[2, 0]]), 1, ZZ) == \
  355. ((1, 1), ([[2, 0]], [[2, 0]]))
  356. assert dmp_multi_deflate(
  357. ([[2]], [[2, 0, 0]]), 1, ZZ) == ((1, 2), ([[2]], [[2, 0]]))
  358. assert dmp_multi_deflate(
  359. ([[2, 0, 0]], [[2, 0, 0]]), 1, ZZ) == ((1, 2), ([[2, 0]], [[2, 0]]))
  360. assert dmp_multi_deflate(([2, 0, 0], [1, 0, 4, 0, 1]), 0, ZZ) == \
  361. ((2,), ([2, 0], [1, 4, 1]))
  362. f = [[1, 0, 0], [], [1, 0], [], [1]]
  363. g = [[1, 0, 1, 0], [], [1]]
  364. assert dmp_multi_deflate((f,), 1, ZZ) == \
  365. ((2, 1), ([[1, 0, 0], [1, 0], [1]],))
  366. assert dmp_multi_deflate((f, g), 1, ZZ) == \
  367. ((2, 1), ([[1, 0, 0], [1, 0], [1]],
  368. [[1, 0, 1, 0], [1]]))
  369. def test_dup_inflate():
  370. assert dup_inflate([], 17, ZZ) == []
  371. assert dup_inflate([1, 2, 3], 1, ZZ) == [1, 2, 3]
  372. assert dup_inflate([1, 2, 3], 2, ZZ) == [1, 0, 2, 0, 3]
  373. assert dup_inflate([1, 2, 3], 3, ZZ) == [1, 0, 0, 2, 0, 0, 3]
  374. assert dup_inflate([1, 2, 3], 4, ZZ) == [1, 0, 0, 0, 2, 0, 0, 0, 3]
  375. raises(IndexError, lambda: dup_inflate([1, 2, 3], 0, ZZ))
  376. def test_dmp_inflate():
  377. assert dmp_inflate([1], (3,), 0, ZZ) == [1]
  378. assert dmp_inflate([[]], (3, 7), 1, ZZ) == [[]]
  379. assert dmp_inflate([[2]], (1, 2), 1, ZZ) == [[2]]
  380. assert dmp_inflate([[2, 0]], (1, 1), 1, ZZ) == [[2, 0]]
  381. assert dmp_inflate([[2, 0]], (1, 2), 1, ZZ) == [[2, 0, 0]]
  382. assert dmp_inflate([[2, 0]], (1, 3), 1, ZZ) == [[2, 0, 0, 0]]
  383. assert dmp_inflate([[1, 0, 0], [1], [1, 0]], (2, 1), 1, ZZ) == \
  384. [[1, 0, 0], [], [1], [], [1, 0]]
  385. raises(IndexError, lambda: dmp_inflate([[]], (-3, 7), 1, ZZ))
  386. def test_dmp_exclude():
  387. assert dmp_exclude([[[]]], 2, ZZ) == ([], [[[]]], 2)
  388. assert dmp_exclude([[[7]]], 2, ZZ) == ([], [[[7]]], 2)
  389. assert dmp_exclude([1, 2, 3], 0, ZZ) == ([], [1, 2, 3], 0)
  390. assert dmp_exclude([[1], [2, 3]], 1, ZZ) == ([], [[1], [2, 3]], 1)
  391. assert dmp_exclude([[1, 2, 3]], 1, ZZ) == ([0], [1, 2, 3], 0)
  392. assert dmp_exclude([[1], [2], [3]], 1, ZZ) == ([1], [1, 2, 3], 0)
  393. assert dmp_exclude([[[1, 2, 3]]], 2, ZZ) == ([0, 1], [1, 2, 3], 0)
  394. assert dmp_exclude([[[1]], [[2]], [[3]]], 2, ZZ) == ([1, 2], [1, 2, 3], 0)
  395. def test_dmp_include():
  396. assert dmp_include([1, 2, 3], [], 0, ZZ) == [1, 2, 3]
  397. assert dmp_include([1, 2, 3], [0], 0, ZZ) == [[1, 2, 3]]
  398. assert dmp_include([1, 2, 3], [1], 0, ZZ) == [[1], [2], [3]]
  399. assert dmp_include([1, 2, 3], [0, 1], 0, ZZ) == [[[1, 2, 3]]]
  400. assert dmp_include([1, 2, 3], [1, 2], 0, ZZ) == [[[1]], [[2]], [[3]]]
  401. def test_dmp_inject():
  402. R, x,y = ring("x,y", ZZ)
  403. K = R.to_domain()
  404. assert dmp_inject([], 0, K) == ([[[]]], 2)
  405. assert dmp_inject([[]], 1, K) == ([[[[]]]], 3)
  406. assert dmp_inject([R(1)], 0, K) == ([[[1]]], 2)
  407. assert dmp_inject([[R(1)]], 1, K) == ([[[[1]]]], 3)
  408. assert dmp_inject([R(1), 2*x + 3*y + 4], 0, K) == ([[[1]], [[2], [3, 4]]], 2)
  409. f = [3*x**2 + 7*x*y + 5*y**2, 2*x, R(0), x*y**2 + 11]
  410. g = [[[3], [7, 0], [5, 0, 0]], [[2], []], [[]], [[1, 0, 0], [11]]]
  411. assert dmp_inject(f, 0, K) == (g, 2)
  412. def test_dmp_eject():
  413. R, x,y = ring("x,y", ZZ)
  414. K = R.to_domain()
  415. assert dmp_eject([[[]]], 2, K) == []
  416. assert dmp_eject([[[[]]]], 3, K) == [[]]
  417. assert dmp_eject([[[1]]], 2, K) == [R(1)]
  418. assert dmp_eject([[[[1]]]], 3, K) == [[R(1)]]
  419. assert dmp_eject([[[1]], [[2], [3, 4]]], 2, K) == [R(1), 2*x + 3*y + 4]
  420. f = [3*x**2 + 7*x*y + 5*y**2, 2*x, R(0), x*y**2 + 11]
  421. g = [[[3], [7, 0], [5, 0, 0]], [[2], []], [[]], [[1, 0, 0], [11]]]
  422. assert dmp_eject(g, 2, K) == f
  423. def test_dup_terms_gcd():
  424. assert dup_terms_gcd([], ZZ) == (0, [])
  425. assert dup_terms_gcd([1, 0, 1], ZZ) == (0, [1, 0, 1])
  426. assert dup_terms_gcd([1, 0, 1, 0], ZZ) == (1, [1, 0, 1])
  427. def test_dmp_terms_gcd():
  428. assert dmp_terms_gcd([[]], 1, ZZ) == ((0, 0), [[]])
  429. assert dmp_terms_gcd([1, 0, 1, 0], 0, ZZ) == ((1,), [1, 0, 1])
  430. assert dmp_terms_gcd([[1], [], [1], []], 1, ZZ) == ((1, 0), [[1], [], [1]])
  431. assert dmp_terms_gcd(
  432. [[1, 0], [], [1]], 1, ZZ) == ((0, 0), [[1, 0], [], [1]])
  433. assert dmp_terms_gcd(
  434. [[1, 0], [1, 0, 0], [], []], 1, ZZ) == ((2, 1), [[1], [1, 0]])
  435. def test_dmp_list_terms():
  436. assert dmp_list_terms([[[]]], 2, ZZ) == [((0, 0, 0), 0)]
  437. assert dmp_list_terms([[[1]]], 2, ZZ) == [((0, 0, 0), 1)]
  438. assert dmp_list_terms([1, 2, 4, 3, 5], 0, ZZ) == \
  439. [((4,), 1), ((3,), 2), ((2,), 4), ((1,), 3), ((0,), 5)]
  440. assert dmp_list_terms([[1], [2, 4], [3, 5, 0]], 1, ZZ) == \
  441. [((2, 0), 1), ((1, 1), 2), ((1, 0), 4), ((0, 2), 3), ((0, 1), 5)]
  442. f = [[2, 0, 0, 0], [1, 0, 0], []]
  443. assert dmp_list_terms(f, 1, ZZ, order='lex') == [((2, 3), 2), ((1, 2), 1)]
  444. assert dmp_list_terms(
  445. f, 1, ZZ, order='grlex') == [((2, 3), 2), ((1, 2), 1)]
  446. f = [[2, 0, 0, 0], [1, 0, 0, 0, 0, 0], []]
  447. assert dmp_list_terms(f, 1, ZZ, order='lex') == [((2, 3), 2), ((1, 5), 1)]
  448. assert dmp_list_terms(
  449. f, 1, ZZ, order='grlex') == [((1, 5), 1), ((2, 3), 2)]
  450. def test_dmp_apply_pairs():
  451. h = lambda a, b: a*b
  452. assert dmp_apply_pairs([1, 2, 3], [4, 5, 6], h, [], 0, ZZ) == [4, 10, 18]
  453. assert dmp_apply_pairs([2, 3], [4, 5, 6], h, [], 0, ZZ) == [10, 18]
  454. assert dmp_apply_pairs([1, 2, 3], [5, 6], h, [], 0, ZZ) == [10, 18]
  455. assert dmp_apply_pairs(
  456. [[1, 2], [3]], [[4, 5], [6]], h, [], 1, ZZ) == [[4, 10], [18]]
  457. assert dmp_apply_pairs(
  458. [[1, 2], [3]], [[4], [5, 6]], h, [], 1, ZZ) == [[8], [18]]
  459. assert dmp_apply_pairs(
  460. [[1], [2, 3]], [[4, 5], [6]], h, [], 1, ZZ) == [[5], [18]]
  461. def test_dup_slice():
  462. f = [1, 2, 3, 4]
  463. assert dup_slice(f, 0, 0, ZZ) == []
  464. assert dup_slice(f, 0, 1, ZZ) == [4]
  465. assert dup_slice(f, 0, 2, ZZ) == [3, 4]
  466. assert dup_slice(f, 0, 3, ZZ) == [2, 3, 4]
  467. assert dup_slice(f, 0, 4, ZZ) == [1, 2, 3, 4]
  468. assert dup_slice(f, 0, 4, ZZ) == f
  469. assert dup_slice(f, 0, 9, ZZ) == f
  470. assert dup_slice(f, 1, 0, ZZ) == []
  471. assert dup_slice(f, 1, 1, ZZ) == []
  472. assert dup_slice(f, 1, 2, ZZ) == [3, 0]
  473. assert dup_slice(f, 1, 3, ZZ) == [2, 3, 0]
  474. assert dup_slice(f, 1, 4, ZZ) == [1, 2, 3, 0]
  475. assert dup_slice([1, 2], 0, 3, ZZ) == [1, 2]
  476. def test_dup_random():
  477. f = dup_random(0, -10, 10, ZZ)
  478. assert dup_degree(f) == 0
  479. assert all(-10 <= c <= 10 for c in f)
  480. f = dup_random(1, -20, 20, ZZ)
  481. assert dup_degree(f) == 1
  482. assert all(-20 <= c <= 20 for c in f)
  483. f = dup_random(2, -30, 30, ZZ)
  484. assert dup_degree(f) == 2
  485. assert all(-30 <= c <= 30 for c in f)
  486. f = dup_random(3, -40, 40, ZZ)
  487. assert dup_degree(f) == 3
  488. assert all(-40 <= c <= 40 for c in f)