test_densearith.py 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. """Tests for dense recursive polynomials' arithmetics. """
  2. from sympy.polys.densebasic import (
  3. dup_normal, dmp_normal,
  4. )
  5. from sympy.polys.densearith import (
  6. dup_add_term, dmp_add_term,
  7. dup_sub_term, dmp_sub_term,
  8. dup_mul_term, dmp_mul_term,
  9. dup_add_ground, dmp_add_ground,
  10. dup_sub_ground, dmp_sub_ground,
  11. dup_mul_ground, dmp_mul_ground,
  12. dup_quo_ground, dmp_quo_ground,
  13. dup_exquo_ground, dmp_exquo_ground,
  14. dup_lshift, dup_rshift,
  15. dup_abs, dmp_abs,
  16. dup_neg, dmp_neg,
  17. dup_add, dmp_add,
  18. dup_sub, dmp_sub,
  19. dup_mul, dmp_mul,
  20. dup_sqr, dmp_sqr,
  21. dup_pow, dmp_pow,
  22. dup_add_mul, dmp_add_mul,
  23. dup_sub_mul, dmp_sub_mul,
  24. dup_pdiv, dup_prem, dup_pquo, dup_pexquo,
  25. dmp_pdiv, dmp_prem, dmp_pquo, dmp_pexquo,
  26. dup_rr_div, dmp_rr_div,
  27. dup_ff_div, dmp_ff_div,
  28. dup_div, dup_rem, dup_quo, dup_exquo,
  29. dmp_div, dmp_rem, dmp_quo, dmp_exquo,
  30. dup_max_norm, dmp_max_norm,
  31. dup_l1_norm, dmp_l1_norm,
  32. dup_l2_norm_squared, dmp_l2_norm_squared,
  33. dup_expand, dmp_expand,
  34. )
  35. from sympy.polys.polyerrors import (
  36. ExactQuotientFailed,
  37. )
  38. from sympy.polys.specialpolys import f_polys
  39. from sympy.polys.domains import FF, ZZ, QQ
  40. from sympy.testing.pytest import raises
  41. f_0, f_1, f_2, f_3, f_4, f_5, f_6 = [ f.to_dense() for f in f_polys() ]
  42. F_0 = dmp_mul_ground(dmp_normal(f_0, 2, QQ), QQ(1, 7), 2, QQ)
  43. def test_dup_add_term():
  44. f = dup_normal([], ZZ)
  45. assert dup_add_term(f, ZZ(0), 0, ZZ) == dup_normal([], ZZ)
  46. assert dup_add_term(f, ZZ(1), 0, ZZ) == dup_normal([1], ZZ)
  47. assert dup_add_term(f, ZZ(1), 1, ZZ) == dup_normal([1, 0], ZZ)
  48. assert dup_add_term(f, ZZ(1), 2, ZZ) == dup_normal([1, 0, 0], ZZ)
  49. f = dup_normal([1, 1, 1], ZZ)
  50. assert dup_add_term(f, ZZ(1), 0, ZZ) == dup_normal([1, 1, 2], ZZ)
  51. assert dup_add_term(f, ZZ(1), 1, ZZ) == dup_normal([1, 2, 1], ZZ)
  52. assert dup_add_term(f, ZZ(1), 2, ZZ) == dup_normal([2, 1, 1], ZZ)
  53. assert dup_add_term(f, ZZ(1), 3, ZZ) == dup_normal([1, 1, 1, 1], ZZ)
  54. assert dup_add_term(f, ZZ(1), 4, ZZ) == dup_normal([1, 0, 1, 1, 1], ZZ)
  55. assert dup_add_term(f, ZZ(1), 5, ZZ) == dup_normal([1, 0, 0, 1, 1, 1], ZZ)
  56. assert dup_add_term(
  57. f, ZZ(1), 6, ZZ) == dup_normal([1, 0, 0, 0, 1, 1, 1], ZZ)
  58. assert dup_add_term(f, ZZ(-1), 2, ZZ) == dup_normal([1, 1], ZZ)
  59. def test_dmp_add_term():
  60. assert dmp_add_term([ZZ(1), ZZ(1), ZZ(1)], ZZ(1), 2, 0, ZZ) == \
  61. dup_add_term([ZZ(1), ZZ(1), ZZ(1)], ZZ(1), 2, ZZ)
  62. assert dmp_add_term(f_0, [[]], 3, 2, ZZ) == f_0
  63. assert dmp_add_term(F_0, [[]], 3, 2, QQ) == F_0
  64. def test_dup_sub_term():
  65. f = dup_normal([], ZZ)
  66. assert dup_sub_term(f, ZZ(0), 0, ZZ) == dup_normal([], ZZ)
  67. assert dup_sub_term(f, ZZ(1), 0, ZZ) == dup_normal([-1], ZZ)
  68. assert dup_sub_term(f, ZZ(1), 1, ZZ) == dup_normal([-1, 0], ZZ)
  69. assert dup_sub_term(f, ZZ(1), 2, ZZ) == dup_normal([-1, 0, 0], ZZ)
  70. f = dup_normal([1, 1, 1], ZZ)
  71. assert dup_sub_term(f, ZZ(2), 0, ZZ) == dup_normal([ 1, 1, -1], ZZ)
  72. assert dup_sub_term(f, ZZ(2), 1, ZZ) == dup_normal([ 1, -1, 1], ZZ)
  73. assert dup_sub_term(f, ZZ(2), 2, ZZ) == dup_normal([-1, 1, 1], ZZ)
  74. assert dup_sub_term(f, ZZ(1), 3, ZZ) == dup_normal([-1, 1, 1, 1], ZZ)
  75. assert dup_sub_term(f, ZZ(1), 4, ZZ) == dup_normal([-1, 0, 1, 1, 1], ZZ)
  76. assert dup_sub_term(f, ZZ(1), 5, ZZ) == dup_normal([-1, 0, 0, 1, 1, 1], ZZ)
  77. assert dup_sub_term(
  78. f, ZZ(1), 6, ZZ) == dup_normal([-1, 0, 0, 0, 1, 1, 1], ZZ)
  79. assert dup_sub_term(f, ZZ(1), 2, ZZ) == dup_normal([1, 1], ZZ)
  80. def test_dmp_sub_term():
  81. assert dmp_sub_term([ZZ(1), ZZ(1), ZZ(1)], ZZ(1), 2, 0, ZZ) == \
  82. dup_sub_term([ZZ(1), ZZ(1), ZZ(1)], ZZ(1), 2, ZZ)
  83. assert dmp_sub_term(f_0, [[]], 3, 2, ZZ) == f_0
  84. assert dmp_sub_term(F_0, [[]], 3, 2, QQ) == F_0
  85. def test_dup_mul_term():
  86. f = dup_normal([], ZZ)
  87. assert dup_mul_term(f, ZZ(2), 3, ZZ) == dup_normal([], ZZ)
  88. f = dup_normal([1, 1], ZZ)
  89. assert dup_mul_term(f, ZZ(0), 3, ZZ) == dup_normal([], ZZ)
  90. f = dup_normal([1, 2, 3], ZZ)
  91. assert dup_mul_term(f, ZZ(2), 0, ZZ) == dup_normal([2, 4, 6], ZZ)
  92. assert dup_mul_term(f, ZZ(2), 1, ZZ) == dup_normal([2, 4, 6, 0], ZZ)
  93. assert dup_mul_term(f, ZZ(2), 2, ZZ) == dup_normal([2, 4, 6, 0, 0], ZZ)
  94. assert dup_mul_term(f, ZZ(2), 3, ZZ) == dup_normal([2, 4, 6, 0, 0, 0], ZZ)
  95. def test_dmp_mul_term():
  96. assert dmp_mul_term([ZZ(1), ZZ(2), ZZ(3)], ZZ(2), 1, 0, ZZ) == \
  97. dup_mul_term([ZZ(1), ZZ(2), ZZ(3)], ZZ(2), 1, ZZ)
  98. assert dmp_mul_term([[]], [ZZ(2)], 3, 1, ZZ) == [[]]
  99. assert dmp_mul_term([[ZZ(1)]], [], 3, 1, ZZ) == [[]]
  100. assert dmp_mul_term([[ZZ(1), ZZ(2)], [ZZ(3)]], [ZZ(2)], 2, 1, ZZ) == \
  101. [[ZZ(2), ZZ(4)], [ZZ(6)], [], []]
  102. assert dmp_mul_term([[]], [QQ(2, 3)], 3, 1, QQ) == [[]]
  103. assert dmp_mul_term([[QQ(1, 2)]], [], 3, 1, QQ) == [[]]
  104. assert dmp_mul_term([[QQ(1, 5), QQ(2, 5)], [QQ(3, 5)]], [QQ(2, 3)], 2, 1, QQ) == \
  105. [[QQ(2, 15), QQ(4, 15)], [QQ(6, 15)], [], []]
  106. def test_dup_add_ground():
  107. f = ZZ.map([1, 2, 3, 4])
  108. g = ZZ.map([1, 2, 3, 8])
  109. assert dup_add_ground(f, ZZ(4), ZZ) == g
  110. def test_dmp_add_ground():
  111. f = ZZ.map([[1], [2], [3], [4]])
  112. g = ZZ.map([[1], [2], [3], [8]])
  113. assert dmp_add_ground(f, ZZ(4), 1, ZZ) == g
  114. def test_dup_sub_ground():
  115. f = ZZ.map([1, 2, 3, 4])
  116. g = ZZ.map([1, 2, 3, 0])
  117. assert dup_sub_ground(f, ZZ(4), ZZ) == g
  118. def test_dmp_sub_ground():
  119. f = ZZ.map([[1], [2], [3], [4]])
  120. g = ZZ.map([[1], [2], [3], []])
  121. assert dmp_sub_ground(f, ZZ(4), 1, ZZ) == g
  122. def test_dup_mul_ground():
  123. f = dup_normal([], ZZ)
  124. assert dup_mul_ground(f, ZZ(2), ZZ) == dup_normal([], ZZ)
  125. f = dup_normal([1, 2, 3], ZZ)
  126. assert dup_mul_ground(f, ZZ(0), ZZ) == dup_normal([], ZZ)
  127. assert dup_mul_ground(f, ZZ(2), ZZ) == dup_normal([2, 4, 6], ZZ)
  128. def test_dmp_mul_ground():
  129. assert dmp_mul_ground(f_0, ZZ(2), 2, ZZ) == [
  130. [[ZZ(2), ZZ(4), ZZ(6)], [ZZ(4)]],
  131. [[ZZ(6)]],
  132. [[ZZ(8), ZZ(10), ZZ(12)], [ZZ(2), ZZ(4), ZZ(2)], [ZZ(2)]]
  133. ]
  134. assert dmp_mul_ground(F_0, QQ(1, 2), 2, QQ) == [
  135. [[QQ(1, 14), QQ(2, 14), QQ(3, 14)], [QQ(2, 14)]],
  136. [[QQ(3, 14)]],
  137. [[QQ(4, 14), QQ(5, 14), QQ(6, 14)], [QQ(1, 14), QQ(2, 14),
  138. QQ(1, 14)], [QQ(1, 14)]]
  139. ]
  140. def test_dup_quo_ground():
  141. raises(ZeroDivisionError, lambda: dup_quo_ground(dup_normal([1, 2,
  142. 3], ZZ), ZZ(0), ZZ))
  143. f = dup_normal([], ZZ)
  144. assert dup_quo_ground(f, ZZ(3), ZZ) == dup_normal([], ZZ)
  145. f = dup_normal([6, 2, 8], ZZ)
  146. assert dup_quo_ground(f, ZZ(1), ZZ) == f
  147. assert dup_quo_ground(f, ZZ(2), ZZ) == dup_normal([3, 1, 4], ZZ)
  148. assert dup_quo_ground(f, ZZ(3), ZZ) == dup_normal([2, 0, 2], ZZ)
  149. f = dup_normal([6, 2, 8], QQ)
  150. assert dup_quo_ground(f, QQ(1), QQ) == f
  151. assert dup_quo_ground(f, QQ(2), QQ) == [QQ(3), QQ(1), QQ(4)]
  152. assert dup_quo_ground(f, QQ(7), QQ) == [QQ(6, 7), QQ(2, 7), QQ(8, 7)]
  153. def test_dup_exquo_ground():
  154. raises(ZeroDivisionError, lambda: dup_exquo_ground(dup_normal([1,
  155. 2, 3], ZZ), ZZ(0), ZZ))
  156. raises(ExactQuotientFailed, lambda: dup_exquo_ground(dup_normal([1,
  157. 2, 3], ZZ), ZZ(3), ZZ))
  158. f = dup_normal([], ZZ)
  159. assert dup_exquo_ground(f, ZZ(3), ZZ) == dup_normal([], ZZ)
  160. f = dup_normal([6, 2, 8], ZZ)
  161. assert dup_exquo_ground(f, ZZ(1), ZZ) == f
  162. assert dup_exquo_ground(f, ZZ(2), ZZ) == dup_normal([3, 1, 4], ZZ)
  163. f = dup_normal([6, 2, 8], QQ)
  164. assert dup_exquo_ground(f, QQ(1), QQ) == f
  165. assert dup_exquo_ground(f, QQ(2), QQ) == [QQ(3), QQ(1), QQ(4)]
  166. assert dup_exquo_ground(f, QQ(7), QQ) == [QQ(6, 7), QQ(2, 7), QQ(8, 7)]
  167. def test_dmp_quo_ground():
  168. f = dmp_normal([[6], [2], [8]], 1, ZZ)
  169. assert dmp_quo_ground(f, ZZ(1), 1, ZZ) == f
  170. assert dmp_quo_ground(
  171. f, ZZ(2), 1, ZZ) == dmp_normal([[3], [1], [4]], 1, ZZ)
  172. assert dmp_normal(dmp_quo_ground(
  173. f, ZZ(3), 1, ZZ), 1, ZZ) == dmp_normal([[2], [], [2]], 1, ZZ)
  174. def test_dmp_exquo_ground():
  175. f = dmp_normal([[6], [2], [8]], 1, ZZ)
  176. assert dmp_exquo_ground(f, ZZ(1), 1, ZZ) == f
  177. assert dmp_exquo_ground(
  178. f, ZZ(2), 1, ZZ) == dmp_normal([[3], [1], [4]], 1, ZZ)
  179. def test_dup_lshift():
  180. assert dup_lshift([], 3, ZZ) == []
  181. assert dup_lshift([1], 3, ZZ) == [1, 0, 0, 0]
  182. def test_dup_rshift():
  183. assert dup_rshift([], 3, ZZ) == []
  184. assert dup_rshift([1, 0, 0, 0], 3, ZZ) == [1]
  185. def test_dup_abs():
  186. assert dup_abs([], ZZ) == []
  187. assert dup_abs([ZZ( 1)], ZZ) == [ZZ(1)]
  188. assert dup_abs([ZZ(-7)], ZZ) == [ZZ(7)]
  189. assert dup_abs([ZZ(-1), ZZ(2), ZZ(3)], ZZ) == [ZZ(1), ZZ(2), ZZ(3)]
  190. assert dup_abs([], QQ) == []
  191. assert dup_abs([QQ( 1, 2)], QQ) == [QQ(1, 2)]
  192. assert dup_abs([QQ(-7, 3)], QQ) == [QQ(7, 3)]
  193. assert dup_abs(
  194. [QQ(-1, 7), QQ(2, 7), QQ(3, 7)], QQ) == [QQ(1, 7), QQ(2, 7), QQ(3, 7)]
  195. def test_dmp_abs():
  196. assert dmp_abs([ZZ(-1)], 0, ZZ) == [ZZ(1)]
  197. assert dmp_abs([QQ(-1, 2)], 0, QQ) == [QQ(1, 2)]
  198. assert dmp_abs([[[]]], 2, ZZ) == [[[]]]
  199. assert dmp_abs([[[ZZ(1)]]], 2, ZZ) == [[[ZZ(1)]]]
  200. assert dmp_abs([[[ZZ(-7)]]], 2, ZZ) == [[[ZZ(7)]]]
  201. assert dmp_abs([[[]]], 2, QQ) == [[[]]]
  202. assert dmp_abs([[[QQ(1, 2)]]], 2, QQ) == [[[QQ(1, 2)]]]
  203. assert dmp_abs([[[QQ(-7, 9)]]], 2, QQ) == [[[QQ(7, 9)]]]
  204. def test_dup_neg():
  205. assert dup_neg([], ZZ) == []
  206. assert dup_neg([ZZ(1)], ZZ) == [ZZ(-1)]
  207. assert dup_neg([ZZ(-7)], ZZ) == [ZZ(7)]
  208. assert dup_neg([ZZ(-1), ZZ(2), ZZ(3)], ZZ) == [ZZ(1), ZZ(-2), ZZ(-3)]
  209. assert dup_neg([], QQ) == []
  210. assert dup_neg([QQ(1, 2)], QQ) == [QQ(-1, 2)]
  211. assert dup_neg([QQ(-7, 9)], QQ) == [QQ(7, 9)]
  212. assert dup_neg([QQ(
  213. -1, 7), QQ(2, 7), QQ(3, 7)], QQ) == [QQ(1, 7), QQ(-2, 7), QQ(-3, 7)]
  214. def test_dmp_neg():
  215. assert dmp_neg([ZZ(-1)], 0, ZZ) == [ZZ(1)]
  216. assert dmp_neg([QQ(-1, 2)], 0, QQ) == [QQ(1, 2)]
  217. assert dmp_neg([[[]]], 2, ZZ) == [[[]]]
  218. assert dmp_neg([[[ZZ(1)]]], 2, ZZ) == [[[ZZ(-1)]]]
  219. assert dmp_neg([[[ZZ(-7)]]], 2, ZZ) == [[[ZZ(7)]]]
  220. assert dmp_neg([[[]]], 2, QQ) == [[[]]]
  221. assert dmp_neg([[[QQ(1, 9)]]], 2, QQ) == [[[QQ(-1, 9)]]]
  222. assert dmp_neg([[[QQ(-7, 9)]]], 2, QQ) == [[[QQ(7, 9)]]]
  223. def test_dup_add():
  224. assert dup_add([], [], ZZ) == []
  225. assert dup_add([ZZ(1)], [], ZZ) == [ZZ(1)]
  226. assert dup_add([], [ZZ(1)], ZZ) == [ZZ(1)]
  227. assert dup_add([ZZ(1)], [ZZ(1)], ZZ) == [ZZ(2)]
  228. assert dup_add([ZZ(1)], [ZZ(2)], ZZ) == [ZZ(3)]
  229. assert dup_add([ZZ(1), ZZ(2)], [ZZ(1)], ZZ) == [ZZ(1), ZZ(3)]
  230. assert dup_add([ZZ(1)], [ZZ(1), ZZ(2)], ZZ) == [ZZ(1), ZZ(3)]
  231. assert dup_add([ZZ(1), ZZ(
  232. 2), ZZ(3)], [ZZ(8), ZZ(9), ZZ(10)], ZZ) == [ZZ(9), ZZ(11), ZZ(13)]
  233. assert dup_add([], [], QQ) == []
  234. assert dup_add([QQ(1, 2)], [], QQ) == [QQ(1, 2)]
  235. assert dup_add([], [QQ(1, 2)], QQ) == [QQ(1, 2)]
  236. assert dup_add([QQ(1, 4)], [QQ(1, 4)], QQ) == [QQ(1, 2)]
  237. assert dup_add([QQ(1, 4)], [QQ(1, 2)], QQ) == [QQ(3, 4)]
  238. assert dup_add([QQ(1, 2), QQ(2, 3)], [QQ(1)], QQ) == [QQ(1, 2), QQ(5, 3)]
  239. assert dup_add([QQ(1)], [QQ(1, 2), QQ(2, 3)], QQ) == [QQ(1, 2), QQ(5, 3)]
  240. assert dup_add([QQ(1, 7), QQ(2, 7), QQ(3, 7)], [QQ(
  241. 8, 7), QQ(9, 7), QQ(10, 7)], QQ) == [QQ(9, 7), QQ(11, 7), QQ(13, 7)]
  242. def test_dmp_add():
  243. assert dmp_add([ZZ(1), ZZ(2)], [ZZ(1)], 0, ZZ) == \
  244. dup_add([ZZ(1), ZZ(2)], [ZZ(1)], ZZ)
  245. assert dmp_add([QQ(1, 2), QQ(2, 3)], [QQ(1)], 0, QQ) == \
  246. dup_add([QQ(1, 2), QQ(2, 3)], [QQ(1)], QQ)
  247. assert dmp_add([[[]]], [[[]]], 2, ZZ) == [[[]]]
  248. assert dmp_add([[[ZZ(1)]]], [[[]]], 2, ZZ) == [[[ZZ(1)]]]
  249. assert dmp_add([[[]]], [[[ZZ(1)]]], 2, ZZ) == [[[ZZ(1)]]]
  250. assert dmp_add([[[ZZ(2)]]], [[[ZZ(1)]]], 2, ZZ) == [[[ZZ(3)]]]
  251. assert dmp_add([[[ZZ(1)]]], [[[ZZ(2)]]], 2, ZZ) == [[[ZZ(3)]]]
  252. assert dmp_add([[[]]], [[[]]], 2, QQ) == [[[]]]
  253. assert dmp_add([[[QQ(1, 2)]]], [[[]]], 2, QQ) == [[[QQ(1, 2)]]]
  254. assert dmp_add([[[]]], [[[QQ(1, 2)]]], 2, QQ) == [[[QQ(1, 2)]]]
  255. assert dmp_add([[[QQ(2, 7)]]], [[[QQ(1, 7)]]], 2, QQ) == [[[QQ(3, 7)]]]
  256. assert dmp_add([[[QQ(1, 7)]]], [[[QQ(2, 7)]]], 2, QQ) == [[[QQ(3, 7)]]]
  257. def test_dup_sub():
  258. assert dup_sub([], [], ZZ) == []
  259. assert dup_sub([ZZ(1)], [], ZZ) == [ZZ(1)]
  260. assert dup_sub([], [ZZ(1)], ZZ) == [ZZ(-1)]
  261. assert dup_sub([ZZ(1)], [ZZ(1)], ZZ) == []
  262. assert dup_sub([ZZ(1)], [ZZ(2)], ZZ) == [ZZ(-1)]
  263. assert dup_sub([ZZ(1), ZZ(2)], [ZZ(1)], ZZ) == [ZZ(1), ZZ(1)]
  264. assert dup_sub([ZZ(1)], [ZZ(1), ZZ(2)], ZZ) == [ZZ(-1), ZZ(-1)]
  265. assert dup_sub([ZZ(3), ZZ(
  266. 2), ZZ(1)], [ZZ(8), ZZ(9), ZZ(10)], ZZ) == [ZZ(-5), ZZ(-7), ZZ(-9)]
  267. assert dup_sub([], [], QQ) == []
  268. assert dup_sub([QQ(1, 2)], [], QQ) == [QQ(1, 2)]
  269. assert dup_sub([], [QQ(1, 2)], QQ) == [QQ(-1, 2)]
  270. assert dup_sub([QQ(1, 3)], [QQ(1, 3)], QQ) == []
  271. assert dup_sub([QQ(1, 3)], [QQ(2, 3)], QQ) == [QQ(-1, 3)]
  272. assert dup_sub([QQ(1, 7), QQ(2, 7)], [QQ(1)], QQ) == [QQ(1, 7), QQ(-5, 7)]
  273. assert dup_sub([QQ(1)], [QQ(1, 7), QQ(2, 7)], QQ) == [QQ(-1, 7), QQ(5, 7)]
  274. assert dup_sub([QQ(3, 7), QQ(2, 7), QQ(1, 7)], [QQ(
  275. 8, 7), QQ(9, 7), QQ(10, 7)], QQ) == [QQ(-5, 7), QQ(-7, 7), QQ(-9, 7)]
  276. def test_dmp_sub():
  277. assert dmp_sub([ZZ(1), ZZ(2)], [ZZ(1)], 0, ZZ) == \
  278. dup_sub([ZZ(1), ZZ(2)], [ZZ(1)], ZZ)
  279. assert dmp_sub([QQ(1, 2), QQ(2, 3)], [QQ(1)], 0, QQ) == \
  280. dup_sub([QQ(1, 2), QQ(2, 3)], [QQ(1)], QQ)
  281. assert dmp_sub([[[]]], [[[]]], 2, ZZ) == [[[]]]
  282. assert dmp_sub([[[ZZ(1)]]], [[[]]], 2, ZZ) == [[[ZZ(1)]]]
  283. assert dmp_sub([[[]]], [[[ZZ(1)]]], 2, ZZ) == [[[ZZ(-1)]]]
  284. assert dmp_sub([[[ZZ(2)]]], [[[ZZ(1)]]], 2, ZZ) == [[[ZZ(1)]]]
  285. assert dmp_sub([[[ZZ(1)]]], [[[ZZ(2)]]], 2, ZZ) == [[[ZZ(-1)]]]
  286. assert dmp_sub([[[]]], [[[]]], 2, QQ) == [[[]]]
  287. assert dmp_sub([[[QQ(1, 2)]]], [[[]]], 2, QQ) == [[[QQ(1, 2)]]]
  288. assert dmp_sub([[[]]], [[[QQ(1, 2)]]], 2, QQ) == [[[QQ(-1, 2)]]]
  289. assert dmp_sub([[[QQ(2, 7)]]], [[[QQ(1, 7)]]], 2, QQ) == [[[QQ(1, 7)]]]
  290. assert dmp_sub([[[QQ(1, 7)]]], [[[QQ(2, 7)]]], 2, QQ) == [[[QQ(-1, 7)]]]
  291. def test_dup_add_mul():
  292. assert dup_add_mul([ZZ(1), ZZ(2), ZZ(3)], [ZZ(3), ZZ(2), ZZ(1)],
  293. [ZZ(1), ZZ(2)], ZZ) == [ZZ(3), ZZ(9), ZZ(7), ZZ(5)]
  294. assert dmp_add_mul([[ZZ(1), ZZ(2)], [ZZ(3)]], [[ZZ(3)], [ZZ(2), ZZ(1)]],
  295. [[ZZ(1)], [ZZ(2)]], 1, ZZ) == [[ZZ(3)], [ZZ(3), ZZ(9)], [ZZ(4), ZZ(5)]]
  296. def test_dup_sub_mul():
  297. assert dup_sub_mul([ZZ(1), ZZ(2), ZZ(3)], [ZZ(3), ZZ(2), ZZ(1)],
  298. [ZZ(1), ZZ(2)], ZZ) == [ZZ(-3), ZZ(-7), ZZ(-3), ZZ(1)]
  299. assert dmp_sub_mul([[ZZ(1), ZZ(2)], [ZZ(3)]], [[ZZ(3)], [ZZ(2), ZZ(1)]],
  300. [[ZZ(1)], [ZZ(2)]], 1, ZZ) == [[ZZ(-3)], [ZZ(-1), ZZ(-5)], [ZZ(-4), ZZ(1)]]
  301. def test_dup_mul():
  302. assert dup_mul([], [], ZZ) == []
  303. assert dup_mul([], [ZZ(1)], ZZ) == []
  304. assert dup_mul([ZZ(1)], [], ZZ) == []
  305. assert dup_mul([ZZ(1)], [ZZ(1)], ZZ) == [ZZ(1)]
  306. assert dup_mul([ZZ(5)], [ZZ(7)], ZZ) == [ZZ(35)]
  307. assert dup_mul([], [], QQ) == []
  308. assert dup_mul([], [QQ(1, 2)], QQ) == []
  309. assert dup_mul([QQ(1, 2)], [], QQ) == []
  310. assert dup_mul([QQ(1, 2)], [QQ(4, 7)], QQ) == [QQ(2, 7)]
  311. assert dup_mul([QQ(5, 7)], [QQ(3, 7)], QQ) == [QQ(15, 49)]
  312. f = dup_normal([3, 0, 0, 6, 1, 2], ZZ)
  313. g = dup_normal([4, 0, 1, 0], ZZ)
  314. h = dup_normal([12, 0, 3, 24, 4, 14, 1, 2, 0], ZZ)
  315. assert dup_mul(f, g, ZZ) == h
  316. assert dup_mul(g, f, ZZ) == h
  317. f = dup_normal([2, 0, 0, 1, 7], ZZ)
  318. h = dup_normal([4, 0, 0, 4, 28, 0, 1, 14, 49], ZZ)
  319. assert dup_mul(f, f, ZZ) == h
  320. K = FF(6)
  321. assert dup_mul([K(2), K(1)], [K(3), K(4)], K) == [K(5), K(4)]
  322. p1 = dup_normal([79, -1, 78, -94, -10, 11, 32, -19, 78, 2, -89, 30, 73, 42,
  323. 85, 77, 83, -30, -34, -2, 95, -81, 37, -49, -46, -58, -16, 37, 35, -11,
  324. -57, -15, -31, 67, -20, 27, 76, 2, 70, 67, -65, 65, -26, -93, -44, -12,
  325. -92, 57, -90, -57, -11, -67, -98, -69, 97, -41, 89, 33, 89, -50, 81,
  326. -31, 60, -27, 43, 29, -77, 44, 21, -91, 32, -57, 33, 3, 53, -51, -38,
  327. -99, -84, 23, -50, 66, -100, 1, -75, -25, 27, -60, 98, -51, -87, 6, 8,
  328. 78, -28, -95, -88, 12, -35, 26, -9, 16, -92, 55, -7, -86, 68, -39, -46,
  329. 84, 94, 45, 60, 92, 68, -75, -74, -19, 8, 75, 78, 91, 57, 34, 14, -3,
  330. -49, 65, 78, -18, 6, -29, -80, -98, 17, 13, 58, 21, 20, 9, 37, 7, -30,
  331. -53, -20, 34, 67, -42, 89, -22, 73, 43, -6, 5, 51, -8, -15, -52, -22,
  332. -58, -72, -3, 43, -92, 82, 83, -2, -13, -23, -60, 16, -94, -8, -28,
  333. -95, -72, 63, -90, 76, 6, -43, -100, -59, 76, 3, 3, 46, -85, 75, 62,
  334. -71, -76, 88, 97, -72, -1, 30, -64, 72, -48, 14, -78, 58, 63, -91, 24,
  335. -87, -27, -80, -100, -44, 98, 70, 100, -29, -38, 11, 77, 100, 52, 86,
  336. 65, -5, -42, -81, -38, -42, 43, -2, -70, -63, -52], ZZ)
  337. p2 = dup_normal([65, -19, -47, 1, 90, 81, -15, -34, 25, -75, 9, -83, 50, -5,
  338. -44, 31, 1, 70, -7, 78, 74, 80, 85, 65, 21, 41, 66, 19, -40, 63, -21,
  339. -27, 32, 69, 83, 34, -35, 14, 81, 57, -75, 32, -67, -89, -100, -61, 46,
  340. 84, -78, -29, -50, -94, -24, -32, -68, -16, 100, -7, -72, -89, 35, 82,
  341. 58, 81, -92, 62, 5, -47, -39, -58, -72, -13, 84, 44, 55, -25, 48, -54,
  342. -31, -56, -11, -50, -84, 10, 67, 17, 13, -14, 61, 76, -64, -44, -40,
  343. -96, 11, -11, -94, 2, 6, 27, -6, 68, -54, 66, -74, -14, -1, -24, -73,
  344. 96, 89, -11, -89, 56, -53, 72, -43, 96, 25, 63, -31, 29, 68, 83, 91,
  345. -93, -19, -38, -40, 40, -12, -19, -79, 44, 100, -66, -29, -77, 62, 39,
  346. -8, 11, -97, 14, 87, 64, 21, -18, 13, 15, -59, -75, -99, -88, 57, 54,
  347. 56, -67, 6, -63, -59, -14, 28, 87, -20, -39, 84, -91, -2, 49, -75, 11,
  348. -24, -95, 36, 66, 5, 25, -72, -40, 86, 90, 37, -33, 57, -35, 29, -18,
  349. 4, -79, 64, -17, -27, 21, 29, -5, -44, -87, -24, 52, 78, 11, -23, -53,
  350. 36, 42, 21, -68, 94, -91, -51, -21, 51, -76, 72, 31, 24, -48, -80, -9,
  351. 37, -47, -6, -8, -63, -91, 79, -79, -100, 38, -20, 38, 100, 83, -90,
  352. 87, 63, -36, 82, -19, 18, -98, -38, 26, 98, -70, 79, 92, 12, 12, 70,
  353. 74, 36, 48, -13, 31, 31, -47, -71, -12, -64, 36, -42, 32, -86, 60, 83,
  354. 70, 55, 0, 1, 29, -35, 8, -82, 8, -73, -46, -50, 43, 48, -5, -86, -72,
  355. 44, -90, 19, 19, 5, -20, 97, -13, -66, -5, 5, -69, 64, -30, 41, 51, 36,
  356. 13, -99, -61, 94, -12, 74, 98, 68, 24, 46, -97, -87, -6, -27, 82, 62,
  357. -11, -77, 86, 66, -47, -49, -50, 13, 18, 89, -89, 46, -80, 13, 98, -35,
  358. -36, -25, 12, 20, 26, -52, 79, 27, 79, 100, 8, 62, -58, -28, 37], ZZ)
  359. res = dup_normal([5135, -1566, 1376, -7466, 4579, 11710, 8001, -7183,
  360. -3737, -7439, 345, -10084, 24522, -1201, 1070, -10245, 9582, 9264,
  361. 1903, 23312, 18953, 10037, -15268, -5450, 6442, -6243, -3777, 5110,
  362. 10936, -16649, -6022, 16255, 31300, 24818, 31922, 32760, 7854, 27080,
  363. 15766, 29596, 7139, 31945, -19810, 465, -38026, -3971, 9641, 465,
  364. -19375, 5524, -30112, -11960, -12813, 13535, 30670, 5925, -43725,
  365. -14089, 11503, -22782, 6371, 43881, 37465, -33529, -33590, -39798,
  366. -37854, -18466, -7908, -35825, -26020, -36923, -11332, -5699, 25166,
  367. -3147, 19885, 12962, -20659, -1642, 27723, -56331, -24580, -11010,
  368. -20206, 20087, -23772, -16038, 38580, 20901, -50731, 32037, -4299,
  369. 26508, 18038, -28357, 31846, -7405, -20172, -15894, 2096, 25110,
  370. -45786, 45918, -55333, -31928, -49428, -29824, -58796, -24609, -15408,
  371. 69, -35415, -18439, 10123, -20360, -65949, 33356, -20333, 26476,
  372. -32073, 33621, 930, 28803, -42791, 44716, 38164, 12302, -1739, 11421,
  373. 73385, -7613, 14297, 38155, -414, 77587, 24338, -21415, 29367, 42639,
  374. 13901, -288, 51027, -11827, 91260, 43407, 88521, -15186, 70572, -12049,
  375. 5090, -12208, -56374, 15520, -623, -7742, 50825, 11199, -14894, 40892,
  376. 59591, -31356, -28696, -57842, -87751, -33744, -28436, -28945, -40287,
  377. 37957, -35638, 33401, -61534, 14870, 40292, 70366, -10803, 102290,
  378. -71719, -85251, 7902, -22409, 75009, 99927, 35298, -1175, -762, -34744,
  379. -10587, -47574, -62629, -19581, -43659, -54369, -32250, -39545, 15225,
  380. -24454, 11241, -67308, -30148, 39929, 37639, 14383, -73475, -77636,
  381. -81048, -35992, 41601, -90143, 76937, -8112, 56588, 9124, -40094,
  382. -32340, 13253, 10898, -51639, 36390, 12086, -1885, 100714, -28561,
  383. -23784, -18735, 18916, 16286, 10742, -87360, -13697, 10689, -19477,
  384. -29770, 5060, 20189, -8297, 112407, 47071, 47743, 45519, -4109, 17468,
  385. -68831, 78325, -6481, -21641, -19459, 30919, 96115, 8607, 53341, 32105,
  386. -16211, 23538, 57259, -76272, -40583, 62093, 38511, -34255, -40665,
  387. -40604, -37606, -15274, 33156, -13885, 103636, 118678, -14101, -92682,
  388. -100791, 2634, 63791, 98266, 19286, -34590, -21067, -71130, 25380,
  389. -40839, -27614, -26060, 52358, -15537, 27138, -6749, 36269, -33306,
  390. 13207, -91084, -5540, -57116, 69548, 44169, -57742, -41234, -103327,
  391. -62904, -8566, 41149, -12866, 71188, 23980, 1838, 58230, 73950, 5594,
  392. 43113, -8159, -15925, 6911, 85598, -75016, -16214, -62726, -39016,
  393. 8618, -63882, -4299, 23182, 49959, 49342, -3238, -24913, -37138, 78361,
  394. 32451, 6337, -11438, -36241, -37737, 8169, -3077, -24829, 57953, 53016,
  395. -31511, -91168, 12599, -41849, 41576, 55275, -62539, 47814, -62319,
  396. 12300, -32076, -55137, -84881, -27546, 4312, -3433, -54382, 113288,
  397. -30157, 74469, 18219, 79880, -2124, 98911, 17655, -33499, -32861,
  398. 47242, -37393, 99765, 14831, -44483, 10800, -31617, -52710, 37406,
  399. 22105, 29704, -20050, 13778, 43683, 36628, 8494, 60964, -22644, 31550,
  400. -17693, 33805, -124879, -12302, 19343, 20400, -30937, -21574, -34037,
  401. -33380, 56539, -24993, -75513, -1527, 53563, 65407, -101, 53577, 37991,
  402. 18717, -23795, -8090, -47987, -94717, 41967, 5170, -14815, -94311,
  403. 17896, -17734, -57718, -774, -38410, 24830, 29682, 76480, 58802,
  404. -46416, -20348, -61353, -68225, -68306, 23822, -31598, 42972, 36327,
  405. 28968, -65638, -21638, 24354, -8356, 26777, 52982, -11783, -44051,
  406. -26467, -44721, -28435, -53265, -25574, -2669, 44155, 22946, -18454,
  407. -30718, -11252, 58420, 8711, 67447, 4425, 41749, 67543, 43162, 11793,
  408. -41907, 20477, -13080, 6559, -6104, -13244, 42853, 42935, 29793, 36730,
  409. -28087, 28657, 17946, 7503, 7204, 21491, -27450, -24241, -98156,
  410. -18082, -42613, -24928, 10775, -14842, -44127, 55910, 14777, 31151, -2194,
  411. 39206, -2100, -4211, 11827, -8918, -19471, 72567, 36447, -65590, -34861,
  412. -17147, -45303, 9025, -7333, -35473, 11101, 11638, 3441, 6626, -41800,
  413. 9416, 13679, 33508, 40502, -60542, 16358, 8392, -43242, -35864, -34127,
  414. -48721, 35878, 30598, 28630, 20279, -19983, -14638, -24455, -1851, -11344,
  415. 45150, 42051, 26034, -28889, -32382, -3527, -14532, 22564, -22346, 477,
  416. 11706, 28338, -25972, -9185, -22867, -12522, 32120, -4424, 11339, -33913,
  417. -7184, 5101, -23552, -17115, -31401, -6104, 21906, 25708, 8406, 6317,
  418. -7525, 5014, 20750, 20179, 22724, 11692, 13297, 2493, -253, -16841, -17339,
  419. -6753, -4808, 2976, -10881, -10228, -13816, -12686, 1385, 2316, 2190, -875,
  420. -1924], ZZ)
  421. assert dup_mul(p1, p2, ZZ) == res
  422. p1 = dup_normal([83, -61, -86, -24, 12, 43, -88, -9, 42, 55, -66, 74, 95,
  423. -25, -12, 68, -99, 4, 45, 6, -15, -19, 78, 65, -55, 47, -13, 17, 86,
  424. 81, -58, -27, 50, -40, -24, 39, -41, -92, 75, 90, -1, 40, -15, -27,
  425. -35, 68, 70, -64, -40, 78, -88, -58, -39, 69, 46, 12, 28, -94, -37,
  426. -50, -80, -96, -61, 25, 1, 71, 4, 12, 48, 4, 34, -47, -75, 5, 48, 82,
  427. 88, 23, 98, 35, 17, -10, 48, -61, -95, 47, 65, -19, -66, -57, -6, -51,
  428. -42, -89, 66, -13, 18, 37, 90, -23, 72, 96, -53, 0, 40, -73, -52, -68,
  429. 32, -25, -53, 79, -52, 18, 44, 73, -81, 31, -90, 70, 3, 36, 48, 76,
  430. -24, -44, 23, 98, -4, 73, 69, 88, -70, 14, -68, 94, -78, -15, -64, -97,
  431. -70, -35, 65, 88, 49, -53, -7, 12, -45, -7, 59, -94, 99, -2, 67, -60,
  432. -71, 29, -62, -77, 1, 51, 17, 80, -20, -47, -19, 24, -9, 39, -23, 21,
  433. -84, 10, 84, 56, -17, -21, -66, 85, 70, 46, -51, -22, -95, 78, -60,
  434. -96, -97, -45, 72, 35, 30, -61, -92, -93, -60, -61, 4, -4, -81, -73,
  435. 46, 53, -11, 26, 94, 45, 14, -78, 55, 84, -68, 98, 60, 23, 100, -63,
  436. 68, 96, -16, 3, 56, 21, -58, 62, -67, 66, 85, 41, -79, -22, 97, -67,
  437. 82, 82, -96, -20, -7, 48, -67, 48, -9, -39, 78], ZZ)
  438. p2 = dup_normal([52, 88, 76, 66, 9, -64, 46, -20, -28, 69, 60, 96, -36,
  439. -92, -30, -11, -35, 35, 55, 63, -92, -7, 25, -58, 74, 55, -6, 4, 47,
  440. -92, -65, 67, -45, 74, -76, 59, -6, 69, 39, 24, -71, -7, 39, -45, 60,
  441. -68, 98, 97, -79, 17, 4, 94, -64, 68, -100, -96, -2, 3, 22, 96, 54,
  442. -77, -86, 67, 6, 57, 37, 40, 89, -78, 64, -94, -45, -92, 57, 87, -26,
  443. 36, 19, 97, 25, 77, -87, 24, 43, -5, 35, 57, 83, 71, 35, 63, 61, 96,
  444. -22, 8, -1, 96, 43, 45, 94, -93, 36, 71, -41, -99, 85, -48, 59, 52,
  445. -17, 5, 87, -16, -68, -54, 76, -18, 100, 91, -42, -70, -66, -88, -12,
  446. 1, 95, -82, 52, 43, -29, 3, 12, 72, -99, -43, -32, -93, -51, 16, -20,
  447. -12, -11, 5, 33, -38, 93, -5, -74, 25, 74, -58, 93, 59, -63, -86, 63,
  448. -20, -4, -74, -73, -95, 29, -28, 93, -91, -2, -38, -62, 77, -58, -85,
  449. -28, 95, 38, 19, -69, 86, 94, 25, -2, -4, 47, 34, -59, 35, -48, 29,
  450. -63, -53, 34, 29, 66, 73, 6, 92, -84, 89, 15, 81, 93, 97, 51, -72, -78,
  451. 25, 60, 90, -45, 39, 67, -84, -62, 57, 26, -32, -56, -14, -83, 76, 5,
  452. -2, 99, -100, 28, 46, 94, -7, 53, -25, 16, -23, -36, 89, -78, -63, 31,
  453. 1, 84, -99, -52, 76, 48, 90, -76, 44, -19, 54, -36, -9, -73, -100, -69,
  454. 31, 42, 25, -39, 76, -26, -8, -14, 51, 3, 37, 45, 2, -54, 13, -34, -92,
  455. 17, -25, -65, 53, -63, 30, 4, -70, -67, 90, 52, 51, 18, -3, 31, -45,
  456. -9, 59, 63, -87, 22, -32, 29, -38, 21, 36, -82, 27, -11], ZZ)
  457. res = dup_normal([4316, 4132, -3532, -7974, -11303, -10069, 5484, -3330,
  458. -5874, 7734, 4673, 11327, -9884, -8031, 17343, 21035, -10570, -9285,
  459. 15893, 3780, -14083, 8819, 17592, 10159, 7174, -11587, 8598, -16479,
  460. 3602, 25596, 9781, 12163, 150, 18749, -21782, -12307, 27578, -2757,
  461. -12573, 12565, 6345, -18956, 19503, -15617, 1443, -16778, 36851, 23588,
  462. -28474, 5749, 40695, -7521, -53669, -2497, -18530, 6770, 57038, 3926,
  463. -6927, -15399, 1848, -64649, -27728, 3644, 49608, 15187, -8902, -9480,
  464. -7398, -40425, 4824, 23767, -7594, -6905, 33089, 18786, 12192, 24670,
  465. 31114, 35334, -4501, -14676, 7107, -59018, -21352, 20777, 19661, 20653,
  466. 33754, -885, -43758, 6269, 51897, -28719, -97488, -9527, 13746, 11644,
  467. 17644, -21720, 23782, -10481, 47867, 20752, 33810, -1875, 39918, -7710,
  468. -40840, 19808, -47075, 23066, 46616, 25201, 9287, 35436, -1602, 9645,
  469. -11978, 13273, 15544, 33465, 20063, 44539, 11687, 27314, -6538, -37467,
  470. 14031, 32970, -27086, 41323, 29551, 65910, -39027, -37800, -22232,
  471. 8212, 46316, -28981, -55282, 50417, -44929, -44062, 73879, 37573,
  472. -2596, -10877, -21893, -133218, -33707, -25753, -9531, 17530, 61126,
  473. 2748, -56235, 43874, -10872, -90459, -30387, 115267, -7264, -44452,
  474. 122626, 14839, -599, 10337, 57166, -67467, -54957, 63669, 1202, 18488,
  475. 52594, 7205, -97822, 612, 78069, -5403, -63562, 47236, 36873, -154827,
  476. -26188, 82427, -39521, 5628, 7416, 5276, -53095, 47050, 26121, -42207,
  477. 79021, -13035, 2499, -66943, 29040, -72355, -23480, 23416, -12885,
  478. -44225, -42688, -4224, 19858, 55299, 15735, 11465, 101876, -39169,
  479. 51786, 14723, 43280, -68697, 16410, 92295, 56767, 7183, 111850, 4550,
  480. 115451, -38443, -19642, -35058, 10230, 93829, 8925, 63047, 3146, 29250,
  481. 8530, 5255, -98117, -115517, -76817, -8724, 41044, 1312, -35974, 79333,
  482. -28567, 7547, -10580, -24559, -16238, 10794, -3867, 24848, 57770,
  483. -51536, -35040, 71033, 29853, 62029, -7125, -125585, -32169, -47907,
  484. 156811, -65176, -58006, -15757, -57861, 11963, 30225, -41901, -41681,
  485. 31310, 27982, 18613, 61760, 60746, -59096, 33499, 30097, -17997, 24032,
  486. 56442, -83042, 23747, -20931, -21978, -158752, -9883, -73598, -7987,
  487. -7333, -125403, -116329, 30585, 53281, 51018, -29193, 88575, 8264,
  488. -40147, -16289, 113088, 12810, -6508, 101552, -13037, 34440, -41840,
  489. 101643, 24263, 80532, 61748, 65574, 6423, -20672, 6591, -10834, -71716,
  490. 86919, -92626, 39161, 28490, 81319, 46676, 106720, 43530, 26998, 57456,
  491. -8862, 60989, 13982, 3119, -2224, 14743, 55415, -49093, -29303, 28999,
  492. 1789, 55953, -84043, -7780, -65013, 57129, -47251, 61484, 61994,
  493. -78361, -82778, 22487, -26894, 9756, -74637, -15519, -4360, 30115,
  494. 42433, 35475, 15286, 69768, 21509, -20214, 78675, -21163, 13596, 11443,
  495. -10698, -53621, -53867, -24155, 64500, -42784, -33077, -16500, 873,
  496. -52788, 14546, -38011, 36974, -39849, -34029, -94311, 83068, -50437,
  497. -26169, -46746, 59185, 42259, -101379, -12943, 30089, -59086, 36271,
  498. 22723, -30253, -52472, -70826, -23289, 3331, -31687, 14183, -857,
  499. -28627, 35246, -51284, 5636, -6933, 66539, 36654, 50927, 24783, 3457,
  500. 33276, 45281, 45650, -4938, -9968, -22590, 47995, 69229, 5214, -58365,
  501. -17907, -14651, 18668, 18009, 12649, -11851, -13387, 20339, 52472,
  502. -1087, -21458, -68647, 52295, 15849, 40608, 15323, 25164, -29368,
  503. 10352, -7055, 7159, 21695, -5373, -54849, 101103, -24963, -10511,
  504. 33227, 7659, 41042, -69588, 26718, -20515, 6441, 38135, -63, 24088,
  505. -35364, -12785, -18709, 47843, 48533, -48575, 17251, -19394, 32878,
  506. -9010, -9050, 504, -12407, 28076, -3429, 25324, -4210, -26119, 752,
  507. -29203, 28251, -11324, -32140, -3366, -25135, 18702, -31588, -7047,
  508. -24267, 49987, -14975, -33169, 37744, -7720, -9035, 16964, -2807, -421,
  509. 14114, -17097, -13662, 40628, -12139, -9427, 5369, 17551, -13232, -16211,
  510. 9804, -7422, 2677, 28635, -8280, -4906, 2908, -22558, 5604, 12459, 8756,
  511. -3980, -4745, -18525, 7913, 5970, -16457, 20230, -6247, -13812, 2505,
  512. 11899, 1409, -15094, 22540, -18863, 137, 11123, -4516, 2290, -8594, 12150,
  513. -10380, 3005, 5235, -7350, 2535, -858], ZZ)
  514. assert dup_mul(p1, p2, ZZ) == res
  515. def test_dmp_mul():
  516. assert dmp_mul([ZZ(5)], [ZZ(7)], 0, ZZ) == \
  517. dup_mul([ZZ(5)], [ZZ(7)], ZZ)
  518. assert dmp_mul([QQ(5, 7)], [QQ(3, 7)], 0, QQ) == \
  519. dup_mul([QQ(5, 7)], [QQ(3, 7)], QQ)
  520. assert dmp_mul([[[]]], [[[]]], 2, ZZ) == [[[]]]
  521. assert dmp_mul([[[ZZ(1)]]], [[[]]], 2, ZZ) == [[[]]]
  522. assert dmp_mul([[[]]], [[[ZZ(1)]]], 2, ZZ) == [[[]]]
  523. assert dmp_mul([[[ZZ(2)]]], [[[ZZ(1)]]], 2, ZZ) == [[[ZZ(2)]]]
  524. assert dmp_mul([[[ZZ(1)]]], [[[ZZ(2)]]], 2, ZZ) == [[[ZZ(2)]]]
  525. assert dmp_mul([[[]]], [[[]]], 2, QQ) == [[[]]]
  526. assert dmp_mul([[[QQ(1, 2)]]], [[[]]], 2, QQ) == [[[]]]
  527. assert dmp_mul([[[]]], [[[QQ(1, 2)]]], 2, QQ) == [[[]]]
  528. assert dmp_mul([[[QQ(2, 7)]]], [[[QQ(1, 3)]]], 2, QQ) == [[[QQ(2, 21)]]]
  529. assert dmp_mul([[[QQ(1, 7)]]], [[[QQ(2, 3)]]], 2, QQ) == [[[QQ(2, 21)]]]
  530. K = FF(6)
  531. assert dmp_mul(
  532. [[K(2)], [K(1)]], [[K(3)], [K(4)]], 1, K) == [[K(5)], [K(4)]]
  533. def test_dup_sqr():
  534. assert dup_sqr([], ZZ) == []
  535. assert dup_sqr([ZZ(2)], ZZ) == [ZZ(4)]
  536. assert dup_sqr([ZZ(1), ZZ(2)], ZZ) == [ZZ(1), ZZ(4), ZZ(4)]
  537. assert dup_sqr([], QQ) == []
  538. assert dup_sqr([QQ(2, 3)], QQ) == [QQ(4, 9)]
  539. assert dup_sqr([QQ(1, 3), QQ(2, 3)], QQ) == [QQ(1, 9), QQ(4, 9), QQ(4, 9)]
  540. f = dup_normal([2, 0, 0, 1, 7], ZZ)
  541. assert dup_sqr(f, ZZ) == dup_normal([4, 0, 0, 4, 28, 0, 1, 14, 49], ZZ)
  542. K = FF(9)
  543. assert dup_sqr([K(3), K(4)], K) == [K(6), K(7)]
  544. def test_dmp_sqr():
  545. assert dmp_sqr([ZZ(1), ZZ(2)], 0, ZZ) == \
  546. dup_sqr([ZZ(1), ZZ(2)], ZZ)
  547. assert dmp_sqr([[[]]], 2, ZZ) == [[[]]]
  548. assert dmp_sqr([[[ZZ(2)]]], 2, ZZ) == [[[ZZ(4)]]]
  549. assert dmp_sqr([[[]]], 2, QQ) == [[[]]]
  550. assert dmp_sqr([[[QQ(2, 3)]]], 2, QQ) == [[[QQ(4, 9)]]]
  551. K = FF(9)
  552. assert dmp_sqr([[K(3)], [K(4)]], 1, K) == [[K(6)], [K(7)]]
  553. def test_dup_pow():
  554. assert dup_pow([], 0, ZZ) == [ZZ(1)]
  555. assert dup_pow([], 0, QQ) == [QQ(1)]
  556. assert dup_pow([], 1, ZZ) == []
  557. assert dup_pow([], 7, ZZ) == []
  558. assert dup_pow([ZZ(1)], 0, ZZ) == [ZZ(1)]
  559. assert dup_pow([ZZ(1)], 1, ZZ) == [ZZ(1)]
  560. assert dup_pow([ZZ(1)], 7, ZZ) == [ZZ(1)]
  561. assert dup_pow([ZZ(3)], 0, ZZ) == [ZZ(1)]
  562. assert dup_pow([ZZ(3)], 1, ZZ) == [ZZ(3)]
  563. assert dup_pow([ZZ(3)], 7, ZZ) == [ZZ(2187)]
  564. assert dup_pow([QQ(1, 1)], 0, QQ) == [QQ(1, 1)]
  565. assert dup_pow([QQ(1, 1)], 1, QQ) == [QQ(1, 1)]
  566. assert dup_pow([QQ(1, 1)], 7, QQ) == [QQ(1, 1)]
  567. assert dup_pow([QQ(3, 7)], 0, QQ) == [QQ(1, 1)]
  568. assert dup_pow([QQ(3, 7)], 1, QQ) == [QQ(3, 7)]
  569. assert dup_pow([QQ(3, 7)], 7, QQ) == [QQ(2187, 823543)]
  570. f = dup_normal([2, 0, 0, 1, 7], ZZ)
  571. assert dup_pow(f, 0, ZZ) == dup_normal([1], ZZ)
  572. assert dup_pow(f, 1, ZZ) == dup_normal([2, 0, 0, 1, 7], ZZ)
  573. assert dup_pow(f, 2, ZZ) == dup_normal([4, 0, 0, 4, 28, 0, 1, 14, 49], ZZ)
  574. assert dup_pow(f, 3, ZZ) == dup_normal(
  575. [8, 0, 0, 12, 84, 0, 6, 84, 294, 1, 21, 147, 343], ZZ)
  576. def test_dmp_pow():
  577. assert dmp_pow([[]], 0, 1, ZZ) == [[ZZ(1)]]
  578. assert dmp_pow([[]], 0, 1, QQ) == [[QQ(1)]]
  579. assert dmp_pow([[]], 1, 1, ZZ) == [[]]
  580. assert dmp_pow([[]], 7, 1, ZZ) == [[]]
  581. assert dmp_pow([[ZZ(1)]], 0, 1, ZZ) == [[ZZ(1)]]
  582. assert dmp_pow([[ZZ(1)]], 1, 1, ZZ) == [[ZZ(1)]]
  583. assert dmp_pow([[ZZ(1)]], 7, 1, ZZ) == [[ZZ(1)]]
  584. assert dmp_pow([[QQ(3, 7)]], 0, 1, QQ) == [[QQ(1, 1)]]
  585. assert dmp_pow([[QQ(3, 7)]], 1, 1, QQ) == [[QQ(3, 7)]]
  586. assert dmp_pow([[QQ(3, 7)]], 7, 1, QQ) == [[QQ(2187, 823543)]]
  587. f = dup_normal([2, 0, 0, 1, 7], ZZ)
  588. assert dmp_pow(f, 2, 0, ZZ) == dup_pow(f, 2, ZZ)
  589. def test_dup_pdiv():
  590. f = dup_normal([3, 1, 1, 5], ZZ)
  591. g = dup_normal([5, -3, 1], ZZ)
  592. q = dup_normal([15, 14], ZZ)
  593. r = dup_normal([52, 111], ZZ)
  594. assert dup_pdiv(f, g, ZZ) == (q, r)
  595. assert dup_pquo(f, g, ZZ) == q
  596. assert dup_prem(f, g, ZZ) == r
  597. raises(ExactQuotientFailed, lambda: dup_pexquo(f, g, ZZ))
  598. f = dup_normal([3, 1, 1, 5], QQ)
  599. g = dup_normal([5, -3, 1], QQ)
  600. q = dup_normal([15, 14], QQ)
  601. r = dup_normal([52, 111], QQ)
  602. assert dup_pdiv(f, g, QQ) == (q, r)
  603. assert dup_pquo(f, g, QQ) == q
  604. assert dup_prem(f, g, QQ) == r
  605. raises(ExactQuotientFailed, lambda: dup_pexquo(f, g, QQ))
  606. def test_dmp_pdiv():
  607. f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ)
  608. g = dmp_normal([[1], [-1, 0]], 1, ZZ)
  609. q = dmp_normal([[1], [1, 0]], 1, ZZ)
  610. r = dmp_normal([[2, 0, 0]], 1, ZZ)
  611. assert dmp_pdiv(f, g, 1, ZZ) == (q, r)
  612. assert dmp_pquo(f, g, 1, ZZ) == q
  613. assert dmp_prem(f, g, 1, ZZ) == r
  614. raises(ExactQuotientFailed, lambda: dmp_pexquo(f, g, 1, ZZ))
  615. f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ)
  616. g = dmp_normal([[2], [-2, 0]], 1, ZZ)
  617. q = dmp_normal([[2], [2, 0]], 1, ZZ)
  618. r = dmp_normal([[8, 0, 0]], 1, ZZ)
  619. assert dmp_pdiv(f, g, 1, ZZ) == (q, r)
  620. assert dmp_pquo(f, g, 1, ZZ) == q
  621. assert dmp_prem(f, g, 1, ZZ) == r
  622. raises(ExactQuotientFailed, lambda: dmp_pexquo(f, g, 1, ZZ))
  623. def test_dup_rr_div():
  624. raises(ZeroDivisionError, lambda: dup_rr_div([1, 2, 3], [], ZZ))
  625. f = dup_normal([3, 1, 1, 5], ZZ)
  626. g = dup_normal([5, -3, 1], ZZ)
  627. q, r = [], f
  628. assert dup_rr_div(f, g, ZZ) == (q, r)
  629. def test_dmp_rr_div():
  630. raises(ZeroDivisionError, lambda: dmp_rr_div([[1, 2], [3]], [[]], 1, ZZ))
  631. f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ)
  632. g = dmp_normal([[1], [-1, 0]], 1, ZZ)
  633. q = dmp_normal([[1], [1, 0]], 1, ZZ)
  634. r = dmp_normal([[2, 0, 0]], 1, ZZ)
  635. assert dmp_rr_div(f, g, 1, ZZ) == (q, r)
  636. f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ)
  637. g = dmp_normal([[-1], [1, 0]], 1, ZZ)
  638. q = dmp_normal([[-1], [-1, 0]], 1, ZZ)
  639. r = dmp_normal([[2, 0, 0]], 1, ZZ)
  640. assert dmp_rr_div(f, g, 1, ZZ) == (q, r)
  641. f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ)
  642. g = dmp_normal([[2], [-2, 0]], 1, ZZ)
  643. q, r = [[]], f
  644. assert dmp_rr_div(f, g, 1, ZZ) == (q, r)
  645. def test_dup_ff_div():
  646. raises(ZeroDivisionError, lambda: dup_ff_div([1, 2, 3], [], QQ))
  647. f = dup_normal([3, 1, 1, 5], QQ)
  648. g = dup_normal([5, -3, 1], QQ)
  649. q = [QQ(3, 5), QQ(14, 25)]
  650. r = [QQ(52, 25), QQ(111, 25)]
  651. assert dup_ff_div(f, g, QQ) == (q, r)
  652. def test_dup_ff_div_gmpy2():
  653. try:
  654. from gmpy2 import mpq
  655. except ImportError:
  656. return
  657. from sympy.polys.domains import GMPYRationalField
  658. K = GMPYRationalField()
  659. f = [mpq(1,3), mpq(3,2)]
  660. g = [mpq(2,1)]
  661. assert dmp_ff_div(f, g, 0, K) == ([mpq(1,6), mpq(3,4)], [])
  662. f = [mpq(1,2), mpq(1,3), mpq(1,4), mpq(1,5)]
  663. g = [mpq(-1,1), mpq(1,1), mpq(-1,1)]
  664. assert dmp_ff_div(f, g, 0, K) == ([mpq(-1,2), mpq(-5,6)], [mpq(7,12), mpq(-19,30)])
  665. def test_dmp_ff_div():
  666. raises(ZeroDivisionError, lambda: dmp_ff_div([[1, 2], [3]], [[]], 1, QQ))
  667. f = dmp_normal([[1], [], [1, 0, 0]], 1, QQ)
  668. g = dmp_normal([[1], [-1, 0]], 1, QQ)
  669. q = [[QQ(1, 1)], [QQ(1, 1), QQ(0, 1)]]
  670. r = [[QQ(2, 1), QQ(0, 1), QQ(0, 1)]]
  671. assert dmp_ff_div(f, g, 1, QQ) == (q, r)
  672. f = dmp_normal([[1], [], [1, 0, 0]], 1, QQ)
  673. g = dmp_normal([[-1], [1, 0]], 1, QQ)
  674. q = [[QQ(-1, 1)], [QQ(-1, 1), QQ(0, 1)]]
  675. r = [[QQ(2, 1), QQ(0, 1), QQ(0, 1)]]
  676. assert dmp_ff_div(f, g, 1, QQ) == (q, r)
  677. f = dmp_normal([[1], [], [1, 0, 0]], 1, QQ)
  678. g = dmp_normal([[2], [-2, 0]], 1, QQ)
  679. q = [[QQ(1, 2)], [QQ(1, 2), QQ(0, 1)]]
  680. r = [[QQ(2, 1), QQ(0, 1), QQ(0, 1)]]
  681. assert dmp_ff_div(f, g, 1, QQ) == (q, r)
  682. def test_dup_div():
  683. f, g, q, r = [5, 4, 3, 2, 1], [1, 2, 3], [5, -6, 0], [20, 1]
  684. assert dup_div(f, g, ZZ) == (q, r)
  685. assert dup_quo(f, g, ZZ) == q
  686. assert dup_rem(f, g, ZZ) == r
  687. raises(ExactQuotientFailed, lambda: dup_exquo(f, g, ZZ))
  688. f, g, q, r = [5, 4, 3, 2, 1, 0], [1, 2, 0, 0, 9], [5, -6], [15, 2, -44, 54]
  689. assert dup_div(f, g, ZZ) == (q, r)
  690. assert dup_quo(f, g, ZZ) == q
  691. assert dup_rem(f, g, ZZ) == r
  692. raises(ExactQuotientFailed, lambda: dup_exquo(f, g, ZZ))
  693. def test_dmp_div():
  694. f, g, q, r = [5, 4, 3, 2, 1], [1, 2, 3], [5, -6, 0], [20, 1]
  695. assert dmp_div(f, g, 0, ZZ) == (q, r)
  696. assert dmp_quo(f, g, 0, ZZ) == q
  697. assert dmp_rem(f, g, 0, ZZ) == r
  698. raises(ExactQuotientFailed, lambda: dmp_exquo(f, g, 0, ZZ))
  699. f, g, q, r = [[[1]]], [[[2]], [1]], [[[]]], [[[1]]]
  700. assert dmp_div(f, g, 2, ZZ) == (q, r)
  701. assert dmp_quo(f, g, 2, ZZ) == q
  702. assert dmp_rem(f, g, 2, ZZ) == r
  703. raises(ExactQuotientFailed, lambda: dmp_exquo(f, g, 2, ZZ))
  704. def test_dup_max_norm():
  705. assert dup_max_norm([], ZZ) == 0
  706. assert dup_max_norm([1], ZZ) == 1
  707. assert dup_max_norm([1, 4, 2, 3], ZZ) == 4
  708. def test_dmp_max_norm():
  709. assert dmp_max_norm([[[]]], 2, ZZ) == 0
  710. assert dmp_max_norm([[[1]]], 2, ZZ) == 1
  711. assert dmp_max_norm(f_0, 2, ZZ) == 6
  712. def test_dup_l1_norm():
  713. assert dup_l1_norm([], ZZ) == 0
  714. assert dup_l1_norm([1], ZZ) == 1
  715. assert dup_l1_norm([1, 4, 2, 3], ZZ) == 10
  716. def test_dmp_l1_norm():
  717. assert dmp_l1_norm([[[]]], 2, ZZ) == 0
  718. assert dmp_l1_norm([[[1]]], 2, ZZ) == 1
  719. assert dmp_l1_norm(f_0, 2, ZZ) == 31
  720. def test_dup_l2_norm_squared():
  721. assert dup_l2_norm_squared([], ZZ) == 0
  722. assert dup_l2_norm_squared([1], ZZ) == 1
  723. assert dup_l2_norm_squared([1, 4, 2, 3], ZZ) == 30
  724. def test_dmp_l2_norm_squared():
  725. assert dmp_l2_norm_squared([[[]]], 2, ZZ) == 0
  726. assert dmp_l2_norm_squared([[[1]]], 2, ZZ) == 1
  727. assert dmp_l2_norm_squared(f_0, 2, ZZ) == 111
  728. def test_dup_expand():
  729. assert dup_expand((), ZZ) == [1]
  730. assert dup_expand(([1, 2, 3], [1, 2], [7, 5, 4, 3]), ZZ) == \
  731. dup_mul([1, 2, 3], dup_mul([1, 2], [7, 5, 4, 3], ZZ), ZZ)
  732. def test_dmp_expand():
  733. assert dmp_expand((), 1, ZZ) == [[1]]
  734. assert dmp_expand(([[1], [2], [3]], [[1], [2]], [[7], [5], [4], [3]]), 1, ZZ) == \
  735. dmp_mul([[1], [2], [3]], dmp_mul([[1], [2]], [[7], [5], [
  736. 4], [3]], 1, ZZ), 1, ZZ)