tribonacci.pl 940 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/usr/bin/perl
  2. # Formula from:
  3. # http://www.wolframalpha.com/input/?i=a(0)+%3D+0,a(1)%3D0,+a(2)%3D1,+a(n)+%3D+a(n-1)+%2B+a(n-2)+%2B+a(n-3)
  4. use 5.014;
  5. use warnings;
  6. use lib qw(../lib);
  7. use Math::AnyNum qw(:overload);
  8. sub tribonacci {
  9. my ($n) = @_;
  10. my $m = 1 / 3;
  11. my $p = 2 / 3;
  12. my $a = (99 + 19 * sqrt(33));
  13. my $b = (19 + 3 * sqrt(33))**$m;
  14. my $c = (19 - 3 * sqrt(33))**$m;
  15. my $d = (4 * 33**$p);
  16. my $e = (33 * $a)**$m;
  17. my $f = $a**$m;
  18. my $g = (1 / 6) * $c;
  19. my $h = (1 / 6) * $b;
  20. my $j = i * sqrt(3);
  21. my $k = (1 - $j);
  22. my $l = (1 + $j);
  23. #<<<
  24. (($k / $e - $l * $f / $d) * ($m - $g * $k - $h * $l)**$n)
  25. + (($l / $e - $k * $f / $d) * ($m - $g * $l - $h * $k)**$n)
  26. + (($f / (2 * 33**$p) - 2 / (33 * $a)**$m) * (3 / (1 + $b + $c))**(-$n));
  27. #>>>
  28. }
  29. foreach my $n (2 .. 20) {
  30. say tribonacci($n);
  31. }
  32. say "Tribonacci constant: ", tribonacci(1e3 + 1) / tribonacci(1e3);