overload.t 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!perl -T
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use Test::More;
  6. plan tests => 94;
  7. use Math::GComplex qw(:overload acos cosh pown powmod);
  8. {
  9. my @A097691 = qw(8 56 551 6930 105937 1905632 39424240); # https://oeis.org/A097691
  10. foreach my $n (3 .. 9) {
  11. #<<<
  12. my $y = abs((2**(-$n) * (sqrt(4 - $n**2) + i * $n)**$n - 2**$n * (-sqrt(4 - $n**2) - i * $n)**(-$n)) / sqrt(4 - $n**2));
  13. is(sprintf('%.0f', $y), shift(@A097691), "a($n) = $y");
  14. #>>>
  15. }
  16. }
  17. {
  18. my @A105309 = qw(1 1 2 5 9 20 41 85 178 369 769); # https://oeis.org/A105309
  19. foreach my $n (0 .. $#A105309) {
  20. #<<<
  21. my $y = abs((((sqrt(4 * i - 1) + i)**($n + 1) - (i - sqrt(4 * i - 1))**($n + 1)) / 2**($n + 1) / sqrt(4 * i - 1))**2);
  22. is(sprintf('%.0f', $y), shift(@A105309), "a($n) = $y");
  23. #>>>
  24. }
  25. }
  26. {
  27. my @A001541 = qw(1 3 17 99 577 3363 19601 114243 665857); # https://oeis.org/A001541
  28. foreach my $n (0 .. $#A001541) {
  29. my $t = shift(@A001541);
  30. my $x = cos($n * acos(3));
  31. my $y = cosh($n * log(3 + 2 * sqrt(2)));
  32. is(sprintf('%.0f', abs($x)), $t, "a($n) = $x");
  33. is(sprintf('%.0f', abs($y)), $t, "a($n) = $y");
  34. }
  35. }
  36. {
  37. # Each component of a complex number is another complex number (with imaginary part = 0)
  38. my $x = Math::GComplex->new(-3, -4);
  39. my $y = Math::GComplex->new(-7, -5);
  40. my $z = atan2($x, $y);
  41. is(ref($z->real), 'Math::GComplex');
  42. is(ref($z->imag), 'Math::GComplex');
  43. like($z->real->real, qr/^-2\.6255065752\d*\z/);
  44. like($z->imag->real, qr/^0\.13446357403\d*\z/);
  45. ok(abs($z->real->imag - 0) <= 1e-10);
  46. ok(abs($z->imag->imag - 0) <= 1e-10);
  47. my $z2 = atan2(-3 - 4 * i, -7 - 5 * i);
  48. like($z2->real, qr/^-2\.6255065752\d*\z/);
  49. like($z2->imag, qr/^0\.13446357403\d*\z/);
  50. }
  51. {
  52. my @A281964 = qw(1 2 4 16 104 624 3648 29184);
  53. my @A282132 = qw(0 1 3 6 30 300 2100 11760);
  54. my $sum = 0;
  55. my $fact = 1;
  56. foreach my $k (1 .. scalar(@A281964)) {
  57. $fact *= $k;
  58. $sum += i->pown($k - 1) / $k;
  59. my $t = $sum * $fact;
  60. is($t->real, shift(@A281964));
  61. is($t->imag, shift(@A282132));
  62. }
  63. }
  64. {
  65. is(pown(0, 0), 1);
  66. is(pown(0, 3), 0);
  67. is(pown(1, 5), 1);
  68. is(pown(1, -5), 1);
  69. is(pown(2, -5), 0.03125);
  70. my $n = 2 + 3 * i;
  71. is($n->pown('10'), -341525 - 145668 * i);
  72. is($n->pown(10), -341525 - 145668 * i);
  73. is((3 + 4 * i)->pown(7), 76443 + 16124 * i);
  74. is((3 + 4 * i)->pown(8), 164833 + 354144 * i);
  75. }
  76. {
  77. my $z = 13 + 34 * i;
  78. my $t = 24 + 97 * i;
  79. is($z >> 1, 6 + 17 * i);
  80. is($z << 3, 104 + 272 * i);
  81. is($z | $t, 29 + 99 * i);
  82. is($z & $t, 8 + 32 * i);
  83. is($z ^ $t, 21 + 67 * i);
  84. }
  85. {
  86. is(join(' ', powmod(2 + i, 100, 1234567)->reals), '498832 667730');
  87. is(join(' ', powmod(-2 -i, 99, 1234567)->reals), '160748 820328');
  88. is(join(' ', powmod(2 -i, 99, 1234567)->reals), '1073819 820328');
  89. is(join(' ', powmod(-2 + i, 99, 1234567)->reals), '160748 414239');
  90. is(powmod(2, 96, 97), 1);
  91. is(powmod(2, 43, 43), 2);
  92. is(powmod(i, 43, 43), 0 + 42 * i);
  93. is(powmod(i, 42, 43), 42);
  94. is(powmod(1 -i, 43 - 1, 43), i);
  95. is(powmod(1 -i, 43 - 1, 43 + 3 * i), 36 + 14 * i);
  96. is(powmod(2 + i, 43, 43 + 3 * i), 39 + 44 * i);
  97. }
  98. is(join(' ', Math::GComplex::invmod(42, 2017)->reals), '1969 0');
  99. is(join(' ', Math::GComplex::invmod(3 + 4 * i, 2017)->reals), '1291 968');
  100. is(join(' ', Math::GComplex::invmod(91 + 23 * i, 2017)->reals), '590 405');
  101. is(join(' ', Math::GComplex::invmod(43 + 99 * i, 1234567)->reals), '1019551 667302');
  102. is(join(' ', Math::GComplex::invmod(43 + 415 * i, 103)->reals), '88 25');
  103. is(join(' ', Math::GComplex::gcd(135 - 14 * i, 155 + 34 * i)->reals), '5 12');
  104. is(join(' ', Math::GComplex::gcd(155 + 34 * i, 135 - 14 * i)->reals), '5 12');
  105. {
  106. my $m = 2019;
  107. my $x = 3 + 4 * i;
  108. my $x1 = Math::GComplex::powmod($x, -42, $m);
  109. my $x2 = Math::GComplex::powmod($x, 42, $m);
  110. is(join(' ', $x1->reals), '1520 1407');
  111. is(join(' ', $x2->reals), '305 1212');
  112. }