binary_prime_encoder_fast.pl 1010 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 22 September 2016
  5. # https://github.com/trizen
  6. # Encode the first n prime numbers into a large integer.
  7. # See also:
  8. # https://oeis.org/A135482
  9. use 5.010;
  10. use strict;
  11. use warnings;
  12. use Math::AnyNum qw(:overload);
  13. use ntheory qw(nth_prime valuation);
  14. sub encode_primes {
  15. my ($n) = @_;
  16. my $sum = 0;
  17. foreach my $i (1 .. $n) {
  18. $sum |= 1 << nth_prime($i);
  19. }
  20. $sum >> 2;
  21. }
  22. sub decode_primes {
  23. my ($n) = @_;
  24. my $p = 2;
  25. my @primes;
  26. while ($n) {
  27. if ($n & 1) {
  28. push @primes, $p;
  29. }
  30. my $v = valuation($n, 2) || 1;
  31. $n >>= $v;
  32. $p += $v;
  33. }
  34. @primes;
  35. }
  36. say "Encoded first 25 primes: ", encode_primes(25);
  37. say "Decoded first 25 primes: ", join(' ', decode_primes(encode_primes(25)));
  38. __END__
  39. Encoded first 25 primes: 39771395718504928067455191595
  40. Decoded first 25 primes: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97