factors_of_a_mersenne.t 826 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!perl -T
  2. use utf8;
  3. use 5.006;
  4. use strict;
  5. use warnings;
  6. use Test::More;
  7. plan tests => 1;
  8. use Sidef;
  9. my $code = <<'EOT';
  10. func mtest(b, p) {
  11. var bits = b.base(2).digits
  12. for (var sq = 1; bits; sq %= p) {
  13. sq *= sq;
  14. sq += sq if bits.shift==1
  15. }
  16. sq == 1
  17. }
  18. var results = []
  19. for m in (2..53 -> lazy.grep{.is_prime}) {
  20. var f = 0
  21. var x = (2**m - 1)
  22. var q
  23. { |k|
  24. q = (2*k*m + 1)
  25. q%8 ~~ [1,7] || q.is_prime || next
  26. q*q > x || (f = mtest(m, q)) && break
  27. } << 1..Inf
  28. results << (f ? "#{m}:#{q}" : "#{m}:p")
  29. }
  30. results.join(' ')
  31. EOT
  32. my $sidef = Sidef->new(name => 'factors_of_mersenne_numbers');
  33. my $result = $sidef->execute_code($code);
  34. is("$result", '2:p 3:p 5:p 7:p 11:23 13:p 17:p 19:p 23:47 29:233 31:p 37:223 41:13367 43:431 47:2351 53:6361');