diff options
| author | E7-87-83 <fungcheokyin@gmail.com> | 2022-04-08 21:49:27 +0800 |
|---|---|---|
| committer | E7-87-83 <fungcheokyin@gmail.com> | 2022-04-08 21:49:27 +0800 |
| commit | 833c4230b4de27adc528ec7b30cc74c318d74cec (patch) | |
| tree | f2125d18fc3e228164321429dd73f5732d745ece | |
| parent | 28e89e8ad9b1250176d0700b3a4602ea8f162fce (diff) | |
| download | perlweeklychallenge-club-833c4230b4de27adc528ec7b30cc74c318d74cec.tar.gz perlweeklychallenge-club-833c4230b4de27adc528ec7b30cc74c318d74cec.tar.bz2 perlweeklychallenge-club-833c4230b4de27adc528ec7b30cc74c318d74cec.zip | |
Task 2 Perl commit
| -rw-r--r-- | challenge-159/perl/ch-2.pl | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/challenge-159/perl/ch-2.pl b/challenge-159/perl/ch-2.pl new file mode 100644 index 0000000000..8efb6f5c41 --- /dev/null +++ b/challenge-159/perl/ch-2.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl +# The Weekly Challenge 159 +# Task 2 Moebius Function +# Usage: ch-2.pl $N +use v5.22.0; +use warnings; +use Math::Complex; +use List::Util qw/any/; +use POSIX; + +use constant PI => 2*acos(0); + + +if (defined($ARGV[0])) { + my $N = $ARGV[0]; + say "mu($N) = ", mo($N); +} + + +sub irn { + my $i = $_[0]; + my $n = $_[1]; + return Math::Complex->make( + cos 2*PI*$i/$n, sin 2*PI*$i/$n + ); +} + +sub mo { + my $n = $_[0]; + return 1 if $n == 1; + return -1 if $n == 2; + my $sum = irn(1, $n); + for my $i (2..$n-1) { + next if any { ($i*$_) % $n == 0} (2..$n-1); + $sum += irn($i, $n); + } + # say "# intermediate sum: ", Re($sum), "\n\n"; + return floor(Re($sum)+0.5); +} + +use Test::More tests => 18; +ok mo(2) == -1, "test for 2"; +ok mo(5) == -1, "Example 1"; +ok mo(10) == 1, "Example 2"; +ok mo(20) == 0, "Example 3"; +ok mo(22) == 1, "test for 22"; +ok mo(41) == -1, "test for 41"; +ok mo(42) == -1, "test for 42"; +ok mo(43) == -1, "test for 43"; +ok mo(44) == 0, "test for 44"; +ok mo(45) == 0, "test for 44"; +ok mo(46) == 1, "test for 46"; +ok mo(47) == -1, "test for 47"; +ok mo(48) == 0, "test for 48"; +ok mo(49) == 0, "test for 49"; +ok mo(50) == 0, "test for 50"; +ok mo(3276) == 0, "test for 3276"; +ok mo(3277) == 1, "test for 3277"; +ok mo(3278) == -1, "test for 3278"; |
