/flint-1.6/F_mpz_mpoly-test.c

# · C · 571 lines · 382 code · 140 blank · 49 comment · 12 complexity · ac6bd09157f4b9916a352d0d61c3ec3e MD5 · raw file

  1. /*============================================================================
  2. This file is part of FLINT.
  3. FLINT is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. FLINT is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with FLINT; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  14. ===============================================================================*/
  15. /****************************************************************************
  16. F_mpz_mpoly-test.c: Test code for F_mpz_mpoly.c and F_mpz_mpoly.h
  17. Copyright (C) 2009, William Hart
  18. *****************************************************************************/
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <gmp.h>
  22. #include <time.h>
  23. #include "flint.h"
  24. #include "F_mpz_mpoly.h"
  25. #include "memory-manager.h"
  26. #include "test-support.h"
  27. #include "long_extras.h"
  28. #define VARY_BITS 1 // random coefficients have random number of bits up to the limit given
  29. #define SIGNS 1 // random coefficients will be randomly signed
  30. #define SPARSE 1 // polynomials are spares (triggers more corner cases)
  31. #define ITER 1 // if you want all tests to run longer, increase this
  32. #define TESTFILE 0 // Set this to test polynomial reading and writing to a file in the current dir
  33. #define DEBUG 0 // allows easy switching of debugging code on and off when debugging (if inserted)
  34. #define DEBUG2 1
  35. void rand_mpoly(F_mpz_mpoly_t poly, ulong length, ulong vars, ulong expmax, ulong bits)
  36. {
  37. ulong sumlast = 0;
  38. ulong i = 0, k = 0;
  39. if (z_randint(2))
  40. {
  41. F_mpz_mpoly_set_coeff_ui(poly, 0, z_randint(1L << bits));
  42. i++;
  43. k++;
  44. }
  45. ulong summax = 0;
  46. for ( ; (i < length) && (summax <= expmax); i++, k++)
  47. {
  48. summax = (expmax*k)/length;
  49. //printf("%ld\n", summax);
  50. if ((summax > sumlast) && (summax <= expmax))
  51. {
  52. F_mpz_mpoly_set_coeff_ui(poly, i, z_randint(1L << bits));
  53. ulong sum = 0;
  54. ulong exp;
  55. long j;
  56. for (j = 0; j < vars - 1; j++)
  57. {
  58. exp = z_randint(2*summax/vars);
  59. if (sum + exp > summax) exp = summax - sum;
  60. if (exp) F_mpz_mpoly_set_var_exp(poly, i, j, exp);
  61. sum += exp;
  62. }
  63. exp = summax - sum;
  64. if (exp) F_mpz_mpoly_set_var_exp(poly, i, j, exp);
  65. } else i--;
  66. sumlast = summax;
  67. }
  68. }
  69. int test_F_mpz_mpoly_add_inplace()
  70. {
  71. int result = 1;
  72. F_mpz_mpoly_t poly;
  73. F_mpz_mpoly_t poly2;
  74. char * syms[5];
  75. syms[0] = "s";
  76. syms[1] = "t";
  77. syms[2] = "x";
  78. syms[3] = "y";
  79. syms[4] = "z";
  80. ulong i;
  81. for (i = 0; i < 100; i++)
  82. {
  83. F_mpz_mpoly_init2(poly, 10, 5, GRLEX);
  84. F_mpz_mpoly_init2(poly2, 10, 5, GRLEX);
  85. ulong length = z_randint(20)+1;
  86. ulong length2 = z_randint(20)+1;
  87. rand_mpoly(poly, length, 5, 30, 8);
  88. rand_mpoly(poly2, length2, 5, 30, 8);
  89. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  90. printf("B = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n");
  91. F_mpz_mpoly_add_inplace(poly, 0, poly2);
  92. printf("A + B = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n\n");
  93. F_mpz_mpoly_clear(poly);
  94. F_mpz_mpoly_clear(poly2);
  95. }
  96. return result;
  97. }
  98. int test__F_mpz_mpoly_mul_mxn()
  99. {
  100. int result = 1;
  101. F_mpz_mpoly_t poly;
  102. F_mpz_mpoly_t poly2;
  103. F_mpz_mpoly_t res;
  104. char * syms[5];
  105. syms[0] = "s";
  106. syms[1] = "t";
  107. syms[2] = "x";
  108. syms[3] = "y";
  109. syms[4] = "z";
  110. // 2 x 2
  111. F_mpz_mpoly_init2(poly, 2, 5, GRLEX);
  112. F_mpz_mpoly_init2(poly2, 2, 5, GRLEX);
  113. F_mpz_mpoly_init2(res, 4, 5, GRLEX);
  114. rand_mpoly(poly, 2, 5, 30, 8);
  115. rand_mpoly(poly2, 2, 5, 30, 8);
  116. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  117. printf("B = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n");
  118. _F_mpz_mpoly_mul_small_mxn(res, poly, 0, poly2, 0);
  119. printf("A * B = "); F_mpz_mpoly_print_pretty(res, syms); printf("\n\n");
  120. F_mpz_mpoly_clear(poly);
  121. F_mpz_mpoly_clear(poly2);
  122. F_mpz_mpoly_clear(res);
  123. // 3 x 3
  124. F_mpz_mpoly_init2(poly, 3, 5, GRLEX);
  125. F_mpz_mpoly_init2(poly2, 3, 5, GRLEX);
  126. F_mpz_mpoly_init2(res, 9, 5, GRLEX);
  127. rand_mpoly(poly, 3, 5, 30, 8);
  128. rand_mpoly(poly2, 3, 5, 30, 8);
  129. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  130. printf("B = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n");
  131. _F_mpz_mpoly_mul_small_mxn(res, poly, 0, poly2, 0);
  132. printf("A * B = "); F_mpz_mpoly_print_pretty(res, syms); printf("\n\n");
  133. F_mpz_mpoly_clear(poly);
  134. F_mpz_mpoly_clear(poly2);
  135. F_mpz_mpoly_clear(res);
  136. // 4 x 4
  137. F_mpz_mpoly_init2(poly, 4, 5, GRLEX);
  138. F_mpz_mpoly_init2(poly2, 4, 5, GRLEX);
  139. F_mpz_mpoly_init2(res, 16, 5, GRLEX);
  140. rand_mpoly(poly, 4, 5, 30, 8);
  141. rand_mpoly(poly2, 4, 5, 30, 8);
  142. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  143. printf("B = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n");
  144. ulong i;
  145. for (i = 0; i < 1000000; i++) _F_mpz_mpoly_mul_small_mxn(res, poly, 0, poly2, 0);
  146. printf("A * B = "); F_mpz_mpoly_print_pretty(res, syms); printf("\n\n");
  147. F_mpz_mpoly_clear(poly);
  148. F_mpz_mpoly_clear(poly2);
  149. F_mpz_mpoly_clear(res);
  150. return result;
  151. }
  152. int test__F_mpz_mpoly_mul_Mxn()
  153. {
  154. int result = 1;
  155. F_mpz_mpoly_t poly;
  156. F_mpz_mpoly_t poly2;
  157. F_mpz_mpoly_t res;
  158. char * syms[5];
  159. syms[0] = "s";
  160. syms[1] = "t";
  161. syms[2] = "x";
  162. syms[3] = "y";
  163. syms[4] = "z";
  164. // 32 x 4
  165. F_mpz_mpoly_init2(poly, 32, 5, GRLEX);
  166. F_mpz_mpoly_init2(poly2, 4, 5, GRLEX);
  167. F_mpz_mpoly_init2(res, 128, 5, GRLEX);
  168. rand_mpoly(poly, 32, 5, 20, 8);
  169. rand_mpoly(poly2, 4, 5, 20, 8);
  170. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  171. printf("B = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n");
  172. _F_mpz_mpoly_mul_small_Mxn(res, poly, poly2, 0, poly2->length);
  173. printf("A * B = "); F_mpz_mpoly_print_pretty(res, syms); printf("\n\n");
  174. F_mpz_mpoly_clear(poly);
  175. F_mpz_mpoly_clear(poly2);
  176. F_mpz_mpoly_clear(res);
  177. return result;
  178. }
  179. int test_F_mpz_mpoly_mul_small_recursive()
  180. {
  181. int result = 1;
  182. F_mpz_mpoly_t poly;
  183. F_mpz_mpoly_t poly2;
  184. F_mpz_mpoly_t res;
  185. char * syms[5];
  186. syms[0] = "s";
  187. syms[1] = "t";
  188. syms[2] = "x";
  189. syms[3] = "y";
  190. syms[4] = "z";
  191. // 32 x 4
  192. F_mpz_mpoly_init2(poly, 32, 5, GRLEX);
  193. F_mpz_mpoly_init2(poly2, 32, 5, GRLEX);
  194. F_mpz_mpoly_init2(res, 0, 5, GRLEX);
  195. rand_mpoly(poly, 32, 5, 20, 8);
  196. rand_mpoly(poly2, 32, 5, 20, 8);
  197. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  198. printf("B = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n");
  199. F_mpz_mpoly_mul_small_recursive(res, poly, poly2, 0, poly2->length);
  200. printf("A * B = "); F_mpz_mpoly_print_pretty(res, syms); printf("\n\n");
  201. F_mpz_mpoly_clear(poly);
  202. F_mpz_mpoly_clear(poly2);
  203. F_mpz_mpoly_clear(res);
  204. return result;
  205. }
  206. int test_F_mpz_mpoly_mul_fateman_heap()
  207. {
  208. int result = 1;
  209. F_mpz_mpoly_t poly;
  210. F_mpz_mpoly_t poly2;
  211. F_mpz_mpoly_t poly4;
  212. F_mpz_mpoly_t poly8;
  213. F_mpz_mpoly_t poly10;
  214. F_mpz_mpoly_t poly20;
  215. F_mpz_mpoly_t poly40;
  216. char * syms[4];
  217. syms[0] = "t";
  218. syms[1] = "x";
  219. syms[2] = "y";
  220. syms[3] = "z";
  221. F_mpz_mpoly_init2(poly, 5, 4, GRLEX);
  222. F_mpz_mpoly_init2(poly2, 0, 4, GRLEX);
  223. F_mpz_mpoly_init2(poly4, 0, 4, GRLEX);
  224. F_mpz_mpoly_init2(poly8, 0, 4, GRLEX);
  225. F_mpz_mpoly_init2(poly10, 0, 4, GRLEX);
  226. F_mpz_mpoly_init2(poly20, 0, 4, GRLEX);
  227. F_mpz_mpoly_init2(poly40, 0, 4, GRLEX);
  228. F_mpz_mpoly_set_coeff_ui(poly, 0, 1);
  229. F_mpz_mpoly_set_coeff_ui(poly, 1, 1);
  230. F_mpz_mpoly_set_coeff_ui(poly, 2, 1);
  231. F_mpz_mpoly_set_coeff_ui(poly, 3, 1);
  232. F_mpz_mpoly_set_coeff_ui(poly, 4, 1);
  233. F_mpz_mpoly_set_var_exp(poly, 1, 3, 1);
  234. F_mpz_mpoly_set_var_exp(poly, 2, 2, 1);
  235. F_mpz_mpoly_set_var_exp(poly, 3, 1, 1);
  236. F_mpz_mpoly_set_var_exp(poly, 4, 0, 1);
  237. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  238. F_mpz_mpoly_mul_small_heap(poly2, poly, poly);
  239. printf("A^2 = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n\n");
  240. F_mpz_mpoly_mul_small_heap(poly4, poly2, poly2);
  241. printf("A^4 = "); F_mpz_mpoly_print_pretty(poly4, syms); printf("\n\n");
  242. F_mpz_mpoly_mul_small_heap(poly8, poly4, poly4);
  243. //printf("A^8 = "); F_mpz_mpoly_print_pretty(poly8, syms); printf("\n\n");
  244. F_mpz_mpoly_mul_small_heap(poly10, poly8, poly2);
  245. printf("A^10 = "); F_mpz_mpoly_print_pretty(poly10, syms); printf("\n\n");
  246. F_mpz_mpoly_mul_small_heap(poly20, poly10, poly10);
  247. printf("A^20 has length %ld\n", poly20->length);
  248. F_mpz_mpoly_mul_small_heap(poly40, poly20, poly20);
  249. printf("A^40 has length %ld\n", poly40->length);
  250. //printf("A^20 = "); F_mpz_mpoly_print_pretty(poly20, syms); printf("\n\n");
  251. //printf("A^40 = "); F_mpz_mpoly_print_pretty(poly40, syms); printf("\n\n");
  252. F_mpz_mpoly_clear(poly);
  253. F_mpz_mpoly_clear(poly2);
  254. F_mpz_mpoly_clear(poly4);
  255. F_mpz_mpoly_clear(poly8);
  256. F_mpz_mpoly_clear(poly10);
  257. F_mpz_mpoly_clear(poly20);
  258. F_mpz_mpoly_clear(poly40);
  259. return result;
  260. }
  261. int test_F_mpz_mpoly_mul_5sparse_heap()
  262. {
  263. int result = 1;
  264. F_mpz_mpoly_t poly;
  265. F_mpz_mpoly_t polyb;
  266. F_mpz_mpoly_t poly2;
  267. F_mpz_mpoly_t poly3;
  268. F_mpz_mpoly_t poly6;
  269. F_mpz_mpoly_t poly12;
  270. F_mpz_mpoly_t poly24;
  271. F_mpz_mpoly_t poly12b;
  272. char * syms[5];
  273. syms[0] = "x";
  274. syms[1] = "y";
  275. syms[2] = "z";
  276. syms[3] = "t";
  277. syms[4] = "u";
  278. F_mpz_mpoly_init2(poly, 6, 5, GRLEX);
  279. F_mpz_mpoly_init2(polyb, 6, 5, GRLEX);
  280. F_mpz_mpoly_init2(poly2, 0, 5, GRLEX);
  281. F_mpz_mpoly_init2(poly3, 0, 5, GRLEX);
  282. F_mpz_mpoly_init2(poly6, 0, 5, GRLEX);
  283. F_mpz_mpoly_init2(poly12, 0, 5, GRLEX);
  284. F_mpz_mpoly_init2(poly24, 0, 5, GRLEX);
  285. F_mpz_mpoly_init2(poly12b, 0, 5, GRLEX);
  286. F_mpz_mpoly_set_coeff_ui(poly, 0, 1);
  287. F_mpz_mpoly_set_coeff_ui(poly, 1, 1);
  288. F_mpz_mpoly_set_coeff_ui(poly, 2, 1);
  289. F_mpz_mpoly_set_coeff_ui(poly, 3, 1);
  290. F_mpz_mpoly_set_coeff_ui(poly, 4, 1);
  291. F_mpz_mpoly_set_coeff_ui(poly, 5, 1);
  292. F_mpz_mpoly_set_var_exp(poly, 1, 0, 1);
  293. F_mpz_mpoly_set_var_exp(poly, 2, 1, 2);
  294. F_mpz_mpoly_set_var_exp(poly, 3, 2, 3);
  295. F_mpz_mpoly_set_var_exp(poly, 4, 3, 5);
  296. F_mpz_mpoly_set_var_exp(poly, 5, 4, 7);
  297. F_mpz_mpoly_set_coeff_ui(polyb, 0, 1);
  298. F_mpz_mpoly_set_coeff_ui(polyb, 1, 1);
  299. F_mpz_mpoly_set_coeff_ui(polyb, 2, 1);
  300. F_mpz_mpoly_set_coeff_ui(polyb, 3, 1);
  301. F_mpz_mpoly_set_coeff_ui(polyb, 4, 1);
  302. F_mpz_mpoly_set_coeff_ui(polyb, 5, 1);
  303. F_mpz_mpoly_set_var_exp(polyb, 1, 4, 1);
  304. F_mpz_mpoly_set_var_exp(polyb, 2, 3, 2);
  305. F_mpz_mpoly_set_var_exp(polyb, 3, 2, 3);
  306. F_mpz_mpoly_set_var_exp(polyb, 4, 1, 5);
  307. F_mpz_mpoly_set_var_exp(polyb, 5, 0, 7);
  308. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  309. F_mpz_mpoly_mul_small_heap(poly2, poly, poly);
  310. F_mpz_mpoly_mul_small_heap(poly3, poly2, poly);
  311. printf("A^3 = "); F_mpz_mpoly_print_pretty(poly3, syms); printf("\n\n");
  312. F_mpz_mpoly_mul_small_heap(poly6, poly3, poly3);
  313. printf("A^6 = "); F_mpz_mpoly_print_pretty(poly6, syms); printf("\n\n");
  314. printf("A^6 has length %ld\n", poly6->length);
  315. F_mpz_mpoly_mul_small_heap(poly12, poly6, poly6);
  316. printf("A^12 has length %ld\n", poly12->length);
  317. printf("B = "); F_mpz_mpoly_print_pretty(polyb, syms); printf("\n");
  318. F_mpz_mpoly_clear(poly2);
  319. F_mpz_mpoly_clear(poly3);
  320. F_mpz_mpoly_clear(poly6);
  321. F_mpz_mpoly_init2(poly2, 0, 5, GRLEX);
  322. F_mpz_mpoly_init2(poly3, 0, 5, GRLEX);
  323. F_mpz_mpoly_init2(poly6, 0, 5, GRLEX);
  324. F_mpz_mpoly_mul_small_heap(poly2, polyb, polyb);
  325. F_mpz_mpoly_mul_small_heap(poly3, poly2, polyb);
  326. printf("B^3 = "); F_mpz_mpoly_print_pretty(poly3, syms); printf("\n\n");
  327. F_mpz_mpoly_mul_small_heap(poly6, poly3, poly3);
  328. //printf("B^6 = "); F_mpz_mpoly_print_pretty(poly6, syms); printf("\n\n");
  329. printf("B^6 has length %ld\n", poly6->length);
  330. F_mpz_mpoly_mul_small_heap(poly12b, poly6, poly6);
  331. printf("B^12 has length %ld\n", poly12b->length);
  332. F_mpz_mpoly_mul_small_heap(poly24, poly12, poly12b);
  333. printf("A^12 * B^12 has length %ld\n", poly24->length);
  334. F_mpz_mpoly_clear(poly);
  335. F_mpz_mpoly_clear(polyb);
  336. F_mpz_mpoly_clear(poly2);
  337. F_mpz_mpoly_clear(poly3);
  338. F_mpz_mpoly_clear(poly6);
  339. F_mpz_mpoly_clear(poly12);
  340. F_mpz_mpoly_clear(poly24);
  341. F_mpz_mpoly_clear(poly12b);
  342. return result;
  343. }
  344. int test_F_mpz_mpoly_mul_fateman()
  345. {
  346. int result = 1;
  347. F_mpz_mpoly_t poly;
  348. F_mpz_mpoly_t poly2;
  349. F_mpz_mpoly_t poly4;
  350. F_mpz_mpoly_t poly8;
  351. F_mpz_mpoly_t poly10;
  352. F_mpz_mpoly_t poly20;
  353. F_mpz_mpoly_t poly40;
  354. char * syms[4];
  355. syms[0] = "t";
  356. syms[1] = "x";
  357. syms[2] = "y";
  358. syms[3] = "z";
  359. F_mpz_mpoly_init2(poly, 5, 4, GRLEX);
  360. F_mpz_mpoly_init2(poly2, 0, 4, GRLEX);
  361. F_mpz_mpoly_init2(poly4, 0, 4, GRLEX);
  362. F_mpz_mpoly_init2(poly8, 0, 4, GRLEX);
  363. F_mpz_mpoly_init2(poly10, 0, 4, GRLEX);
  364. F_mpz_mpoly_init2(poly20, 0, 4, GRLEX);
  365. F_mpz_mpoly_init2(poly40, 0, 4, GRLEX);
  366. F_mpz_mpoly_set_coeff_ui(poly, 0, 1);
  367. F_mpz_mpoly_set_coeff_ui(poly, 1, 1);
  368. F_mpz_mpoly_set_coeff_ui(poly, 2, 1);
  369. F_mpz_mpoly_set_coeff_ui(poly, 3, 1);
  370. F_mpz_mpoly_set_coeff_ui(poly, 4, 1);
  371. F_mpz_mpoly_set_var_exp(poly, 1, 3, 1);
  372. F_mpz_mpoly_set_var_exp(poly, 2, 2, 1);
  373. F_mpz_mpoly_set_var_exp(poly, 3, 1, 1);
  374. F_mpz_mpoly_set_var_exp(poly, 4, 0, 1);
  375. printf("A = "); F_mpz_mpoly_print_pretty(poly, syms); printf("\n");
  376. F_mpz_mpoly_mul_small_recursive(poly2, poly, poly, 0, poly->length);
  377. printf("A^2 = "); F_mpz_mpoly_print_pretty(poly2, syms); printf("\n\n");
  378. F_mpz_mpoly_mul_small_recursive(poly4, poly2, poly2, 0, poly2->length);
  379. //printf("A^4 = "); F_mpz_mpoly_print_pretty(poly4, syms); printf("\n\n");
  380. F_mpz_mpoly_mul_small_recursive(poly8, poly4, poly4, 0, poly4->length);
  381. //printf("A^8 = "); F_mpz_mpoly_print_pretty(poly8, syms); printf("\n\n");
  382. F_mpz_mpoly_mul_small_recursive(poly10, poly8, poly2, 0, poly2->length);
  383. //printf("A^10 = "); F_mpz_mpoly_print_pretty(poly10, syms); printf("\n\n");
  384. F_mpz_mpoly_mul_small_recursive(poly20, poly10, poly10, 0, poly10->length);
  385. printf("A^20 has length %ld\n", poly20->length);
  386. //F_mpz_mpoly_mul_small_recursive(poly40, poly20, poly20, 0, poly20->length);
  387. //printf("A^40 has length %ld\n", poly40->length);
  388. //printf("A^20 = "); F_mpz_mpoly_print_pretty(poly20, syms); printf("\n\n");
  389. //printf("A^40 = "); F_mpz_mpoly_print_pretty(poly40, syms); printf("\n\n");
  390. F_mpz_mpoly_clear(poly);
  391. F_mpz_mpoly_clear(poly2);
  392. F_mpz_mpoly_clear(poly4);
  393. F_mpz_mpoly_clear(poly8);
  394. F_mpz_mpoly_clear(poly10);
  395. F_mpz_mpoly_clear(poly20);
  396. F_mpz_mpoly_clear(poly40);
  397. return result;
  398. }
  399. void F_mpz_mpoly_test_all()
  400. {
  401. int success, all_success = 1;
  402. printf("FLINT_BITS = %ld\n", FLINT_BITS);
  403. #if TESTFILE
  404. #endif
  405. /*RUN_TEST(F_mpz_mpoly_add_inplace);
  406. RUN_TEST(_F_mpz_mpoly_mul_mxn);
  407. RUN_TEST(_F_mpz_mpoly_mul_Mxn);
  408. RUN_TEST(F_mpz_mpoly_mul_small_recursive); */
  409. //RUN_TEST(F_mpz_mpoly_mul_fateman);
  410. //RUN_TEST(F_mpz_mpoly_mul_fateman_heap);
  411. RUN_TEST(F_mpz_mpoly_mul_5sparse_heap);
  412. printf(all_success ? "\nAll tests passed\n" :
  413. "\nAt least one test FAILED!\n");
  414. }
  415. int main()
  416. {
  417. test_support_init();
  418. F_mpz_mpoly_test_all();
  419. test_support_cleanup();
  420. flint_stack_cleanup();
  421. _F_mpz_cleanup();
  422. return 0;
  423. }