642 Sum of largest prime factors.pl 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 20 July 2020
  4. # https://github.com/trizen
  5. # Sum of largest prime factors
  6. # https://projecteuler.net/problem=642
  7. # Let G(n,p) be the number of integers k in 1..n such that gpf(k) = p.
  8. # Equivalently, G(n,p) is the number of p-smooth numbers <= floor(n/p).
  9. # Then we have:
  10. # S(n) = Sum_{k=2..n} gpf(k)
  11. # S(n) = A(n) + B(n)
  12. # where:
  13. # A(n) = Sum_{p <= sqrt(n)} p * G(n,p)
  14. # B(n) = Sum_{k=1..sqrt(n)} W(floor(n/k)) - floor(sqrt(n))*W(floor(sqrt(n)))
  15. # where:
  16. # W(n) = Sum_{p <= n} p.
  17. # Runtime: 1 min, 36 sec
  18. use 5.020;
  19. use integer;
  20. use ntheory qw(:all);
  21. use experimental qw(signatures);
  22. my $MOD = 1e9;
  23. sub S($n) {
  24. my $t = 0;
  25. my $s = sqrtint($n);
  26. forprimes {
  27. $t = addint($t, mulint($_, smooth_count($n/$_, $_)));
  28. } $s;
  29. for (my $p = next_prime($s); $p <= $n; $p = next_prime($p)) {
  30. my $u = $n/$p;
  31. my $r = $n/$u;
  32. $t = addint($t, mulint($u, sum_primes($p, $r)));
  33. $p = $r;
  34. }
  35. return $t;
  36. }
  37. sub S_mod($n) {
  38. my $t = 0;
  39. my $s = sqrtint($n);
  40. forprimes {
  41. $t += mulmod($_, smooth_count($n/$_, $_), $MOD);
  42. } $s;
  43. for (my $p = next_prime($s); $p <= $n; $p = next_prime($p)) {
  44. my $u = $n/$p;
  45. my $r = $n/$u;
  46. $t += mulmod($u, sum_primes($p, $r), $MOD);
  47. $p = $r;
  48. }
  49. $t % $MOD;
  50. }
  51. say S_mod(201820182018);
  52. __END__
  53. S(10^1) = 32
  54. S(10^2) = 1915
  55. S(10^3) = 135946
  56. S(10^4) = 10118280
  57. S(10^5) = 793111753
  58. S(10^6) = 64937323262
  59. S(10^7) = 5494366736156
  60. S(10^8) = 476001412898167
  61. S(10^9) = 41985754895017934
  62. S(10^10) = 3755757137823525252
  63. S(10^11) = 339760245382396733607