aboutsummaryrefslogtreecommitdiff
path: root/challenge-246
diff options
context:
space:
mode:
authorLuis Mochan <mochan@fis.unam.mx>2023-12-08 10:30:10 -0600
committerLuis Mochan <mochan@fis.unam.mx>2023-12-08 10:30:10 -0600
commit589d9be95be8ee726b3aaf6e8b6215f8bf10fecf (patch)
treee6fcbebd8456a5238b7f1a5853a8e025a830508a /challenge-246
parent2557822359d7d64adbba70616fcd2351bd1d7302 (diff)
downloadperlweeklychallenge-club-589d9be95be8ee726b3aaf6e8b6215f8bf10fecf.tar.gz
perlweeklychallenge-club-589d9be95be8ee726b3aaf6e8b6215f8bf10fecf.tar.bz2
perlweeklychallenge-club-589d9be95be8ee726b3aaf6e8b6215f8bf10fecf.zip
Add third simpler solution
Diffstat (limited to 'challenge-246')
-rwxr-xr-xchallenge-246/wlmb/perl/ch-2b.pl1
-rwxr-xr-xchallenge-246/wlmb/perl/ch-2c.pl35
2 files changed, 36 insertions, 0 deletions
diff --git a/challenge-246/wlmb/perl/ch-2b.pl b/challenge-246/wlmb/perl/ch-2b.pl
index ff706f1a4a..9c0b201f02 100755
--- a/challenge-246/wlmb/perl/ch-2b.pl
+++ b/challenge-246/wlmb/perl/ch-2b.pl
@@ -1,6 +1,7 @@
#!/usr/bin/env perl
# Perl weekly challenge 246
# Task 2: Linear Recurrence of Second Order
+# Second alternative: using SVD
#
# See https://wlmb.github.io/2023/12/03/PWC246/#task-2-linear-recurrence-of-second-order
use v5.36;
diff --git a/challenge-246/wlmb/perl/ch-2c.pl b/challenge-246/wlmb/perl/ch-2c.pl
new file mode 100755
index 0000000000..7739ebbbd5
--- /dev/null
+++ b/challenge-246/wlmb/perl/ch-2c.pl
@@ -0,0 +1,35 @@
+#!/usr/bin/env perl
+# Perl weekly challenge 246
+# Task 2: Linear Recurrence of Second Order
+# Third alternative: going back to integer math
+#
+# See https://wlmb.github.io/2023/12/03/PWC246/#task-2-linear-recurrence-of-second-order
+use v5.36;
+use List::Util qw(all);
+die <<~"FIN" unless @ARGV>=4;
+ Usage: $0 N0 N1 N2 N3 [N4...]
+ to check if the sequence of integers Ni obeys a linear second order recurrence with
+ integer coefficients
+ FIN
+die "Arguments must be integer" unless all {/^[+-]?\d+$/} @ARGV;
+my @x =@ARGV;
+my ($p, $q);
+my $result;
+if($x[0]==$x[1]==0){
+ ($p,$q)=(0,0);
+ $result=1;
+}elsif($x[0]*$x[2]==$x[1]**2){
+ # other singular matrix
+ ($p,$q)=(0,$x[1]/$x[0]);
+ $result = $x[1]%$x[0]==0;
+}else{
+ my $num_p = $x[2]**2-$x[3]*$x[1];
+ my $num_q = $x[0]*$x[3]-$x[1]*$x[2];
+ my $den = $x[0]*$x[2]-$x[1]**2;
+ $result = $num_p%$den==0 && $num_q%$den==0; # coefficients are integer
+ $p=$num_p/$den;
+ $q=$num_q/$den;
+}
+$result &&= $x[$_]==$p*$x[$_-2]+$q*$x[$_-1] for (2..@x-1);
+$result = $result?"True":"False";
+say "@x => $result"