my @tri = (); my %q = (); for ($i = 1; $i <= 51; $i++) { my $m = (($i + 1) / 2); for ($j = 1; $j <= $m; $j ++) { my $v = 1; if ($i != 1) { if ($j == $m) { $v = $tri[$i - 1][$j - 1] * 2; } else { $v = $tri[$i - 1][$j - 1] + $tri[$i - 1][$j]; } } $q{$v} = 1 if ((! $q{$v}) && is_squarefree($v)); $tri[$i][$j] = $v; } print "Line $i\n"; } $sum = 0; foreach $k (sort keys %q) { $sum += $k; print "$k\n"; } print $sum . "\n"; sub is_squarefree { my ($n) = @_; return 1 if ($n < 4); return 0 if ($n % 4 == 0); $toreturn = 1; #print ". $n\n"; for ($p = 3; $p <= sqrt($n); $p += 2) { $toreturn = 0 if (isprime($p) && ($n % ($p ** 2)) == 0); } return $toreturn; } sub isprime { my $num = $_[0]; my $val = 'prime'; if ($num =~ /^\d+$/ && $num >= 2) { my $mod = 2; my $div = int sqrt $num; while ($mod <= $div) { ($num % $mod) == 0 ? ($val = 'composite', last) : $mod++; } } else { $val = 'neither'; } if ($val eq 'prime') { return 1; } else { return 0; } }