klein_J_invariant_and_modular_lambda.pl 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 03 October 2017
  4. # https://github.com/trizen
  5. # Implementation of the `modular_lambda(x)` and `klein_invariant_j(x)` functions.
  6. # See also:
  7. # https://oeis.org/A115977
  8. # https://en.wikipedia.org/wiki/J-invariant
  9. # https://en.wikipedia.org/wiki/Modular_lambda_function
  10. use 5.014;
  11. use warnings;
  12. use Math::AnyNum qw(:overload pi);
  13. my @A115977 = map { Math::AnyNum->new((split(' '))[-1]) } <DATA>;
  14. sub modular_lambda {
  15. my ($x) = @_;
  16. my $sum = 0;
  17. my $prev = 0;
  18. my $q = exp(pi * i * $x);
  19. $q = $q->real if $q->is_real;
  20. foreach my $i (0 .. $#A115977) {
  21. $sum += $A115977[$i] * $q**($i + 1);
  22. $sum->approx_cmp($prev) || last;
  23. $prev = $sum;
  24. }
  25. return $sum;
  26. }
  27. sub klein_invariant_j {
  28. my ($x) = @_;
  29. #<<<
  30. ( 4 * (1 - modular_lambda($x) + modular_lambda($x)**2)**3) /
  31. (27 * (1 - modular_lambda($x))**2 * modular_lambda($x)**2);
  32. #>>>
  33. }
  34. say klein_invariant_j(2 * i); # (11/2)^3
  35. say klein_invariant_j(sqrt(-2))->round(-40); # (5/3)^3
  36. say klein_invariant_j((1 + sqrt(-163)) / 2)->round(-40); # -53360^3
  37. __END__
  38. 1 16
  39. 2 -128
  40. 3 704
  41. 4 -3072
  42. 5 11488
  43. 6 -38400
  44. 7 117632
  45. 8 -335872
  46. 9 904784
  47. 10 -2320128
  48. 11 5702208
  49. 12 -13504512
  50. 13 30952544
  51. 14 -68901888
  52. 15 149403264
  53. 16 -316342272
  54. 17 655445792
  55. 18 -1331327616
  56. 19 2655115712
  57. 20 -5206288384
  58. 21 10049485312
  59. 22 -19115905536
  60. 23 35867019904
  61. 24 -66437873664
  62. 25 121587699568
  63. 26 -219997823744
  64. 27 393799671680
  65. 28 -697765502976
  66. 29 1224470430560
  67. 30 -2129120769024
  68. 31 3669925002752
  69. 32 -6273295187968
  70. 33 10638472274688
  71. 34 -17904375855360
  72. 35 29914108051712
  73. 36 -49631878364160
  74. 37 81796581923552
  75. 38 -133940954877440
  76. 39 217972711694464
  77. 40 -352615521042432
  78. 41 567159563764128
  79. 42 -907197891465216
  80. 43 1443361173729344
  81. 44 -2284561115754496
  82. 45 3597986508088416
  83. 46 -5639173569598464
  84. 47 8797049785486592
  85. 48 -13661151873466368
  86. 49 21121565013141648
  87. 50 -32516981110373248
  88. 51 49853282901399936
  89. 52 -76125157989107712
  90. 53 115787750395675104
  91. 54 -175446129968544768
  92. 55 264860028797210496
  93. 56 -398403552976764928
  94. 57 597179610339831040
  95. 58 -892073853566196480
  96. 59 1328153150761957184
  97. 60 -1970983069740490752
  98. 61 2915677205543637344