Equal prime and composite sums: Difference between revisions
(→{{header|Wren}}: Added a further series term.) |
|||
Line 117: | Line 117: | ||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
Takes around 2 minutes, which is respectable for Wren, but uses a lot of memory. |
|||
<lang ecmascript>import "./math" for Int |
<lang ecmascript>import "./math" for Int |
||
import "./sort" for Find |
import "./sort" for Find |
||
import "/fmt" for Fmt |
import "/fmt" for Fmt |
||
var limit = 1e8 |
var limit = 4 * 1e8 |
||
var c = Int.primeSieve(limit - 1, false) |
var c = Int.primeSieve(limit - 1, false) |
||
var compSums = [] |
var compSums = [] |
||
Line 137: | Line 137: | ||
} |
} |
||
} |
} |
||
for (i in 0...primeSums.count) { |
for (i in 0...primeSums.count) { |
||
var ix |
var ix |
||
if ((ix = Find.first(compSums, primeSums[i])) >= 0) { |
if ((ix = Find.first(compSums, primeSums[i])) >= 0) { |
||
Fmt.print("$, |
Fmt.print("$,21d - $,12r prime sum, $,12r composite sum", primeSums[i], i+1, ix+1) |
||
} |
} |
||
}</lang> |
}</lang> |
||
Line 146: | Line 147: | ||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
10 - 3rd prime sum, |
10 - 3rd prime sum, 2nd composite sum |
||
1,988 - 33rd prime sum, |
1,988 - 33rd prime sum, 51st composite sum |
||
14,697 - 80th prime sum, |
14,697 - 80th prime sum, 147th composite sum |
||
83,292 - 175th prime sum, |
83,292 - 175th prime sum, 361st composite sum |
||
1,503,397 - 660th prime sum, |
1,503,397 - 660th prime sum, 1,582nd composite sum |
||
18,859,052 - 2,143rd prime sum, |
18,859,052 - 2,143rd prime sum, 5,699th composite sum |
||
93,952,013 - 4,556th prime sum, |
93,952,013 - 4,556th prime sum, 12,821st composite sum |
||
89,171,409,882 - 118,785th prime sum, |
89,171,409,882 - 118,785th prime sum, 403,341st composite sum |
||
9,646,383,703,961 - 1,131,142nd prime 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, |
209,456,854,921,713 - 5,012,372nd prime sum, 19,786,181st composite sum |
||
3,950,430,820,867,201 - 20,840,220th prime sum, 86,192,660th composite sum |
|||
</pre> |
</pre> |
Revision as of 10:29, 1 March 2022
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
Phix
with javascript_semantics atom t0 = time() atom ps = 2, -- current prime sum cs = 4 -- current composite sum integer psn = 1, npi = 1, -- (see below) csn = 1, nci = 3, nc = 4, ncp = 5, found = 0 while found<iff(platform()=JS?10:11) do integer c = compare(ps,cs)+3 -- {-1,0,+1} --> {2,3,4}, -- so odd() means equal(), -- else bit2 ==> inc(ps), -- and bit4 ==> inc(cs). if odd(c) then printf(1,"%,21d - %,10d%s prime sum, %,10d%s composite sum (%s)\n", {ps, psn, ord(psn), csn, ord(csn), elapsed(time()-t0)}) found += 1 c = 6 -- do both, ie inc(ps) and inc(cs) end if if and_bits(c,2) then psn += 1 -- prime sum number npi += 1 -- next prime index ps += get_prime(npi) end if if and_bits(c,4) then csn += 1 -- composite sum number nc += 1 -- next composite? if nc=ncp then -- "", erm no nci += 1 -- next prime index ncp = get_prime(nci) nc += 1 -- next composite (even!) end if cs += nc end if end while
- Output:
10 - 3rd prime sum, 2nd composite sum (0s) 1,988 - 33rd prime sum, 51st composite sum (0.2s) 14,697 - 80th prime sum, 147th composite sum (0.2s) 83,292 - 175th prime sum, 361st composite sum (0.2s) 1,503,397 - 660th prime sum, 1,582nd composite sum (0.2s) 18,859,052 - 2,143rd prime sum, 5,699th composite sum (0.2s) 93,952,013 - 4,556th prime sum, 12,821st composite sum (0.2s) 89,171,409,882 - 118,785th prime sum, 403,341st composite sum (0.4s) 9,646,383,703,961 - 1,131,142nd prime sum, 4,229,425th composite sum (1.7s) 209,456,854,921,713 - 5,012,372nd prime sum, 19,786,181st composite sum (6.9s) 3,950,430,820,867,201 - 20,840,220th prime sum, 86,192,660th composite sum (29.4s)
The next value in the series is beyond an 80 bit float, and I suspect this is one of those sort of tasks where gmp, or perhaps I should rather say over a billion invocations of the Phix interface to it, might not shine quite so brightly.
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
Takes around 2 minutes, which is respectable for Wren, but uses a lot of memory. <lang ecmascript>import "./math" for Int import "./sort" for Find import "/fmt" for Fmt
var limit = 4 * 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("$,21d - $,12r prime sum, $,12r 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 3,950,430,820,867,201 - 20,840,220th prime sum, 86,192,660th composite sum