test.pl
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:58k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. #!/usr/bin/perl -w
  2. # GMP perl module tests
  3. # Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
  4. #
  5. # This file is part of the GNU MP Library.
  6. #
  7. # The GNU MP Library is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU Lesser General Public License as published
  9. # by the Free Software Foundation; either version 3 of the License, or (at
  10. # your option) any later version.
  11. #
  12. # The GNU MP Library is distributed in the hope that it will be useful, but
  13. # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  15. # License for more details.
  16. #
  17. # You should have received a copy of the GNU Lesser General Public License
  18. # along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  19. # These tests aim to exercise the many possible combinations of operands
  20. # etc, and to run all functions at least once, which if nothing else will
  21. # check everything intended is in the :all list.
  22. #
  23. # Use the following in .emacs to match test failure messages.
  24. #
  25. # ;; perl "Test" module error messages
  26. # (eval-after-load "compile"
  27. #   '(add-to-list
  28. #     'compilation-error-regexp-alist
  29. #     '("^.*Failed test [0-9]+ in \([^ ]+\) at line \([0-9]+\)" 1 2)))
  30. use strict;
  31. use Test;
  32. BEGIN {
  33.   plan tests => 123,
  34.   onfail => sub { print "there were failuresn" },
  35. }
  36. use GMP qw(:all);
  37. use GMP::Mpz qw(:all);
  38. use GMP::Mpq qw(:all);
  39. use GMP::Mpf qw(:all);
  40. use GMP::Rand qw(:all);
  41. use GMP::Mpz qw(:constants);
  42. use GMP::Mpz qw(:noconstants);
  43. use GMP::Mpq qw(:constants);
  44. use GMP::Mpq qw(:noconstants);
  45. use GMP::Mpf qw(:constants);
  46. use GMP::Mpf qw(:noconstants);
  47. package Mytie;
  48. use Exporter;
  49. use vars  qw($val $fetched $stored);
  50. $val = 0;
  51. $fetched = 0;
  52. $stored = 0;
  53. sub TIESCALAR {
  54.   my ($class, $newval) = @_;
  55.   my $var = 'mytie dummy refed var';
  56.   $val = $newval;
  57.   $fetched = 0;
  58.   $stored = 0;
  59.   return bless $var, $class;
  60. }
  61. sub FETCH {
  62.   my ($self) = @_;
  63.   $fetched++;
  64.   return $val;
  65. }
  66. sub STORE {
  67.   my ($self, $newval) = @_;
  68.   $val = $newval;
  69.   $stored++;
  70. }
  71. package main;
  72. # check Mytie does what it should
  73. { tie my $t, 'Mytie', 123;
  74.   ok ($Mytie::val == 123);
  75.   $Mytie::val = 456;
  76.   ok ($t == 456);
  77.   $t = 789;
  78.   ok ($Mytie::val == 789);
  79. }
  80. # Usage: str(x)
  81. # Return x forced to a string, not a PVIV.
  82. #
  83. sub str {
  84.   my $s = "$_[0]" . "";
  85.   return $s;
  86. }
  87. my $ivnv_2p128 = 65536.0 * 65536.0 * 65536.0 * 65536.0
  88.                * 65536.0 * 65536.0 * 65536.0 * 65536.0;
  89. kill (0, $ivnv_2p128);
  90. my $str_2p128 = '340282366920938463463374607431768211456';
  91. my $uv_max = ~ 0;
  92. my $uv_max_str = ~ 0;
  93. $uv_max_str = "$uv_max_str";
  94. $uv_max_str = "" . "$uv_max_str";
  95. #------------------------------------------------------------------------------
  96. # GMP::version
  97. use GMP qw(version);
  98. print '$GMP::VERSION ',$GMP::VERSION,' GMP::version() ',version(),"n";
  99. #------------------------------------------------------------------------------
  100. # GMP::Mpz::new
  101. ok (mpz(0) == 0);
  102. ok (mpz('0') == 0);
  103. ok (mpz(substr('101',1,1)) == 0);
  104. ok (mpz(0.0) == 0);
  105. ok (mpz(mpz(0)) == 0);
  106. ok (mpz(mpq(0)) == 0);
  107. ok (mpz(mpf(0)) == 0);
  108. { tie my $t, 'Mytie', 0;
  109.   ok (mpz($t) == 0);
  110.   ok ($Mytie::fetched > 0);
  111. }
  112. { tie my $t, 'Mytie', '0';
  113.   ok (mpz($t) == 0);
  114.   ok ($Mytie::fetched > 0);
  115. }
  116. { tie my $t, 'Mytie', substr('101',1,1); ok (mpz($t) == 0); }
  117. { tie my $t, 'Mytie', 0.0; ok (mpz($t) == 0); }
  118. { tie my $t, 'Mytie', mpz(0); ok (mpz($t) == 0); }
  119. { tie my $t, 'Mytie', mpq(0); ok (mpz($t) == 0); }
  120. { tie my $t, 'Mytie', mpf(0); ok (mpz($t) == 0); }
  121. ok (mpz(-123) == -123);
  122. ok (mpz('-123') == -123);
  123. ok (mpz(substr('1-1231',1,4)) == -123);
  124. ok (mpz(-123.0) == -123);
  125. ok (mpz(mpz(-123)) == -123);
  126. ok (mpz(mpq(-123)) == -123);
  127. ok (mpz(mpf(-123)) == -123);
  128. { tie my $t, 'Mytie', -123; ok (mpz($t) == -123); }
  129. { tie my $t, 'Mytie', '-123'; ok (mpz($t) == -123); }
  130. { tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpz($t) == -123); }
  131. { tie my $t, 'Mytie', -123.0; ok (mpz($t) == -123); }
  132. { tie my $t, 'Mytie', mpz(-123); ok (mpz($t) == -123); }
  133. { tie my $t, 'Mytie', mpq(-123); ok (mpz($t) == -123); }
  134. { tie my $t, 'Mytie', mpf(-123); ok (mpz($t) == -123); }
  135. ok (mpz($ivnv_2p128) == $str_2p128);
  136. { tie my $t, 'Mytie', $ivnv_2p128; ok (mpz($t) == $str_2p128); }
  137. ok (mpz($uv_max) > 0);
  138. ok (mpz($uv_max) == mpz($uv_max_str));
  139. { tie my $t, 'Mytie', $uv_max; ok (mpz($t) > 0); }
  140. { tie my $t, 'Mytie', $uv_max; ok (mpz($t) == mpz($uv_max_str)); }
  141. { my $s = '999999999999999999999999999999';
  142.   kill (0, $s);
  143.   ok (mpz($s) == '999999999999999999999999999999');
  144.   tie my $t, 'Mytie', $s;
  145.   ok (mpz($t) == '999999999999999999999999999999');
  146. }
  147. #------------------------------------------------------------------------------
  148. # GMP::Mpz::overload_abs
  149. ok (abs(mpz(0)) == 0);
  150. ok (abs(mpz(123)) == 123);
  151. ok (abs(mpz(-123)) == 123);
  152. { my $x = mpz(-123); $x = abs($x); ok ($x == 123); }
  153. { my $x = mpz(0);    $x = abs($x); ok ($x == 0);   }
  154. { my $x = mpz(123);  $x = abs($x); ok ($x == 123); }
  155. { tie my $t, 'Mytie', mpz(0); ok (abs($t) == 0); }
  156. { tie my $t, 'Mytie', mpz(123); ok (abs($t) == 123); }
  157. { tie my $t, 'Mytie', mpz(-123); ok (abs($t) == 123); }
  158. #------------------------------------------------------------------------------
  159. # GMP::Mpz::overload_add
  160. ok (mpz(0) + 1 == 1);
  161. ok (mpz(-1) + 1 == 0);
  162. ok (1 + mpz(0) == 1);
  163. ok (1 + mpz(-1) == 0);
  164. #------------------------------------------------------------------------------
  165. # GMP::Mpz::overload_addeq
  166. { my $a = mpz(7); $a += 1; ok ($a == 8); }
  167. { my $a = mpz(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); }
  168. #------------------------------------------------------------------------------
  169. # GMP::Mpz::overload_and
  170. ok ((mpz(3) & 1) == 1);
  171. ok ((mpz(3) & 4) == 0);
  172. { my $a = mpz(3); $a &= 1; ok ($a == 1); }
  173. { my $a = mpz(3); $a &= 4; ok ($a == 0); }
  174. #------------------------------------------------------------------------------
  175. # GMP::Mpz::overload_bool
  176. if (mpz(0))   { ok (0); } else { ok (1); }
  177. if (mpz(123)) { ok (1); } else { ok (0); }
  178. #------------------------------------------------------------------------------
  179. # GMP::Mpz::overload_com
  180. ok (~ mpz(0) == -1);
  181. ok (~ mpz(1) == -2);
  182. ok (~ mpz(-2) == 1);
  183. ok (~ mpz(0xFF) == -0x100);
  184. ok (~ mpz(-0x100) == 0xFF);
  185. #------------------------------------------------------------------------------
  186. # GMP::Mpz::overload_dec
  187. { my $a = mpz(0); ok ($a-- == 0); ok ($a == -1); }
  188. { my $a = mpz(0); ok (--$a == -1); }
  189. { my $a = mpz(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); }
  190. #------------------------------------------------------------------------------
  191. # GMP::Mpz::overload_div
  192. ok (mpz(6) / 2 == 3);
  193. ok (mpz(-6) / 2 == -3);
  194. ok (mpz(6) / -2 == -3);
  195. ok (mpz(-6) / -2 == 3);
  196. #------------------------------------------------------------------------------
  197. # GMP::Mpz::overload_diveq
  198. { my $a = mpz(21); $a /= 3; ok ($a == 7); }
  199. { my $a = mpz(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); }
  200. #------------------------------------------------------------------------------
  201. # GMP::Mpz::overload_eq
  202. { my $a = mpz(0);
  203.   my $b = $a;
  204.   $a = mpz(1);
  205.   ok ($a == 1);
  206.   ok ($b == 0); }
  207. #------------------------------------------------------------------------------
  208. # GMP::Mpz::overload_inc
  209. { my $a = mpz(0); ok ($a++ == 0); ok ($a == 1); }
  210. { my $a = mpz(0); ok (++$a == 1); }
  211. { my $a = mpz(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); }
  212. #------------------------------------------------------------------------------
  213. # GMP::Mpz::overload_ior
  214. ok ((mpz(3) | 1) == 3);
  215. ok ((mpz(3) | 4) == 7);
  216. { my $a = mpz(3); $a |= 1; ok ($a == 3); }
  217. { my $a = mpz(3); $a |= 4; ok ($a == 7); }
  218. ok ((mpz("0xAA") | mpz("0x55")) == mpz("0xFF"));
  219. #------------------------------------------------------------------------------
  220. # GMP::Mpz::overload_lshift
  221. { my $a = mpz(7) << 1; ok ($a == 14); }
  222. #------------------------------------------------------------------------------
  223. # GMP::Mpz::overload_lshifteq
  224. { my $a = mpz(7); $a <<= 1; ok ($a == 14); }
  225. { my $a = mpz(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); }
  226. #------------------------------------------------------------------------------
  227. # GMP::Mpz::overload_mul
  228. ok (mpz(2) * 3 == 6);
  229. #------------------------------------------------------------------------------
  230. # GMP::Mpz::overload_muleq
  231. { my $a = mpz(7); $a *= 3;  ok ($a == 21); }
  232. { my $a = mpz(7); my $b = $a; $a *= 3;  ok ($a == 21); ok ($b == 7); }
  233. #------------------------------------------------------------------------------
  234. # GMP::Mpz::overload_neg
  235. ok (- mpz(0) == 0);
  236. ok (- mpz(123) == -123);
  237. ok (- mpz(-123) == 123);
  238. #------------------------------------------------------------------------------
  239. # GMP::Mpz::overload_not
  240. if (not mpz(0))   { ok (1); } else { ok (0); }
  241. if (not mpz(123)) { ok (0); } else { ok (1); }
  242. ok ((! mpz(0)) == 1);
  243. ok ((! mpz(123)) == 0);
  244. #------------------------------------------------------------------------------
  245. # GMP::Mpz::overload_pow
  246. ok (mpz(0) ** 1 == 0);
  247. ok (mpz(1) ** 1 == 1);
  248. ok (mpz(2) ** 0 == 1);
  249. ok (mpz(2) ** 1 == 2);
  250. ok (mpz(2) ** 2 == 4);
  251. ok (mpz(2) ** 3 == 8);
  252. ok (mpz(2) ** 4 == 16);
  253. ok (mpz(0) ** mpz(1) == 0);
  254. ok (mpz(1) ** mpz(1) == 1);
  255. ok (mpz(2) ** mpz(0) == 1);
  256. ok (mpz(2) ** mpz(1) == 2);
  257. ok (mpz(2) ** mpz(2) == 4);
  258. ok (mpz(2) ** mpz(3) == 8);
  259. ok (mpz(2) ** mpz(4) == 16);
  260. #------------------------------------------------------------------------------
  261. # GMP::Mpz::overload_poweq
  262. { my $a = mpz(3); $a **= 4; ok ($a == 81); }
  263. { my $a = mpz(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); }
  264. #------------------------------------------------------------------------------
  265. # GMP::Mpz::overload_rem
  266. ok (mpz(-8) % 3 == -2);
  267. ok (mpz(-7) % 3 == -1);
  268. ok (mpz(-6) % 3 == 0);
  269. ok (mpz(6) % 3 == 0);
  270. ok (mpz(7) % 3 == 1);
  271. ok (mpz(8) % 3 == 2);
  272. { my $a = mpz(24); $a %= 7; ok ($a == 3); }
  273. #------------------------------------------------------------------------------
  274. # GMP::Mpz::overload_rshift
  275. { my $a = mpz(32) >> 1; ok ($a == 16); }
  276. #------------------------------------------------------------------------------
  277. # GMP::Mpz::overload_rshifteq
  278. { my $a = mpz(32); $a >>= 1; ok ($a == 16); }
  279. { my $a = mpz(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); }
  280. #------------------------------------------------------------------------------
  281. # GMP::Mpz::overload_spaceship
  282. ok (mpz(0) < 1);
  283. ok (mpz(0) > -1);
  284. ok (mpz(0) != 1);
  285. ok (mpz(0) != -1);
  286. ok (mpz(1) != 0);
  287. ok (mpz(1) != -1);
  288. ok (mpz(-1) != 0);
  289. ok (mpz(-1) != 1);
  290. ok (mpz(0) < 1.0);
  291. ok (mpz(0) < '1');
  292. ok (mpz(0) < substr('-1',1,1));
  293. ok (mpz(0) < mpz(1));
  294. ok (mpz(0) < mpq(1));
  295. ok (mpz(0) < mpf(1));
  296. ok (mpz(0) < $uv_max);
  297. #------------------------------------------------------------------------------
  298. # GMP::Mpz::overload_sqrt
  299. ok (sqrt(mpz(0)) == 0);
  300. ok (sqrt(mpz(1)) == 1);
  301. ok (sqrt(mpz(4)) == 2);
  302. ok (sqrt(mpz(81)) == 9);
  303. #------------------------------------------------------------------------------
  304. # GMP::Mpz::overload_string
  305. { my $x = mpz(0);    ok("$x" eq "0"); }
  306. { my $x = mpz(123);  ok("$x" eq "123"); }
  307. { my $x = mpz(-123); ok("$x" eq "-123"); }
  308. #------------------------------------------------------------------------------
  309. # GMP::Mpz::overload_sub
  310. ok (mpz(0) - 1 == -1);
  311. ok (mpz(1) - 1 == 0);
  312. ok (1 - mpz(0) == 1);
  313. ok (1 - mpz(1) == 0);
  314. #------------------------------------------------------------------------------
  315. # GMP::Mpz::overload_subeq
  316. { my $a = mpz(7); $a -= 1; ok ($a == 6); }
  317. { my $a = mpz(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); }
  318. #------------------------------------------------------------------------------
  319. # GMP::Mpz::overload_xor
  320. ok ((mpz(3) ^ 1) == 2);
  321. ok ((mpz(3) ^ 4) == 7);
  322. { my $a = mpz(3); $a ^= 1; ok ($a == 2); }
  323. { my $a = mpz(3); $a ^= 4; ok ($a == 7); }
  324. #------------------------------------------------------------------------------
  325. # GMP::Mpz::bin
  326. ok (bin(2,0) == 1);
  327. ok (bin(2,1) == 2);
  328. ok (bin(2,2) == 1);
  329. ok (bin(3,0) == 1);
  330. ok (bin(3,1) == 3);
  331. ok (bin(3,2) == 3);
  332. ok (bin(3,3) == 1);
  333. #------------------------------------------------------------------------------
  334. # GMP::Mpz::cdiv
  335. { my ($q, $r);
  336.   ($q, $r) = cdiv (16, 3);
  337.   ok ($q == 6);
  338.   ok ($r == -2);
  339.   ($q, $r) = cdiv (16, -3);
  340.   ok ($q == -5);
  341.   ok ($r == 1);
  342.   ($q, $r) = cdiv (-16, 3);
  343.   ok ($q == -5);
  344.   ok ($r == -1);
  345.   ($q, $r) = cdiv (-16, -3);
  346.   ok ($q == 6);
  347.   ok ($r == 2);
  348. }
  349. #------------------------------------------------------------------------------
  350. # GMP::Mpz::cdiv_2exp
  351. { my ($q, $r);
  352.   ($q, $r) = cdiv_2exp (23, 2);
  353.   ok ($q == 6);
  354.   ok ($r == -1);
  355.   ($q, $r) = cdiv_2exp (-23, 2);
  356.   ok ($q == -5);
  357.   ok ($r == -3);
  358. }
  359. #------------------------------------------------------------------------------
  360. # GMP::Mpz::clrbit
  361. { my $a = mpz(3); clrbit ($a, 1); ok ($a == 1);
  362.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  363. { my $a = mpz(3); clrbit ($a, 2); ok ($a == 3);
  364.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  365. { my $a = 3; clrbit ($a, 1); ok ($a == 1);
  366.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  367. { my $a = 3; clrbit ($a, 2); ok ($a == 3);
  368.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  369. # mutate only given variable
  370. { my $a = mpz(3);
  371.   my $b = $a;
  372.   clrbit ($a, 0);
  373.   ok ($a == 2);
  374.   ok ($b == 3);
  375. }
  376. { my $a = 3;
  377.   my $b = $a;
  378.   clrbit ($a, 0);
  379.   ok ($a == 2);
  380.   ok ($b == 3);
  381. }
  382. { tie my $a, 'Mytie', mpz(3);
  383.   clrbit ($a, 1);
  384.   ok ($Mytie::fetched > 0);    # used fetch
  385.   ok ($Mytie::stored > 0);     # used store
  386.   ok ($a == 1);                # expected result
  387.   ok (UNIVERSAL::isa($a,"GMP::Mpz"));
  388.   ok (tied($a));               # still tied
  389. }
  390. { tie my $a, 'Mytie', 3;
  391.   clrbit ($a, 1);
  392.   ok ($Mytie::fetched > 0);    # used fetch
  393.   ok ($Mytie::stored > 0);     # used store
  394.   ok ($a == 1);                # expected result
  395.   ok (UNIVERSAL::isa($a,"GMP::Mpz"));
  396.   ok (tied($a));               # still tied
  397. }
  398. { my $b = mpz(3);
  399.   tie my $a, 'Mytie', $b;
  400.   clrbit ($a, 0);
  401.   ok ($a == 2);
  402.   ok ($b == 3);
  403.   ok (tied($a));
  404. }
  405. { my $b = 3;
  406.   tie my $a, 'Mytie', $b;
  407.   clrbit ($a, 0);
  408.   ok ($a == 2);
  409.   ok ($b == 3);
  410.   ok (tied($a));
  411. }
  412. #------------------------------------------------------------------------------
  413. # GMP::Mpz::combit
  414. { my $a = mpz(3); combit ($a, 1); ok ($a == 1);
  415.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  416. { my $a = mpz(3); combit ($a, 2); ok ($a == 7);
  417.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  418. { my $a = 3; combit ($a, 1); ok ($a == 1);
  419.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  420. { my $a = 3; combit ($a, 2); ok ($a == 7);
  421.   ok (UNIVERSAL::isa($a,"GMP::Mpz")); }
  422. # mutate only given variable
  423. { my $a = mpz(3);
  424.   my $b = $a;
  425.   combit ($a, 0);
  426.   ok ($a == 2);
  427.   ok ($b == 3);
  428. }
  429. { my $a = 3;
  430.   my $b = $a;
  431.   combit ($a, 0);
  432.   ok ($a == 2);
  433.   ok ($b == 3);
  434. }
  435. { tie my $a, 'Mytie', mpz(3);
  436.   combit ($a, 2);
  437.   ok ($Mytie::fetched > 0);    # used fetch
  438.   ok ($Mytie::stored > 0);     # used store
  439.   ok ($a == 7);                # expected result
  440.   ok (UNIVERSAL::isa($a,"GMP::Mpz"));
  441.   ok (tied($a));               # still tied
  442. }
  443. { tie my $a, 'Mytie', 3;
  444.   combit ($a, 2);
  445.   ok ($Mytie::fetched > 0);    # used fetch
  446.   ok ($Mytie::stored > 0);     # used store
  447.   ok ($a == 7);                # expected result
  448.   ok (UNIVERSAL::isa($a,"GMP::Mpz"));
  449.   ok (tied($a));               # still tied
  450. }
  451. { my $b = mpz(3);
  452.   tie my $a, 'Mytie', $b;
  453.   combit ($a, 0);
  454.   ok ($a == 2);
  455.   ok ($b == 3);
  456.   ok (tied($a));
  457. }
  458. { my $b = 3;
  459.   tie my $a, 'Mytie', $b;
  460.   combit ($a, 0);
  461.   ok ($a == 2);
  462.   ok ($b == 3);
  463.   ok (tied($a));
  464. }
  465. #------------------------------------------------------------------------------
  466. # GMP::Mpz::congruent_p
  467. ok (  congruent_p (21, 0, 7));
  468. ok (! congruent_p (21, 1, 7));
  469. ok (  congruent_p (21, 5, 8));
  470. ok (! congruent_p (21, 6, 8));
  471. #------------------------------------------------------------------------------
  472. # GMP::Mpz::congruent_2exp_p
  473. ok (  congruent_2exp_p (20, 0, 2));
  474. ok (! congruent_2exp_p (21, 0, 2));
  475. ok (! congruent_2exp_p (20, 1, 2));
  476. #------------------------------------------------------------------------------
  477. # GMP::Mpz::divexact
  478. ok (divexact(27,3) == 9);
  479. ok (divexact(27,-3) == -9);
  480. ok (divexact(-27,3) == -9);
  481. ok (divexact(-27,-3) == 9);
  482. #------------------------------------------------------------------------------
  483. # GMP::Mpz::divisible_p
  484. ok (  divisible_p (21, 7));
  485. ok (! divisible_p (21, 8));
  486. #------------------------------------------------------------------------------
  487. # GMP::Mpz::divisible_2exp_p
  488. ok (  divisible_2exp_p (20, 2));
  489. ok (! divisible_2exp_p (21, 2));
  490. #------------------------------------------------------------------------------
  491. # GMP::Mpz::even_p
  492. ok (! even_p(mpz(-3)));
  493. ok (  even_p(mpz(-2)));
  494. ok (! even_p(mpz(-1)));
  495. ok (  even_p(mpz(0)));
  496. ok (! even_p(mpz(1)));
  497. ok (  even_p(mpz(2)));
  498. ok (! even_p(mpz(3)));
  499. #------------------------------------------------------------------------------
  500. # GMP::Mpz::export
  501. { my $s = mpz_export (1, 2, 1, 0, "0x61626364");
  502.   ok ($s eq 'abcd'); }
  503. { my $s = mpz_export (-1, 2, 1, 0, "0x61626364");
  504.   ok ($s eq 'cdab'); }
  505. { my $s = mpz_export (1, 2, -1, 0, "0x61626364");
  506.   ok ($s eq 'badc'); }
  507. { my $s = mpz_export (-1, 2, -1, 0, "0x61626364");
  508.   ok ($s eq 'dcba'); }
  509. #------------------------------------------------------------------------------
  510. # GMP::Mpz::fac
  511. ok (fac(0) == 1);
  512. ok (fac(1) == 1);
  513. ok (fac(2) == 2);
  514. ok (fac(3) == 6);
  515. ok (fac(4) == 24);
  516. ok (fac(5) == 120);
  517. #------------------------------------------------------------------------------
  518. # GMP::Mpz::fdiv
  519. { my ($q, $r);
  520.   ($q, $r) = fdiv (16, 3);
  521.   ok ($q == 5);
  522.   ok ($r == 1);
  523.   ($q, $r) = fdiv (16, -3);
  524.   ok ($q == -6);
  525.   ok ($r == -2);
  526.   ($q, $r) = fdiv (-16, 3);
  527.   ok ($q == -6);
  528.   ok ($r == 2);
  529.   ($q, $r) = fdiv (-16, -3);
  530.   ok ($q == 5);
  531.   ok ($r == -1);
  532. }
  533. #------------------------------------------------------------------------------
  534. # GMP::Mpz::fdiv_2exp
  535. { my ($q, $r);
  536.   ($q, $r) = fdiv_2exp (23, 2);
  537.   ok ($q == 5);
  538.   ok ($r == 3);
  539.   ($q, $r) = fdiv_2exp (-23, 2);
  540.   ok ($q == -6);
  541.   ok ($r == 1);
  542. }
  543. #------------------------------------------------------------------------------
  544. # GMP::Mpz::fib
  545. ok (fib(0) == 0);
  546. ok (fib(1) == 1);
  547. ok (fib(2) == 1);
  548. ok (fib(3) == 2);
  549. ok (fib(4) == 3);
  550. ok (fib(5) == 5);
  551. ok (fib(6) == 8);
  552. #------------------------------------------------------------------------------
  553. # GMP::Mpz::fib2
  554. { my ($a, $b) = fib2(0); ok($a==0); ok($b==1); }
  555. { my ($a, $b) = fib2(1); ok($a==1); ok($b==0); }
  556. { my ($a, $b) = fib2(2); ok($a==1); ok($b==1); }
  557. { my ($a, $b) = fib2(3); ok($a==2); ok($b==1); }
  558. { my ($a, $b) = fib2(4); ok($a==3); ok($b==2); }
  559. { my ($a, $b) = fib2(5); ok($a==5); ok($b==3); }
  560. { my ($a, $b) = fib2(6); ok($a==8); ok($b==5); }
  561. #------------------------------------------------------------------------------
  562. # GMP::Mpz::gcd
  563. ok (gcd (21) == 21);
  564. ok (gcd (21,15) == 3);
  565. ok (gcd (21,15,30,57) == 3);
  566. ok (gcd (21,-15) == 3);
  567. ok (gcd (-21,15) == 3);
  568. ok (gcd (-21,-15) == 3);
  569. #------------------------------------------------------------------------------
  570. # GMP::Mpz::gcdext
  571. {
  572.   my ($g, $x, $y) = gcdext (3,5);
  573.   ok ($g == 1);
  574.   ok ($x == 2);
  575.   ok ($y == -1);
  576. }
  577. #------------------------------------------------------------------------------
  578. # GMP::Mpz::hamdist
  579. ok (hamdist(5,7) == 1);
  580. #------------------------------------------------------------------------------
  581. # GMP::Mpz::import
  582. { my $z = mpz_import (1, 2, 1, 0, 'abcd');
  583.   ok ($z == 0x61626364); }
  584. { my $z = mpz_import (-1, 2, 1, 0, 'abcd');
  585.   ok ($z == 0x63646162); }
  586. { my $z = mpz_import (1, 2, -1, 0, 'abcd');
  587.   ok ($z == 0x62616463); }
  588. { my $z = mpz_import (-1, 2, -1, 0, 'abcd');
  589.   ok ($z == 0x64636261); }
  590. #------------------------------------------------------------------------------
  591. # GMP::Mpz::invert
  592. ok (invert(1,123) == 1);
  593. ok (invert(6,7) == 6);
  594. ok (! defined invert(2,8));
  595. #------------------------------------------------------------------------------
  596. # GMP::Mpz::jacobi, GMP::Mpz::kronecker
  597. foreach my $i ([  1, 19,  1 ],
  598.        [  4, 19,  1 ],
  599.        [  5, 19,  1 ],
  600.        [  6, 19,  1 ],
  601.        [  7, 19,  1 ],
  602.        [  9, 19,  1 ],
  603.        [ 11, 19,  1 ],
  604.        [ 16, 19,  1 ],
  605.        [ 17, 19,  1 ],
  606.        [  2, 19, -1 ],
  607.        [  3, 19, -1 ],
  608.        [  8, 19, -1 ],
  609.        [ 10, 19, -1 ],
  610.        [ 12, 19, -1 ],
  611.        [ 13, 19, -1 ],
  612.        [ 14, 19, -1 ],
  613.        [ 15, 19, -1 ],
  614.        [ 18, 19, -1 ]) {
  615.   foreach my $fun (&jacobi, &kronecker) {
  616.     ok (&$fun ($$i[0], $$i[1]) == $$i[2]);
  617.     ok (&$fun ($$i[0],      str($$i[1])) == $$i[2]);
  618.     ok (&$fun (str($$i[0]),     $$i[1])  == $$i[2]);
  619.     ok (&$fun (str($$i[0]), str($$i[1])) == $$i[2]);
  620.     ok (&$fun ($$i[0],      mpz($$i[1])) == $$i[2]);
  621.     ok (&$fun (mpz($$i[0]), $$i[1]) == $$i[2]);
  622.     ok (&$fun (mpz($$i[0]), mpz($$i[1])) == $$i[2]);
  623.   }
  624. }
  625. #------------------------------------------------------------------------------
  626. # GMP::Mpz::lcm
  627. ok (lcm (2) == 2);
  628. ok (lcm (0) == 0);
  629. ok (lcm (0,0) == 0);
  630. ok (lcm (0,0,0) == 0);
  631. ok (lcm (0,0,0,0) == 0);
  632. ok (lcm (2,0) == 0);
  633. ok (lcm (-2,0) == 0);
  634. ok (lcm (2,3) == 6);
  635. ok (lcm (2,3,4) == 12);
  636. ok (lcm (2,-3) == 6);
  637. ok (lcm (-2,3) == 6);
  638. ok (lcm (-2,-3) == 6);
  639. ok (lcm (mpz(2)**512,1) == mpz(2)**512);
  640. ok (lcm (mpz(2)**512,-1) == mpz(2)**512);
  641. ok (lcm (-mpz(2)**512,1) == mpz(2)**512);
  642. ok (lcm (-mpz(2)**512,-1) == mpz(2)**512);
  643. ok (lcm (mpz(2)**512,mpz(2)**512) == mpz(2)**512);
  644. ok (lcm (mpz(2)**512,-mpz(2)**512) == mpz(2)**512);
  645. ok (lcm (-mpz(2)**512,mpz(2)**512) == mpz(2)**512);
  646. ok (lcm (-mpz(2)**512,-mpz(2)**512) == mpz(2)**512);
  647. #------------------------------------------------------------------------------
  648. # GMP::Mpz::lucnum
  649. ok (lucnum(0) == 2);
  650. ok (lucnum(1) == 1);
  651. ok (lucnum(2) == 3);
  652. ok (lucnum(3) == 4);
  653. ok (lucnum(4) == 7);
  654. ok (lucnum(5) == 11);
  655. ok (lucnum(6) == 18);
  656. #------------------------------------------------------------------------------
  657. # GMP::Mpz::lucnum2
  658. { my ($a, $b) = lucnum2(0); ok($a==2);  ok($b==-1); }
  659. { my ($a, $b) = lucnum2(1); ok($a==1);  ok($b==2); }
  660. { my ($a, $b) = lucnum2(2); ok($a==3);  ok($b==1); }
  661. { my ($a, $b) = lucnum2(3); ok($a==4);  ok($b==3); }
  662. { my ($a, $b) = lucnum2(4); ok($a==7);  ok($b==4); }
  663. { my ($a, $b) = lucnum2(5); ok($a==11); ok($b==7); }
  664. { my ($a, $b) = lucnum2(6); ok($a==18); ok($b==11); }
  665. #------------------------------------------------------------------------------
  666. # GMP::Mpz::nextprime
  667. ok (nextprime(2) == 3);
  668. ok (nextprime(3) == 5);
  669. ok (nextprime(5) == 7);
  670. ok (nextprime(7) == 11);
  671. ok (nextprime(11) == 13);
  672. #------------------------------------------------------------------------------
  673. # GMP::Mpz::perfect_power_p
  674. # ok (  perfect_power_p(mpz(-27)));
  675. # ok (! perfect_power_p(mpz(-9)));
  676. # ok (! perfect_power_p(mpz(-1)));
  677. ok (  perfect_power_p(mpz(0)));
  678. ok (  perfect_power_p(mpz(1)));
  679. ok (! perfect_power_p(mpz(2)));
  680. ok (! perfect_power_p(mpz(3)));
  681. ok (  perfect_power_p(mpz(4)));
  682. ok (  perfect_power_p(mpz(9)));
  683. ok (  perfect_power_p(mpz(27)));
  684. ok (  perfect_power_p(mpz(81)));
  685. #------------------------------------------------------------------------------
  686. # GMP::Mpz::perfect_square_p
  687. ok (! perfect_square_p(mpz(-9)));
  688. ok (! perfect_square_p(mpz(-1)));
  689. ok (  perfect_square_p(mpz(0)));
  690. ok (  perfect_square_p(mpz(1)));
  691. ok (! perfect_square_p(mpz(2)));
  692. ok (! perfect_square_p(mpz(3)));
  693. ok (  perfect_square_p(mpz(4)));
  694. ok (  perfect_square_p(mpz(9)));
  695. ok (! perfect_square_p(mpz(27)));
  696. ok (  perfect_square_p(mpz(81)));
  697. #------------------------------------------------------------------------------
  698. # GMP::Mpz::popcount
  699. ok (popcount(7) == 3);
  700. #------------------------------------------------------------------------------
  701. # GMP::Mpz::powm
  702. ok (powm (3,2,8) == 1);
  703. #------------------------------------------------------------------------------
  704. # GMP::Mpz::probab_prime_p
  705. ok (  probab_prime_p(89,1));
  706. ok (! probab_prime_p(81,1));
  707. #------------------------------------------------------------------------------
  708. # GMP::Mpz::realloc
  709. { my $z = mpz(123);
  710.   realloc ($z, 512); }
  711. #------------------------------------------------------------------------------
  712. # GMP::Mpz::remove
  713. {
  714.   my ($rem, $mult);
  715.   ($rem, $mult) = remove(12,3);
  716.   ok ($rem == 4);
  717.   ok ($mult == 1);
  718.   ($rem, $mult) = remove(12,2);
  719.   ok ($rem == 3);
  720.   ok ($mult == 2);
  721. }
  722. #------------------------------------------------------------------------------
  723. # GMP::Mpz::root
  724. ok (root(0,2) == 0);
  725. ok (root(8,3) == 2);
  726. ok (root(-8,3) == -2);
  727. ok (root(81,4) == 3);
  728. ok (root(243,5) == 3);
  729. #------------------------------------------------------------------------------
  730. # GMP::Mpz::roote
  731. { my ($r,$e);
  732.   ($r, $e) = roote(0,2);
  733.   ok ($r == 0);
  734.   ok ($e);
  735.   ($r, $e) = roote(81,4);
  736.   ok ($r == 3);
  737.   ok ($e);
  738.   ($r, $e) = roote(85,4);
  739.   ok ($r == 3);
  740.   ok (! $e);
  741. }
  742. #------------------------------------------------------------------------------
  743. # GMP::Mpz::rootrem
  744. { my ($root, $rem) = rootrem (mpz(0), 1);
  745.   ok ($root == 0); ok ($rem == 0); }
  746. { my ($root, $rem) = rootrem (mpz(0), 2);
  747.   ok ($root == 0); ok ($rem == 0); }
  748. { my ($root, $rem) = rootrem (mpz(64), 2);
  749.   ok ($root == 8); ok ($rem == 0); }
  750. { my ($root, $rem) = rootrem (mpz(64), 3);
  751.   ok ($root == 4); ok ($rem == 0); }
  752. { my ($root, $rem) = rootrem (mpz(65), 3);
  753.   ok ($root == 4); ok ($rem == 1); }
  754. #------------------------------------------------------------------------------
  755. # GMP::Mpz::scan0
  756. ok (scan0 (0, 0) == 0);
  757. ok (scan0 (1, 0) == 1);
  758. ok (scan0 (3, 0) == 2);
  759. ok (scan0 (-1, 0) == ~0);
  760. ok (scan0 (-2, 1) == ~0);
  761. #------------------------------------------------------------------------------
  762. # GMP::Mpz::scan1
  763. ok (scan1 (1, 0) == 0);
  764. ok (scan1 (2, 0) == 1);
  765. ok (scan1 (4, 0) == 2);
  766. ok (scan1 (0, 0) == ~0);
  767. ok (scan1 (3, 2) == ~0);
  768. #------------------------------------------------------------------------------
  769. # GMP::Mpz::setbit
  770. { my $a = mpz(3); setbit ($a, 1); ok ($a == 3); }
  771. { my $a = mpz(3); setbit ($a, 2); ok ($a == 7); }
  772. { my $a = 3; setbit ($a, 1); ok ($a == 3); }
  773. { my $a = 3; setbit ($a, 2); ok ($a == 7); }
  774. # mutate only given variable
  775. { my $a = mpz(0);
  776.   my $b = $a;
  777.   setbit ($a, 0);
  778.   ok ($a == 1);
  779.   ok ($b == 0);
  780. }
  781. { my $a = 0;
  782.   my $b = $a;
  783.   setbit ($a, 0);
  784.   ok ($a == 1);
  785.   ok ($b == 0);
  786. }
  787. { tie my $a, 'Mytie', mpz(3);
  788.   setbit ($a, 2);
  789.   ok ($Mytie::fetched > 0);    # used fetch
  790.   ok ($Mytie::stored > 0);     # used store
  791.   ok ($a == 7);                # expected result
  792.   ok (UNIVERSAL::isa($a,"GMP::Mpz"));
  793.   ok (tied($a));               # still tied
  794. }
  795. { tie my $a, 'Mytie', 3;
  796.   setbit ($a, 2);
  797.   ok ($Mytie::fetched > 0);    # used fetch
  798.   ok ($Mytie::stored > 0);     # used store
  799.   ok ($a == 7);                # expected result
  800.   ok (UNIVERSAL::isa($a,"GMP::Mpz"));
  801.   ok (tied($a));               # still tied
  802. }
  803. { my $b = mpz(2);
  804.   tie my $a, 'Mytie', $b;
  805.   setbit ($a, 0);
  806.   ok ($a == 3);
  807.   ok ($b == 2);
  808.   ok (tied($a));
  809. }
  810. { my $b = 2;
  811.   tie my $a, 'Mytie', $b;
  812.   setbit ($a, 0);
  813.   ok ($a == 3);
  814.   ok ($b == 2);
  815.   ok (tied($a));
  816. }
  817. #------------------------------------------------------------------------------
  818. # GMP::Mpz::sizeinbase
  819. ok (sizeinbase(1,10) == 1);
  820. ok (sizeinbase(100,10) == 3);
  821. ok (sizeinbase(9999,10) == 5);
  822. #------------------------------------------------------------------------------
  823. # GMP::Mpz::sqrtrem
  824. {
  825.   my ($root, $rem) = sqrtrem(mpz(0));
  826.   ok ($root == 0);
  827.   ok ($rem == 0);
  828. }
  829. {
  830.   my ($root, $rem) = sqrtrem(mpz(1));
  831.   ok ($root == 1);
  832.   ok ($rem == 0);
  833. }
  834. {
  835.   my ($root, $rem) = sqrtrem(mpz(2));
  836.   ok ($root == 1);
  837.   ok ($rem == 1);
  838. }
  839. {
  840.   my ($root, $rem) = sqrtrem(mpz(9));
  841.   ok ($root == 3);
  842.   ok ($rem == 0);
  843. }
  844. {
  845.   my ($root, $rem) = sqrtrem(mpz(35));
  846.   ok ($root == 5);
  847.   ok ($rem == 10);
  848. }
  849. {
  850.   my ($root, $rem) = sqrtrem(mpz(0));
  851.   ok ($root == 0);
  852.   ok ($rem == 0);
  853. }
  854. #------------------------------------------------------------------------------
  855. # GMP::Mpz::tdiv
  856. { my ($q, $r);
  857.   ($q, $r) = tdiv (16, 3);
  858.   ok ($q == 5);
  859.   ok ($r == 1);
  860.   ($q, $r) = tdiv (16, -3);
  861.   ok ($q == -5);
  862.   ok ($r == 1);
  863.   ($q, $r) = tdiv (-16, 3);
  864.   ok ($q == -5);
  865.   ok ($r == -1);
  866.   ($q, $r) = tdiv (-16, -3);
  867.   ok ($q == 5);
  868.   ok ($r == -1);
  869. }
  870. #------------------------------------------------------------------------------
  871. # GMP::Mpz::tdiv_2exp
  872. { my ($q, $r);
  873.   ($q, $r) = tdiv_2exp (23, 2);
  874.   ok ($q == 5);
  875.   ok ($r == 3);
  876.   ($q, $r) = tdiv_2exp (-23, 2);
  877.   ok ($q == -5);
  878.   ok ($r == -3);
  879. }
  880. #------------------------------------------------------------------------------
  881. # GMP::Mpz::tstbit
  882. ok (tstbit (6, 0) == 0);
  883. ok (tstbit (6, 1) == 1);
  884. ok (tstbit (6, 2) == 1);
  885. ok (tstbit (6, 3) == 0);
  886. #------------------------------------------------------------------------------
  887. # GMP::Mpq
  888. #------------------------------------------------------------------------------
  889. # GMP::Mpq::new
  890. ok (mpq(0) == 0);
  891. ok (mpq('0') == 0);
  892. ok (mpq(substr('101',1,1)) == 0);
  893. ok (mpq(0.0) == 0);
  894. ok (mpq(mpz(0)) == 0);
  895. ok (mpq(mpq(0)) == 0);
  896. ok (mpq(mpf(0)) == 0);
  897. { tie my $t, 'Mytie', 0; ok (mpq($t) == 0); }
  898. { tie my $t, 'Mytie', '0'; ok (mpq($t) == 0); }
  899. { tie my $t, 'Mytie', substr('101',1,1); ok (mpq($t) == 0); }
  900. { tie my $t, 'Mytie', 0.0; ok (mpq($t) == 0); }
  901. { tie my $t, 'Mytie', mpz(0); ok (mpq($t) == 0); }
  902. { tie my $t, 'Mytie', mpq(0); ok (mpq($t) == 0); }
  903. { tie my $t, 'Mytie', mpf(0); ok (mpq($t) == 0); }
  904. ok (mpq(-123) == -123);
  905. ok (mpq('-123') == -123);
  906. ok (mpq(substr('1-1231',1,4)) == -123);
  907. ok (mpq(-123.0) == -123);
  908. ok (mpq(mpz(-123)) == -123);
  909. ok (mpq(mpq(-123)) == -123);
  910. ok (mpq(mpf(-123)) == -123);
  911. { tie my $t, 'Mytie', -123; ok (mpq($t) == -123); }
  912. { tie my $t, 'Mytie', '-123'; ok (mpq($t) == -123); }
  913. { tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpq($t) == -123); }
  914. { tie my $t, 'Mytie', -123.0; ok (mpq($t) == -123); }
  915. { tie my $t, 'Mytie', mpz(-123); ok (mpq($t) == -123); }
  916. { tie my $t, 'Mytie', mpq(-123); ok (mpq($t) == -123); }
  917. { tie my $t, 'Mytie', mpf(-123); ok (mpq($t) == -123); }
  918. ok (mpq($ivnv_2p128) == $str_2p128);
  919. { tie my $t, 'Mytie', $ivnv_2p128; ok (mpq($t) == $str_2p128); }
  920. ok (mpq('3/2') == mpq(3,2));
  921. ok (mpq('3/1') == mpq(3,1));
  922. ok (mpq('-3/2') == mpq(-3,2));
  923. ok (mpq('-3/1') == mpq(-3,1));
  924. ok (mpq('0x3') == mpq(3,1));
  925. ok (mpq('0b111') == mpq(7,1));
  926. ok (mpq('0b0') == mpq(0,1));
  927. ok (mpq($uv_max) > 0);
  928. ok (mpq($uv_max) == mpq($uv_max_str));
  929. { tie my $t, 'Mytie', $uv_max; ok (mpq($t) > 0); }
  930. { tie my $t, 'Mytie', $uv_max; ok (mpq($t) == mpq($uv_max_str)); }
  931. { my $x = 123.5;
  932.   kill (0, $x);
  933.   ok (mpq($x) == 123.5);
  934.   tie my $t, 'Mytie', $x;
  935.   ok (mpq($t) == 123.5);
  936. }
  937. #------------------------------------------------------------------------------
  938. # GMP::Mpq::overload_abs
  939. ok (abs(mpq(0)) == 0);
  940. ok (abs(mpq(123)) == 123);
  941. ok (abs(mpq(-123)) == 123);
  942. { my $x = mpq(-123); $x = abs($x); ok ($x == 123); }
  943. { my $x = mpq(0);    $x = abs($x); ok ($x == 0);   }
  944. { my $x = mpq(123);  $x = abs($x); ok ($x == 123); }
  945. { tie my $t, 'Mytie', mpq(0); ok (abs($t) == 0); }
  946. { tie my $t, 'Mytie', mpq(123); ok (abs($t) == 123); }
  947. { tie my $t, 'Mytie', mpq(-123); ok (abs($t) == 123); }
  948. #------------------------------------------------------------------------------
  949. # GMP::Mpq::overload_add
  950. ok (mpq(0) + 1 == 1);
  951. ok (mpq(-1) + 1 == 0);
  952. ok (1 + mpq(0) == 1);
  953. ok (1 + mpq(-1) == 0);
  954. ok (mpq(1,2)+mpq(1,3) == mpq(5,6));
  955. ok (mpq(1,2)+mpq(-1,3) == mpq(1,6));
  956. ok (mpq(-1,2)+mpq(1,3) == mpq(-1,6));
  957. ok (mpq(-1,2)+mpq(-1,3) == mpq(-5,6));
  958. #------------------------------------------------------------------------------
  959. # GMP::Mpq::overload_addeq
  960. { my $a = mpq(7); $a += 1; ok ($a == 8); }
  961. { my $a = mpq(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); }
  962. #------------------------------------------------------------------------------
  963. # GMP::Mpq::overload_bool
  964. if (mpq(0))   { ok (0); } else { ok (1); }
  965. if (mpq(123)) { ok (1); } else { ok (0); }
  966. #------------------------------------------------------------------------------
  967. # GMP::Mpq::overload_dec
  968. { my $a = mpq(0); ok ($a-- == 0); ok ($a == -1); }
  969. { my $a = mpq(0); ok (--$a == -1); }
  970. { my $a = mpq(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); }
  971. #------------------------------------------------------------------------------
  972. # GMP::Mpq::overload_div
  973. ok (mpq(6) / 2 == 3);
  974. ok (mpq(-6) / 2 == -3);
  975. ok (mpq(6) / -2 == -3);
  976. ok (mpq(-6) / -2 == 3);
  977. #------------------------------------------------------------------------------
  978. # GMP::Mpq::overload_diveq
  979. { my $a = mpq(21); $a /= 3; ok ($a == 7); }
  980. { my $a = mpq(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); }
  981. #------------------------------------------------------------------------------
  982. # GMP::Mpq::overload_eq
  983. { my $a = mpq(0);
  984.   my $b = $a;
  985.   $a = mpq(1);
  986.   ok ($a == 1);
  987.   ok ($b == 0); }
  988. #------------------------------------------------------------------------------
  989. # GMP::Mpq::overload_inc
  990. { my $a = mpq(0); ok ($a++ == 0); ok ($a == 1); }
  991. { my $a = mpq(0); ok (++$a == 1); }
  992. { my $a = mpq(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); }
  993. #------------------------------------------------------------------------------
  994. # GMP::Mpq::overload_lshift
  995. { my $a = mpq(7) << 1; ok ($a == 14); }
  996. #------------------------------------------------------------------------------
  997. # GMP::Mpq::overload_lshifteq
  998. { my $a = mpq(7); $a <<= 1; ok ($a == 14); }
  999. { my $a = mpq(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); }
  1000. #------------------------------------------------------------------------------
  1001. # GMP::Mpq::overload_mul
  1002. ok (mpq(2) * 3 == 6);
  1003. #------------------------------------------------------------------------------
  1004. # GMP::Mpq::overload_muleq
  1005. { my $a = mpq(7); $a *= 3;  ok ($a == 21); }
  1006. { my $a = mpq(7); my $b = $a; $a *= 3;  ok ($a == 21); ok ($b == 7); }
  1007. #------------------------------------------------------------------------------
  1008. # GMP::Mpq::overload_neg
  1009. ok (- mpq(0) == 0);
  1010. ok (- mpq(123) == -123);
  1011. ok (- mpq(-123) == 123);
  1012. #------------------------------------------------------------------------------
  1013. # GMP::Mpq::overload_not
  1014. if (not mpq(0))   { ok (1); } else { ok (0); }
  1015. if (not mpq(123)) { ok (0); } else { ok (1); }
  1016. ok ((! mpq(0)) == 1);
  1017. ok ((! mpq(123)) == 0);
  1018. #------------------------------------------------------------------------------
  1019. # GMP::Mpq::overload_pow
  1020. ok (mpq(0) ** 1 == 0);
  1021. ok (mpq(1) ** 1 == 1);
  1022. ok (mpq(2) ** 0 == 1);
  1023. ok (mpq(2) ** 1 == 2);
  1024. ok (mpq(2) ** 2 == 4);
  1025. ok (mpq(2) ** 3 == 8);
  1026. ok (mpq(2) ** 4 == 16);
  1027. ok (mpq(0) ** mpq(1) == 0);
  1028. ok (mpq(1) ** mpq(1) == 1);
  1029. ok (mpq(2) ** mpq(0) == 1);
  1030. ok (mpq(2) ** mpq(1) == 2);
  1031. ok (mpq(2) ** mpq(2) == 4);
  1032. ok (mpq(2) ** mpq(3) == 8);
  1033. ok (mpq(2) ** mpq(4) == 16);
  1034. #------------------------------------------------------------------------------
  1035. # GMP::Mpq::overload_poweq
  1036. { my $a = mpq(3); $a **= 4; ok ($a == 81); }
  1037. { my $a = mpq(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); }
  1038. #------------------------------------------------------------------------------
  1039. # GMP::Mpq::overload_rshift
  1040. { my $a = mpq(32) >> 1; ok ($a == 16); }
  1041. #------------------------------------------------------------------------------
  1042. # GMP::Mpq::overload_rshifteq
  1043. { my $a = mpq(32); $a >>= 1; ok ($a == 16); }
  1044. { my $a = mpq(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); }
  1045. #------------------------------------------------------------------------------
  1046. # GMP::Mpq::overload_spaceship
  1047. ok (mpq(0) < 1);
  1048. ok (mpq(0) > -1);
  1049. ok (mpq(0) != 1);
  1050. ok (mpq(0) != -1);
  1051. ok (mpq(1) != 0);
  1052. ok (mpq(1) != -1);
  1053. ok (mpq(-1) != 0);
  1054. ok (mpq(-1) != 1);
  1055. ok (mpq(3,2) > 1);
  1056. ok (mpq(3,2) < 2);
  1057. ok (mpq(0) < 1.0);
  1058. ok (mpq(0) < '1');
  1059. ok (mpq(0) < substr('-1',1,1));
  1060. ok (mpq(0) < mpz(1));
  1061. ok (mpq(0) < mpq(1));
  1062. ok (mpq(0) < mpf(1));
  1063. ok (mpq(0) < $uv_max);
  1064. #------------------------------------------------------------------------------
  1065. # GMP::Mpq::overload_string
  1066. { my $x = mpq(0);    ok("$x" eq "0"); }
  1067. { my $x = mpq(123);  ok("$x" eq "123"); }
  1068. { my $x = mpq(-123); ok("$x" eq "-123"); }
  1069. { my $q = mpq(5,7);  ok("$q" eq "5/7"); }
  1070. { my $q = mpq(-5,7); ok("$q" eq "-5/7"); }
  1071. #------------------------------------------------------------------------------
  1072. # GMP::Mpq::overload_sub
  1073. ok (mpq(0) - 1 == -1);
  1074. ok (mpq(1) - 1 == 0);
  1075. ok (1 - mpq(0) == 1);
  1076. ok (1 - mpq(1) == 0);
  1077. ok (mpq(1,2)-mpq(1,3) == mpq(1,6));
  1078. ok (mpq(1,2)-mpq(-1,3) == mpq(5,6));
  1079. ok (mpq(-1,2)-mpq(1,3) == mpq(-5,6));
  1080. ok (mpq(-1,2)-mpq(-1,3) == mpq(-1,6));
  1081. #------------------------------------------------------------------------------
  1082. # GMP::Mpq::overload_subeq
  1083. { my $a = mpq(7); $a -= 1; ok ($a == 6); }
  1084. { my $a = mpq(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); }
  1085. #------------------------------------------------------------------------------
  1086. # GMP::Mpq::canonicalize
  1087. { my $q = mpq(21,15); canonicalize($q);
  1088.   ok (num($q) == 7);
  1089.   ok (den($q) == 5);
  1090. }
  1091. #------------------------------------------------------------------------------
  1092. # GMP::Mpq::den
  1093. { my $q = mpq(5,9); ok (den($q) == 9); }
  1094. #------------------------------------------------------------------------------
  1095. # GMP::Mpq::num
  1096. { my $q = mpq(5,9); ok (num($q) == 5); }
  1097. #------------------------------------------------------------------------------
  1098. # GMP::Mpf
  1099. #------------------------------------------------------------------------------
  1100. # GMP::Mpf::new
  1101. ok (mpf(0) == 0);
  1102. ok (mpf('0') == 0);
  1103. ok (mpf(substr('101',1,1)) == 0);
  1104. ok (mpf(0.0) == 0);
  1105. ok (mpf(mpz(0)) == 0);
  1106. ok (mpf(mpq(0)) == 0);
  1107. ok (mpf(mpf(0)) == 0);
  1108. { tie my $t, 'Mytie', 0; ok (mpf($t) == 0); }
  1109. { tie my $t, 'Mytie', '0'; ok (mpf($t) == 0); }
  1110. { tie my $t, 'Mytie', substr('101',1,1); ok (mpf($t) == 0); }
  1111. { tie my $t, 'Mytie', 0.0; ok (mpf($t) == 0); }
  1112. { tie my $t, 'Mytie', mpz(0); ok (mpf($t) == 0); }
  1113. { tie my $t, 'Mytie', mpq(0); ok (mpf($t) == 0); }
  1114. { tie my $t, 'Mytie', mpf(0); ok (mpf($t) == 0); }
  1115. ok (mpf(-123) == -123);
  1116. ok (mpf('-123') == -123);
  1117. ok (mpf(substr('1-1231',1,4)) == -123);
  1118. ok (mpf(-123.0) == -123);
  1119. ok (mpf(mpz(-123)) == -123);
  1120. ok (mpf(mpq(-123)) == -123);
  1121. ok (mpf(mpf(-123)) == -123);
  1122. { tie my $t, 'Mytie', -123; ok (mpf($t) == -123); }
  1123. { tie my $t, 'Mytie', '-123'; ok (mpf($t) == -123); }
  1124. { tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpf($t) == -123); }
  1125. { tie my $t, 'Mytie', -123.0; ok (mpf($t) == -123); }
  1126. { tie my $t, 'Mytie', mpz(-123); ok (mpf($t) == -123); }
  1127. { tie my $t, 'Mytie', mpq(-123); ok (mpf($t) == -123); }
  1128. { tie my $t, 'Mytie', mpf(-123); ok (mpf($t) == -123); }
  1129. ok (mpf($ivnv_2p128) == $str_2p128);
  1130. { tie my $t, 'Mytie', $ivnv_2p128; ok (mpf($t) == $str_2p128); }
  1131. ok (mpf(-1.5) == -1.5);
  1132. ok (mpf(-1.0) == -1.0);
  1133. ok (mpf(-0.5) == -0.5);
  1134. ok (mpf(0) == 0);
  1135. ok (mpf(0.5) == 0.5);
  1136. ok (mpf(1.0) == 1.0);
  1137. ok (mpf(1.5) == 1.5);
  1138. ok (mpf("-1.5") == -1.5);
  1139. ok (mpf("-1.0") == -1.0);
  1140. ok (mpf("-0.5") == -0.5);
  1141. ok (mpf("0") == 0);
  1142. ok (mpf("0.5") == 0.5);
  1143. ok (mpf("1.0") == 1.0);
  1144. ok (mpf("1.5") == 1.5);
  1145. ok (mpf($uv_max) > 0);
  1146. ok (mpf($uv_max) == mpf($uv_max_str));
  1147. { tie my $t, 'Mytie', $uv_max; ok (mpf($t) > 0); }
  1148. { tie my $t, 'Mytie', $uv_max; ok (mpf($t) == mpf($uv_max_str)); }
  1149. { my $x = 123.5;
  1150.   kill (0, $x);
  1151.   ok (mpf($x) == 123.5);
  1152.   tie my $t, 'Mytie', $x;
  1153.   ok (mpf($t) == 123.5);
  1154. }
  1155. #------------------------------------------------------------------------------
  1156. # GMP::Mpf::overload_abs
  1157. ok (abs(mpf(0)) == 0);
  1158. ok (abs(mpf(123)) == 123);
  1159. ok (abs(mpf(-123)) == 123);
  1160. { my $x = mpf(-123); $x = abs($x); ok ($x == 123); }
  1161. { my $x = mpf(0);    $x = abs($x); ok ($x == 0);   }
  1162. { my $x = mpf(123);  $x = abs($x); ok ($x == 123); }
  1163. { tie my $t, 'Mytie', mpf(0); ok (abs($t) == 0); }
  1164. { tie my $t, 'Mytie', mpf(123); ok (abs($t) == 123); }
  1165. { tie my $t, 'Mytie', mpf(-123); ok (abs($t) == 123); }
  1166. #------------------------------------------------------------------------------
  1167. # GMP::Mpf::overload_add
  1168. ok (mpf(0) + 1 == 1);
  1169. ok (mpf(-1) + 1 == 0);
  1170. ok (1 + mpf(0) == 1);
  1171. ok (1 + mpf(-1) == 0);
  1172. #------------------------------------------------------------------------------
  1173. # GMP::Mpf::overload_addeq
  1174. { my $a = mpf(7); $a += 1; ok ($a == 8); }
  1175. { my $a = mpf(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); }
  1176. #------------------------------------------------------------------------------
  1177. # GMP::Mpf::overload_bool
  1178. if (mpf(0))   { ok (0); } else { ok (1); }
  1179. if (mpf(123)) { ok (1); } else { ok (0); }
  1180. #------------------------------------------------------------------------------
  1181. # GMP::Mpf::overload_dec
  1182. { my $a = mpf(0); ok ($a-- == 0); ok ($a == -1); }
  1183. { my $a = mpf(0); ok (--$a == -1); }
  1184. { my $a = mpf(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); }
  1185. #------------------------------------------------------------------------------
  1186. # GMP::Mpf::overload_div
  1187. ok (mpf(6) / 2 == 3);
  1188. ok (mpf(-6) / 2 == -3);
  1189. ok (mpf(6) / -2 == -3);
  1190. ok (mpf(-6) / -2 == 3);
  1191. #------------------------------------------------------------------------------
  1192. # GMP::Mpf::overload_diveq
  1193. { my $a = mpf(21); $a /= 3; ok ($a == 7); }
  1194. { my $a = mpf(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); }
  1195. #------------------------------------------------------------------------------
  1196. # GMP::Mpf::overload_eq
  1197. { my $a = mpf(0);
  1198.   my $b = $a;
  1199.   $a = mpf(1);
  1200.   ok ($a == 1);
  1201.   ok ($b == 0); }
  1202. #------------------------------------------------------------------------------
  1203. # GMP::Mpf::overload_inc
  1204. { my $a = mpf(0); ok ($a++ == 0); ok ($a == 1); }
  1205. { my $a = mpf(0); ok (++$a == 1); }
  1206. { my $a = mpf(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); }
  1207. #------------------------------------------------------------------------------
  1208. # GMP::Mpf::overload_lshift
  1209. { my $a = mpf(7) << 1; ok ($a == 14); }
  1210. #------------------------------------------------------------------------------
  1211. # GMP::Mpf::overload_lshifteq
  1212. { my $a = mpf(7); $a <<= 1; ok ($a == 14); }
  1213. { my $a = mpf(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); }
  1214. #------------------------------------------------------------------------------
  1215. # GMP::Mpf::overload_mul
  1216. ok (mpf(2) * 3 == 6);
  1217. #------------------------------------------------------------------------------
  1218. # GMP::Mpf::overload_muleq
  1219. { my $a = mpf(7); $a *= 3;  ok ($a == 21); }
  1220. { my $a = mpf(7); my $b = $a; $a *= 3;  ok ($a == 21); ok ($b == 7); }
  1221. #------------------------------------------------------------------------------
  1222. # GMP::Mpf::overload_neg
  1223. ok (- mpf(0) == 0);
  1224. ok (- mpf(123) == -123);
  1225. ok (- mpf(-123) == 123);
  1226. #------------------------------------------------------------------------------
  1227. # GMP::Mpf::overload_not
  1228. if (not mpf(0))   { ok (1); } else { ok (0); }
  1229. if (not mpf(123)) { ok (0); } else { ok (1); }
  1230. ok ((! mpf(0)) == 1);
  1231. ok ((! mpf(123)) == 0);
  1232. #------------------------------------------------------------------------------
  1233. # GMP::Mpf::overload_pow
  1234. ok (mpf(0) ** 1 == 0);
  1235. ok (mpf(1) ** 1 == 1);
  1236. ok (mpf(2) ** 0 == 1);
  1237. ok (mpf(2) ** 1 == 2);
  1238. ok (mpf(2) ** 2 == 4);
  1239. ok (mpf(2) ** 3 == 8);
  1240. ok (mpf(2) ** 4 == 16);
  1241. ok (mpf(0) ** mpf(1) == 0);
  1242. ok (mpf(1) ** mpf(1) == 1);
  1243. ok (mpf(2) ** mpf(0) == 1);
  1244. ok (mpf(2) ** mpf(1) == 2);
  1245. ok (mpf(2) ** mpf(2) == 4);
  1246. ok (mpf(2) ** mpf(3) == 8);
  1247. ok (mpf(2) ** mpf(4) == 16);
  1248. #------------------------------------------------------------------------------
  1249. # GMP::Mpf::overload_poweq
  1250. { my $a = mpf(3); $a **= 4; ok ($a == 81); }
  1251. { my $a = mpf(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); }
  1252. #------------------------------------------------------------------------------
  1253. # GMP::Mpf::overload_rshift
  1254. { my $a = mpf(32) >> 1; ok ($a == 16); }
  1255. #------------------------------------------------------------------------------
  1256. # GMP::Mpf::overload_rshifteq
  1257. { my $a = mpf(32); $a >>= 1; ok ($a == 16); }
  1258. { my $a = mpf(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); }
  1259. #------------------------------------------------------------------------------
  1260. # GMP::Mpf::overload_sqrt
  1261. ok (sqrt(mpf(0)) == 0);
  1262. ok (sqrt(mpf(1)) == 1);
  1263. ok (sqrt(mpf(4)) == 2);
  1264. ok (sqrt(mpf(81)) == 9);
  1265. ok (sqrt(mpf(0.25)) == 0.5);
  1266. #------------------------------------------------------------------------------
  1267. # GMP::Mpf::overload_spaceship
  1268. ok (mpf(0) < 1);
  1269. ok (mpf(0) > -1);
  1270. ok (mpf(0) != 1);
  1271. ok (mpf(0) != -1);
  1272. ok (mpf(1) != 0);
  1273. ok (mpf(1) != -1);
  1274. ok (mpf(-1) != 0);
  1275. ok (mpf(-1) != 1);
  1276. ok (mpf(0) < 1.0);
  1277. ok (mpf(0) < '1');
  1278. ok (mpf(0) < substr('-1',1,1));
  1279. ok (mpf(0) < mpz(1));
  1280. ok (mpf(0) < mpq(1));
  1281. ok (mpf(0) < mpf(1));
  1282. ok (mpf(0) < $uv_max);
  1283. #------------------------------------------------------------------------------
  1284. # GMP::Mpf::overload_string
  1285. { my $x = mpf(0);    ok ("$x" eq "0"); }
  1286. { my $x = mpf(123);  ok ("$x" eq "123"); }
  1287. { my $x = mpf(-123); ok ("$x" eq "-123"); }
  1288. { my $f = mpf(0.25);     ok ("$f" eq "0.25"); }
  1289. { my $f = mpf(-0.25);    ok ("$f" eq "-0.25"); }
  1290. { my $f = mpf(1.25);     ok ("$f" eq "1.25"); }
  1291. { my $f = mpf(-1.25);    ok ("$f" eq "-1.25"); }
  1292. { my $f = mpf(1000000);  ok ("$f" eq "1000000"); }
  1293. { my $f = mpf(-1000000); ok ("$f" eq "-1000000"); }
  1294. #------------------------------------------------------------------------------
  1295. # GMP::Mpf::overload_sub
  1296. ok (mpf(0) - 1 == -1);
  1297. ok (mpf(1) - 1 == 0);
  1298. ok (1 - mpf(0) == 1);
  1299. ok (1 - mpf(1) == 0);
  1300. #------------------------------------------------------------------------------
  1301. # GMP::Mpf::overload_subeq
  1302. { my $a = mpf(7); $a -= 1; ok ($a == 6); }
  1303. { my $a = mpf(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); }
  1304. #------------------------------------------------------------------------------
  1305. # GMP::Mpf::ceil
  1306. ok (ceil (mpf(-7.5)) == -7.0);
  1307. ok (ceil (mpf(7.5)) == 8.0);
  1308. #------------------------------------------------------------------------------
  1309. # GMP::Mpf::floor
  1310. ok (floor(mpf(-7.5)) == -8.0);
  1311. ok (floor(mpf(7.5)) == 7.0);
  1312. #------------------------------------------------------------------------------
  1313. # GMP::Mpf::mpf_eq
  1314. { my $old_prec = get_default_prec();
  1315.   set_default_prec(128);
  1316.   ok (  mpf_eq (mpz("0x10000000000000001"), mpz("0x10000000000000002"), 1));
  1317.   ok (! mpf_eq (mpz("0x11"), mpz("0x12"), 128));
  1318.   set_default_prec($old_prec);
  1319. }
  1320. #------------------------------------------------------------------------------
  1321. # GMP::Mpf::get_default_prec
  1322. get_default_prec();
  1323. #------------------------------------------------------------------------------
  1324. # GMP::Mpf::get_prec
  1325. { my $x = mpf(1.0, 512);
  1326.   ok (get_prec ($x) == 512);
  1327. }
  1328. #------------------------------------------------------------------------------
  1329. # GMP::Mpf::reldiff
  1330. ok (reldiff (2,4) == 1);
  1331. ok (reldiff (4,2) == 0.5);
  1332. #------------------------------------------------------------------------------
  1333. # GMP::Mpf::set_default_prec
  1334. { my $old_prec = get_default_prec();
  1335.   set_default_prec(512);
  1336.   ok (get_default_prec () == 512);
  1337.   set_default_prec($old_prec);
  1338. }
  1339. #------------------------------------------------------------------------------
  1340. # GMP::Mpf::set_prec
  1341. { my $x = mpf(1.0, 512);
  1342.   my $y = $x;
  1343.   set_prec ($x, 1024);
  1344.   ok (get_prec ($x) == 1024);
  1345.   ok (get_prec ($y) == 512);
  1346. }
  1347. #------------------------------------------------------------------------------
  1348. # GMP::Mpf::trunc
  1349. ok (trunc(mpf(-7.5)) == -7.0);
  1350. ok (trunc(mpf(7.5)) == 7.0);
  1351. #------------------------------------------------------------------------------
  1352. # GMP::Rand
  1353. #------------------------------------------------------------------------------
  1354. # GMP::Rand::new
  1355. { my $r = randstate();                          ok (defined $r); }
  1356. { my $r = randstate('lc_2exp', 1, 2, 3);        ok (defined $r); }
  1357. { my $r = randstate('lc_2exp_size', 64);        ok (defined $r); }
  1358. { my $r = randstate('lc_2exp_size', 999999999); ok (! defined $r); }
  1359. { my $r = randstate('mt');                      ok (defined $r); }
  1360. { # copying a randstate results in same sequence
  1361.   my $r1 = randstate('lc_2exp_size', 64);
  1362.   $r1->seed(123);
  1363.   my $r2 = randstate($r1);
  1364.   for (1 .. 20) {
  1365.     my $z1 = mpz_urandomb($r1, 20);
  1366.     my $z2 = mpz_urandomb($r2, 20);
  1367.     ok ($z1 == $z2);
  1368.   }
  1369. }
  1370. #------------------------------------------------------------------------------
  1371. # GMP::Rand::seed
  1372. { my $r = randstate();
  1373.   $r->seed(123);
  1374.   $r->seed(time());
  1375. }
  1376. #------------------------------------------------------------------------------
  1377. # GMP::Rand::mpf_urandomb
  1378. { my $r = randstate();
  1379.   my $f = mpf_urandomb($r,1024);
  1380.   ok (UNIVERSAL::isa($f,"GMP::Mpf")); }
  1381. #------------------------------------------------------------------------------
  1382. # GMP::Rand::mpz_urandomb
  1383. { my $r = randstate();
  1384.   my $z = mpz_urandomb($r, 1024);
  1385.   ok (UNIVERSAL::isa($z,"GMP::Mpz")); }
  1386. #------------------------------------------------------------------------------
  1387. # GMP::Rand::mpz_rrandomb
  1388. { my $r = randstate();
  1389.   my $z = mpz_rrandomb($r, 1024);
  1390.   ok (UNIVERSAL::isa($z,"GMP::Mpz")); }
  1391. #------------------------------------------------------------------------------
  1392. # GMP::Rand::mpz_urandomm
  1393. { my $r = randstate();
  1394.   my $z = mpz_urandomm($r, mpz(3)**100);
  1395.   ok (UNIVERSAL::isa($z,"GMP::Mpz")); }
  1396. #------------------------------------------------------------------------------
  1397. # GMP::Rand::mpz_urandomb_ui
  1398. { my $r = randstate();
  1399.   foreach (1 .. 20) {
  1400.     my $u = gmp_urandomb_ui($r,8);
  1401.     ok ($u >= 0);
  1402.     ok ($u < 256);
  1403.   }
  1404. }
  1405. #------------------------------------------------------------------------------
  1406. # GMP::Rand::mpz_urandomm_ui
  1407. { my $r = randstate();
  1408.   foreach (1 .. 20) {
  1409.     my $u = gmp_urandomm_ui($r,8);
  1410.     ok ($u >= 0);
  1411.     ok ($u < 8);
  1412.   }
  1413. }
  1414. #------------------------------------------------------------------------------
  1415. # GMP module
  1416. #------------------------------------------------------------------------------
  1417. # GMP::fits_slong_p
  1418. ok (GMP::fits_slong_p(0));
  1419. # in perl 5.005 uv_max is only 32-bits on a 64-bit system, so won't exceed a
  1420. # long
  1421. # ok (! GMP::fits_slong_p($uv_max));
  1422. ok (GMP::fits_slong_p(0.0));
  1423. ok (GMP::fits_slong_p('0'));
  1424. ok (GMP::fits_slong_p(substr('999999999999999999999999999999',1,1)));
  1425. ok (! mpz("-9999999999999999999999999999999999999999999")->fits_slong_p());
  1426. ok (  mpz(-123)->fits_slong_p());
  1427. ok (  mpz(0)->fits_slong_p());
  1428. ok (  mpz(123)->fits_slong_p());
  1429. ok (! mpz("9999999999999999999999999999999999999999999")->fits_slong_p());
  1430. ok (! mpq("-9999999999999999999999999999999999999999999")->fits_slong_p());
  1431. ok (  mpq(-123)->fits_slong_p());
  1432. ok (  mpq(0)->fits_slong_p());
  1433. ok (  mpq(123)->fits_slong_p());
  1434. ok (! mpq("9999999999999999999999999999999999999999999")->fits_slong_p());
  1435. ok (! mpf("-9999999999999999999999999999999999999999999")->fits_slong_p());
  1436. ok (  mpf(-123)->fits_slong_p());
  1437. ok (  mpf(0)->fits_slong_p());
  1438. ok (  mpf(123)->fits_slong_p());
  1439. ok (! mpf("9999999999999999999999999999999999999999999")->fits_slong_p());
  1440. #------------------------------------------------------------------------------
  1441. # GMP::get_d
  1442. ok (GMP::get_d(123) == 123.0);
  1443. ok (GMP::get_d($uv_max) > 0);
  1444. ok (GMP::get_d(123.0) == 123.0);
  1445. ok (GMP::get_d('123') == 123.0);
  1446. ok (GMP::get_d(mpz(123)) == 123.0);
  1447. ok (GMP::get_d(mpq(123)) == 123.0);
  1448. ok (GMP::get_d(mpf(123)) == 123.0);
  1449. #------------------------------------------------------------------------------
  1450. # GMP::get_d_2exp
  1451. { my ($dbl, $exp) = get_d_2exp (0);
  1452.   ok ($dbl == 0); ok ($exp == 0); }
  1453. { my ($dbl, $exp) = get_d_2exp (1);
  1454.   ok ($dbl == 0.5); ok ($exp == 1); }
  1455. { my ($dbl, $exp) = get_d_2exp ($uv_max);
  1456.   ok ($dbl > 0.0); ok ($exp > 0); }
  1457. { my ($dbl, $exp) = get_d_2exp (0.5);
  1458.   ok ($dbl == 0.5); ok ($exp == 0); }
  1459. { my ($dbl, $exp) = get_d_2exp (0.25);
  1460.   ok ($dbl == 0.5); ok ($exp == -1); }
  1461. { my ($dbl, $exp) = get_d_2exp ("1.0");
  1462.   ok ($dbl == 0.5); ok ($exp == 1); }
  1463. { my ($dbl, $exp) = get_d_2exp (mpz ("256"));
  1464.   ok ($dbl == 0.5); ok ($exp == 9); }
  1465. { my ($dbl, $exp) = get_d_2exp (mpq ("1/16"));
  1466.   ok ($dbl == 0.5); ok ($exp == -3); }
  1467. { my ($dbl, $exp) = get_d_2exp (mpf ("1.5"));
  1468.   ok ($dbl == 0.75); ok ($exp == 1); }
  1469. { my ($dbl, $exp) = get_d_2exp (mpf ("3.0"));
  1470.   ok ($dbl == 0.75); ok ($exp == 2); }
  1471. #------------------------------------------------------------------------------
  1472. # GMP::get_str
  1473. ok (get_str(-123) eq '-123');
  1474. ok (get_str('-123') eq '-123');
  1475. ok (get_str(substr('x-123x',1,4)) eq '-123');
  1476. ok (get_str(mpz(-123)) eq '-123');
  1477. ok (get_str(mpq(-123)) eq '-123');
  1478. ok (get_str(-123,10) eq '-123');
  1479. ok (get_str('-123',10) eq '-123');
  1480. ok (get_str(substr('x-123x',1,4),10) eq '-123');
  1481. ok (get_str(mpz(-123),10) eq '-123');
  1482. ok (get_str(mpq(-123),10) eq '-123');
  1483. ok (get_str(-123,16) eq '-7b');
  1484. ok (get_str('-123',16) eq '-7b');
  1485. ok (get_str(substr('x-123x',1,4),16) eq '-7b');
  1486. ok (get_str(mpz(-123),16) eq '-7b');
  1487. ok (get_str(mpq(-123),16) eq '-7b');
  1488. ok (get_str(-123,-16) eq '-7B');
  1489. ok (get_str('-123',-16) eq '-7B');
  1490. ok (get_str(substr('x-123x',1,4),-16) eq '-7B');
  1491. ok (get_str(mpz(-123),-16) eq '-7B');
  1492. ok (get_str(mpq(-123),-16) eq '-7B');
  1493. # is a float in past versions of perl without UV type
  1494. { my ($str, $exp) = get_str($uv_max);
  1495.   ok ($str eq $uv_max_str); }
  1496. ok (get_str(mpq(5/8)) eq "5/8");
  1497. ok (get_str(mpq(-5/8)) eq "-5/8");
  1498. ok (get_str(mpq(255/256),16) eq "ff/100");
  1499. ok (get_str(mpq(255/256),-16) eq "FF/100");
  1500. ok (get_str(mpq(-255/256),16) eq "-ff/100");
  1501. ok (get_str(mpq(-255/256),-16) eq "-FF/100");
  1502. { my ($s,$e) = get_str(1.5, 10);      ok ($s eq '15'); ok ($e == 1); }
  1503. { my ($s,$e) = get_str(mpf(1.5), 10); ok ($s eq '15'); ok ($e == 1); }
  1504. { my ($s,$e) = get_str(-1.5, 10);      ok ($s eq '-15'); ok ($e == 1); }
  1505. { my ($s,$e) = get_str(mpf(-1.5), 10); ok ($s eq '-15'); ok ($e == 1); }
  1506. { my ($s,$e) = get_str(1.5, 16);      ok ($s eq '18'); ok ($e == 1); }
  1507. { my ($s,$e) = get_str(mpf(1.5), 16); ok ($s eq '18'); ok ($e == 1); }
  1508. { my ($s,$e) = get_str(-1.5, 16);      ok ($s eq '-18'); ok ($e == 1); }
  1509. { my ($s,$e) = get_str(mpf(-1.5), 16); ok ($s eq '-18'); ok ($e == 1); }
  1510. { my ($s,$e) = get_str(65536.0, 16);      ok ($s eq '1'); ok ($e == 5); }
  1511. { my ($s,$e) = get_str(mpf(65536.0), 16); ok ($s eq '1'); ok ($e == 5); }
  1512. { my ($s,$e) = get_str(1.625, 16);      ok ($s eq '1a'); ok ($e == 1); }
  1513. { my ($s,$e) = get_str(mpf(1.625), 16); ok ($s eq '1a'); ok ($e == 1); }
  1514. { my ($s,$e) = get_str(1.625, -16);      ok ($s eq '1A'); ok ($e == 1); }
  1515. { my ($s,$e) = get_str(mpf(1.625), -16); ok ($s eq '1A'); ok ($e == 1); }
  1516. { my ($s, $e) = get_str(255.0,16,0);      ok ($s eq "ff"); ok ($e == 2); }
  1517. { my ($s, $e) = get_str(mpf(255.0),16,0); ok ($s eq "ff"); ok ($e == 2); }
  1518. { my ($s, $e) = get_str(255.0,-16,0);      ok ($s eq "FF"); ok ($e == 2); }
  1519. { my ($s, $e) = get_str(mpf(255.0),-16,0); ok ($s eq "FF"); ok ($e == 2); }
  1520. #------------------------------------------------------------------------------
  1521. # GMP::get_si
  1522. ok (GMP::get_si(123) == 123.0);
  1523. # better not assume anything about the relatives sizes of long and UV
  1524. ok (GMP::get_si($uv_max) != 0);
  1525. ok (GMP::get_si(123.0) == 123.0);
  1526. ok (GMP::get_si('123') == 123.0);
  1527. ok (GMP::get_si(mpz(123)) == 123.0);
  1528. ok (GMP::get_si(mpq(123)) == 123.0);
  1529. ok (GMP::get_si(mpf(123)) == 123.0);
  1530. #------------------------------------------------------------------------------
  1531. # GMP::integer_p
  1532. ok (  GMP::integer_p (0));
  1533. ok (  GMP::integer_p (123));
  1534. ok (  GMP::integer_p (-123));
  1535. ok (  GMP::integer_p ($uv_max));
  1536. ok (  GMP::integer_p (0.0));
  1537. ok (  GMP::integer_p (123.0));
  1538. ok (  GMP::integer_p (-123.0));
  1539. ok (! GMP::integer_p (0.5));
  1540. ok (! GMP::integer_p (123.5));
  1541. ok (! GMP::integer_p (-123.5));
  1542. ok (  GMP::integer_p ('0'));
  1543. ok (  GMP::integer_p ('123'));
  1544. ok (  GMP::integer_p ('-123'));
  1545. ok (! GMP::integer_p ('0.5'));
  1546. ok (! GMP::integer_p ('123.5'));
  1547. ok (! GMP::integer_p ('-123.5'));
  1548. ok (! GMP::integer_p ('5/8'));
  1549. ok (  GMP::integer_p (mpz(1)));
  1550. ok (  GMP::integer_p (mpq(1)));
  1551. ok (! GMP::integer_p (mpq(1,2)));
  1552. ok (  GMP::integer_p (mpf(1.0)));
  1553. ok (! GMP::integer_p (mpf(1.5)));
  1554. #------------------------------------------------------------------------------
  1555. # GMP::odd_p
  1556. ok (! odd_p(0));
  1557. ok (  odd_p(1));
  1558. ok (! odd_p(2));
  1559. ok (  odd_p($uv_max));
  1560. ok (  odd_p(mpz(-3)));
  1561. ok (! odd_p(mpz(-2)));
  1562. ok (  odd_p(mpz(-1)));
  1563. ok (! odd_p(mpz(0)));
  1564. ok (  odd_p(mpz(1)));
  1565. ok (! odd_p(mpz(2)));
  1566. ok (  odd_p(mpz(3)));
  1567. #------------------------------------------------------------------------------
  1568. # GMP::printf
  1569. GMP::printf ("hello worldn");
  1570. sub via_printf {
  1571.   my $s;
  1572.   open TEMP, ">test.tmp" or die;
  1573.   GMP::printf TEMP @_;
  1574.   close TEMP or die;
  1575.   open TEMP, "<test.tmp" or die;
  1576.   read (TEMP, $s, 1024);
  1577.   close TEMP or die;
  1578.   unlink 'test.tmp';
  1579.   return $s;
  1580. }
  1581. ok (sprintf ("%d", mpz(123)) eq '123');
  1582. ok (sprintf ("%d %d %d", 456, mpz(123), 789) eq '456 123 789');
  1583. ok (sprintf ("%d", mpq(15,16)) eq '15/16');
  1584. ok (sprintf ("%f", mpf(1.5)) eq '1.500000');
  1585. ok (sprintf ("%.2f", mpf(1.5)) eq '1.50');
  1586. ok (sprintf ("%*d", 6, 123) eq '   123');
  1587. ok (sprintf ("%*d", 6, mpz(123))  eq '   123');
  1588. ok (sprintf ("%*d", 6, mpq(15,16))  eq ' 15/16');
  1589. ok (sprintf ("%x", 123) eq '7b');
  1590. ok (sprintf ("%x", mpz(123))  eq '7b');
  1591. ok (sprintf ("%X", 123) eq '7B');
  1592. ok (sprintf ("%X", mpz(123))  eq '7B');
  1593. ok (sprintf ("%#x", 123) eq '0x7b');
  1594. ok (sprintf ("%#x", mpz(123))  eq '0x7b');
  1595. ok (sprintf ("%#X", 123) eq '0X7B');
  1596. ok (sprintf ("%#X", mpz(123))  eq '0X7B');
  1597. ok (sprintf ("%x", mpq(15,16))  eq 'f/10');
  1598. ok (sprintf ("%X", mpq(15,16))  eq 'F/10');
  1599. ok (sprintf ("%#x", mpq(15,16))  eq '0xf/0x10');
  1600. ok (sprintf ("%#X", mpq(15,16))  eq '0XF/0X10');
  1601. ok (sprintf ("%*.*f", 10, 3, 1.25) eq '     1.250');
  1602. ok (sprintf ("%*.*f", 10, 3, mpf(1.5))   eq '     1.500');
  1603. ok (via_printf ("%d", mpz(123)) eq '123');
  1604. ok (via_printf ("%d %d %d", 456, mpz(123), 789) eq '456 123 789');
  1605. ok (via_printf ("%d", mpq(15,16)) eq '15/16');
  1606. ok (via_printf ("%f", mpf(1.5)) eq '1.500000');
  1607. ok (via_printf ("%.2f", mpf(1.5)) eq '1.50');
  1608. ok (via_printf ("%*d", 6, 123) eq '   123');
  1609. ok (via_printf ("%*d", 6, mpz(123))  eq '   123');
  1610. ok (via_printf ("%*d", 6, mpq(15,16))  eq ' 15/16');
  1611. ok (via_printf ("%x", 123) eq '7b');
  1612. ok (via_printf ("%x", mpz(123))  eq '7b');
  1613. ok (via_printf ("%X", 123) eq '7B');
  1614. ok (via_printf ("%X", mpz(123))  eq '7B');
  1615. ok (via_printf ("%#x", 123) eq '0x7b');
  1616. ok (via_printf ("%#x", mpz(123))  eq '0x7b');
  1617. ok (via_printf ("%#X", 123) eq '0X7B');
  1618. ok (via_printf ("%#X", mpz(123))  eq '0X7B');
  1619. ok (via_printf ("%x", mpq(15,16))  eq 'f/10');
  1620. ok (via_printf ("%X", mpq(15,16))  eq 'F/10');
  1621. ok (via_printf ("%#x", mpq(15,16))  eq '0xf/0x10');
  1622. ok (via_printf ("%#X", mpq(15,16))  eq '0XF/0X10');
  1623. ok (via_printf ("%*.*f", 10, 3, 1.25) eq '     1.250');
  1624. ok (via_printf ("%*.*f", 10, 3, mpf(1.5))   eq '     1.500');
  1625. #------------------------------------------------------------------------------
  1626. # GMP::sgn
  1627. ok (sgn(-123) == -1);
  1628. ok (sgn(0)    == 0);
  1629. ok (sgn(123)  == 1);
  1630. ok (sgn($uv_max) == 1);
  1631. ok (sgn(-123.0) == -1);
  1632. ok (sgn(0.0)    == 0);
  1633. ok (sgn(123.0)  == 1);
  1634. ok (sgn('-123') == -1);
  1635. ok (sgn('0')    == 0);
  1636. ok (sgn('123')  == 1);
  1637. ok (sgn('-123.0') == -1);
  1638. ok (sgn('0.0')    == 0);
  1639. ok (sgn('123.0')  == 1);
  1640. ok (sgn(substr('x-123x',1,4)) == -1);
  1641. ok (sgn(substr('x0x',1,1))    == 0);
  1642. ok (sgn(substr('x123x',1,3))  == 1);
  1643. ok (mpz(-123)->sgn() == -1);
  1644. ok (mpz(0)   ->sgn() == 0);
  1645. ok (mpz(123) ->sgn() == 1);
  1646. ok (mpq(-123)->sgn() == -1);
  1647. ok (mpq(0)   ->sgn() == 0);
  1648. ok (mpq(123) ->sgn() == 1);
  1649. ok (mpf(-123)->sgn() == -1);
  1650. ok (mpf(0)   ->sgn() == 0);
  1651. ok (mpf(123) ->sgn() == 1);
  1652. #------------------------------------------------------------------------------
  1653. # overloaded constants
  1654. if ($] > 5.00503) {
  1655.   if (! do 'test2.pl') {
  1656.     die "Cannot run test2.pln";
  1657.   }
  1658. }
  1659. #------------------------------------------------------------------------------
  1660. # $# stuff
  1661. #
  1662. # For some reason "local $#" doesn't leave $# back at its default undefined
  1663. # state when exiting the block.
  1664. { local $# = 'hi %.0f there';
  1665.   my $f = mpf(123);
  1666.   ok ("$f" eq 'hi 123 there'); }
  1667. # Local variables:
  1668. # perl-indent-level: 2
  1669. # End: