ramanujan_sum_fast.pl 347 B

1234567891011121314151617181920212223
  1. #!/usr/bin/perl
  2. # Efficient implementation of Ramanujan's sum.
  3. use 5.010;
  4. use strict;
  5. use warnings;
  6. use ntheory qw(gcd euler_phi moebius);
  7. sub ramanujan_sum {
  8. my ($n, $k) = @_;
  9. my $g = $k / gcd($n, $k);
  10. my $m = moebius($g);
  11. $m * euler_phi($k) / euler_phi($g);
  12. }
  13. foreach my $n (1 .. 30) {
  14. say ramanujan_sum($n, $n**2);
  15. }