roots_on_the_rise.pl 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 21 February 2018
  4. # https://github.com/trizen
  5. # Solutions to x for:
  6. # 1/x = (k/x)^2 * (k + x^2) - k*x
  7. # See also:
  8. # https://projecteuler.net/problem=479
  9. use 5.020;
  10. use strict;
  11. use warnings;
  12. use experimental qw(signatures);
  13. use Math::AnyNum qw(:overload);
  14. #use Math::GComplex qw(:overload);
  15. sub roots ($k) {
  16. # Formulas from Wolfram|Alpha
  17. # https://www.wolframalpha.com/input/?i=1%2Fx+%3D+(k%2Fx)%5E2+*+(k%2Bx%5E2)++-+k*x
  18. #<<<
  19. my $x1 = (2*$k**6 + 27 * $k**5 - 9*$k**3 + 3 * sqrt(3) * sqrt(4 * $k**11 + 27 * $k**10 -
  20. 18*$k**8 - $k**6 + 4 *$k**3))**(1/3)/(3 * 2**(1/3) * $k) - (2**(1/3) * (3 * $k - $k**4)
  21. )/(3 * (2* $k**6 + 27 * $k**5 - 9 * $k**3 + 3*sqrt(3) * sqrt(4*$k**11 + 27*$k**10 - 18 *
  22. $k**8 - $k**6 + 4 *$k**3))**(1/3) *$k) + $k/3;
  23. my $x2 = -((1 - i * sqrt(3)) * (2 * $k**6 + 27 *$k**5 - 9 * $k**3 + 3 * sqrt(3) * sqrt(4 *
  24. $k**11 + 27* $k**10 - 18* $k**8 - $k**6 + 4 * $k**3))**(1/3))/(6 * 2**(1/3) * $k) +
  25. ((1 + i * sqrt(3)) * (3 * $k - $k**4))/(3 * 2**(2/3) * (2 * $k**6 + 27 * $k**5 - 9 *
  26. $k**3 + 3 * sqrt(3) * sqrt(4 * $k**11 + 27 * $k**10 - 18 * $k**8 - $k**6 + 4 * $k**3)
  27. )**(1/3) * $k) + $k/3;
  28. my $x3 = -((1 + i * sqrt(3)) * (2*$k**6 + 27 * $k**5 - 9 * $k**3 + 3 * sqrt(3) * sqrt(4 *
  29. $k**11 + 27 * $k**10 - 18 * $k**8 - $k**6 + 4 * $k**3))**(1/3))/(6 * 2**(1/3) * $k) +
  30. ((1 - i * sqrt(3)) * (3 * $k - $k**4))/(3 * 2**(2/3) * (2 *$k**6 + 27 * $k**5 - 9 * $k**3 +
  31. 3 * sqrt(3) * sqrt(4 *$k**11 + 27 * $k**10 - 18 *$k**8 - $k**6 + 4 * $k**3))**(1/3) * $k) + $k/3;
  32. #>>>
  33. return ($x1, $x2, $x3);
  34. }
  35. sub S ($n) {
  36. my $sum = 0;
  37. foreach my $k (1 .. $n) {
  38. my ($x1, $x2, $x3) = roots($k);
  39. foreach my $p (1 .. $n) {
  40. my $t = ($x1 + $x2)**$p * ($x2 + $x3)**$p * ($x3 + $x1)**$p;
  41. say "$k -> $t";
  42. $sum += $t;
  43. }
  44. say '';
  45. }
  46. return $sum;
  47. }
  48. sub S_int ($n) {
  49. my $sum = 0;
  50. foreach my $k (1 .. $n - 1) {
  51. my $p = ($k + 1)**2 - 1;
  52. $sum += ($p * ((-1)**$n * $p**$n - 1)) / ($p + 1);
  53. }
  54. return $sum;
  55. }
  56. say S(4);
  57. say S_int(4);