Equal prime and composite sums
Suppose we have a sequence of prime sums, where each term Pn is the sum of the first n primes.
P = (2), (2 + 3), (2 + 3 + 5), (2 + 3 + 5 + 7), (2 + 3 + 5 + 7 + 11), ...
P = 2, 5, 10, 17, 28, etc.
Further; suppose we have a sequence of composite sums, where each term Cm is the sum of the first m composites.
C = (4), (4 + 6), (4 + 6 + 8), (4 + 6 + 8 + 9), (4 + 6 + 8 + 9 + 10), ...
C = 4, 10, 18, 27, 37, etc.
Notice that the third term of P; P3 (10) is equal to the second term of C; C2 (10);
- Task
- Find and display the indices (n, m) and value of at least the first 6 terms of the sequence of numbers that are both the sum of the first n primes and the first m composites.
- See also
Raku
Let it run until I got bored and killed it. Time is total accumulated seconds since program start. <lang perl6>use Lingua::EN::Numbers:ver<2.8.2+>;
my $prime-sum = [\+] (2..*).grep: *.is-prime; my $composite-sum = [\+] (2..*).grep: !*.is-prime;
my $c-index = 0;
for ^∞ -> $p-index {
next if $prime-sum[$p-index] < $composite-sum[$c-index]; printf( "%20s - %11s prime sum, %12s composite sum %5.2f seconds\n", $prime-sum[$p-index].&comma, ordinal-digit($p-index + 1, :u, :c), ordinal-digit($c-index + 1, :u, :c), now - INIT now ) and next if $prime-sum[$p-index] == $composite-sum[$c-index]; ++$c-index; redo;
};</lang>
- Output:
10 - 3ʳᵈ prime sum, 2ⁿᵈ composite sum 0.01 seconds 1,988 - 33ʳᵈ prime sum, 51ˢᵗ composite sum 0.01 seconds 14,697 - 80ᵗʰ prime sum, 147ᵗʰ composite sum 0.02 seconds 83,292 - 175ᵗʰ prime sum, 361ˢᵗ composite sum 0.03 seconds 1,503,397 - 660ᵗʰ prime sum, 1,582ⁿᵈ composite sum 0.04 seconds 18,859,052 - 2,143ʳᵈ prime sum, 5,699ᵗʰ composite sum 0.08 seconds 93,952,013 - 4,556ᵗʰ prime sum, 12,821ˢᵗ composite sum 0.14 seconds 89,171,409,882 - 118,785ᵗʰ prime sum, 403,341ˢᵗ composite sum 4.23 seconds 9,646,383,703,961 - 1,131,142ⁿᵈ prime sum, 4,229,425ᵗʰ composite sum 76.23 seconds 209,456,854,921,713 - 5,012,372ⁿᵈ prime sum, 19,786,181ˢᵗ composite sum 968.26 seconds ^C
Wren
Runs quite quickly for Wren (30 seconds) but requires a lot of memory. <lang ecmascript>import "./math" for Int import "./sort" for Find import "/fmt" for Fmt
var limit = 1e8 var c = Int.primeSieve(limit - 1, false) var compSums = [] var primeSums = [] var csum = 0 var psum = 0 for (i in 2...limit) {
if (c[i]) { csum = csum + i compSums.add(csum) } else { psum = psum + i primeSums.add(psum) }
} for (i in 0...primeSums.count) {
var ix if ((ix = Find.first(compSums, primeSums[i])) >= 0) { Fmt.print("$,19d - $,11r prime sum, $,13r composite sum", primeSums[i], i+1, ix+1) }
}</lang>
- Output:
10 - 3rd prime sum, 2nd composite sum 1,988 - 33rd prime sum, 51st composite sum 14,697 - 80th prime sum, 147th composite sum 83,292 - 175th prime sum, 361st composite sum 1,503,397 - 660th prime sum, 1,582nd composite sum 18,859,052 - 2,143rd prime sum, 5,699th composite sum 93,952,013 - 4,556th prime sum, 12,821st composite sum 89,171,409,882 - 118,785th prime sum, 403,341st composite sum 9,646,383,703,961 - 1,131,142nd prime sum, 4,229,425th composite sum 209,456,854,921,713 - 5,012,372nd prime sum, 19,786,181st composite sum