diff options
| author | Luis Mochan <mochan@fis.unam.mx> | 2023-12-08 10:30:10 -0600 |
|---|---|---|
| committer | Luis Mochan <mochan@fis.unam.mx> | 2023-12-08 10:30:10 -0600 |
| commit | 589d9be95be8ee726b3aaf6e8b6215f8bf10fecf (patch) | |
| tree | e6fcbebd8456a5238b7f1a5853a8e025a830508a /challenge-246 | |
| parent | 2557822359d7d64adbba70616fcd2351bd1d7302 (diff) | |
| download | perlweeklychallenge-club-589d9be95be8ee726b3aaf6e8b6215f8bf10fecf.tar.gz perlweeklychallenge-club-589d9be95be8ee726b3aaf6e8b6215f8bf10fecf.tar.bz2 perlweeklychallenge-club-589d9be95be8ee726b3aaf6e8b6215f8bf10fecf.zip | |
Add third simpler solution
Diffstat (limited to 'challenge-246')
| -rwxr-xr-x | challenge-246/wlmb/perl/ch-2b.pl | 1 | ||||
| -rwxr-xr-x | challenge-246/wlmb/perl/ch-2c.pl | 35 |
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" |
