Equal prime and composite sums: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Perl}}: wrong limit)
(Realize in F#)
Line 32: Line 32:




=={{header|F_Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_functions Extensible Prime Generator (F#)]
<lang fsharp>
// Equal prime and composite sums. Nigel Galloway: March 3rd., 2022
let fN(g:seq<int64>)=let g=(g|>Seq.scan(fun(_,n,i) g->(g,n+g,i+1))(0,0L,0)|>Seq.skip 1).GetEnumerator() in (fun()->g.MoveNext()|>ignore; g.Current)
let fG n g=let rec fG a b=seq{match a,b with ((_,p,_),(_,c,_)) when p<c->yield! fG(n()) b |((_,p,_),(_,c,_)) when p>c->yield! fG a (g()) |_->yield(a,b); yield! fG(n())(g())} in fG(n())(g())
fG(fN(primes64()))(fN(primes64()|>Seq.pairwise|>Seq.collect(fun(n,g)->[1L+n..g-1L])))|>Seq.take 11|>Seq.iter(fun((n,i,g),(e,_,l))->printfn $"Primes up to %d{n} at position %d{g} and composites up to %d{e} at position %d{l} sum to %d{i}.")
</lang>
{{out}}
<pre>
Primes up to 5 at position 3 and composites up to 6 at position 2 sum to 10.
Primes up to 137 at position 33 and composites up to 72 at position 51 sum to 1988.
Primes up to 409 at position 80 and composites up to 190 at position 147 sum to 14697.
Primes up to 1039 at position 175 and composites up to 448 at position 361 sum to 83292.
Primes up to 4937 at position 660 and composites up to 1868 at position 1582 sum to 1503397.
Primes up to 18787 at position 2143 and composites up to 6544 at position 5699 sum to 18859052.
Primes up to 43753 at position 4556 and composites up to 14522 at position 12821 sum to 93952013.
Primes up to 1565929 at position 118785 and composites up to 440305 at position 403341 sum to 89171409882.
Primes up to 17662763 at position 1131142 and composites up to 4548502 at position 4229425 sum to 9646383703961.
Primes up to 86254457 at position 5012372 and composites up to 21123471 at position 19786181 sum to 209456854921713.
Primes up to 390180569 at position 20840220 and composites up to 91491160 at position 86192660 sum to 3950430820867201.
</pre>
=={{header|Julia}}==
=={{header|Julia}}==
<lang julia>using Primes
<lang julia>using Primes
Line 51: Line 73:
incrementpsum()
incrementpsum()
incrementcsum()
incrementcsum()
end
endrd
end
end
while csum < psum
while csum < psum

Revision as of 14:22, 3 March 2022

Equal prime and composite sums is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

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


F#

This task uses Extensible Prime Generator (F#) <lang fsharp> // Equal prime and composite sums. Nigel Galloway: March 3rd., 2022 let fN(g:seq<int64>)=let g=(g|>Seq.scan(fun(_,n,i) g->(g,n+g,i+1))(0,0L,0)|>Seq.skip 1).GetEnumerator() in (fun()->g.MoveNext()|>ignore; g.Current) let fG n g=let rec fG a b=seq{match a,b with ((_,p,_),(_,c,_)) when p<c->yield! fG(n()) b |((_,p,_),(_,c,_)) when p>c->yield! fG a (g()) |_->yield(a,b); yield! fG(n())(g())} in fG(n())(g()) fG(fN(primes64()))(fN(primes64()|>Seq.pairwise|>Seq.collect(fun(n,g)->[1L+n..g-1L])))|>Seq.take 11|>Seq.iter(fun((n,i,g),(e,_,l))->printfn $"Primes up to %d{n} at position %d{g} and composites up to %d{e} at position %d{l} sum to %d{i}.") </lang>

Output:
Primes up to 5 at position 3 and composites up to 6 at position 2 sum to 10.
Primes up to 137 at position 33 and composites up to 72 at position 51 sum to 1988.
Primes up to 409 at position 80 and composites up to 190 at position 147 sum to 14697.
Primes up to 1039 at position 175 and composites up to 448 at position 361 sum to 83292.
Primes up to 4937 at position 660 and composites up to 1868 at position 1582 sum to 1503397.
Primes up to 18787 at position 2143 and composites up to 6544 at position 5699 sum to 18859052.
Primes up to 43753 at position 4556 and composites up to 14522 at position 12821 sum to 93952013.
Primes up to 1565929 at position 118785 and composites up to 440305 at position 403341 sum to 89171409882.
Primes up to 17662763 at position 1131142 and composites up to 4548502 at position 4229425 sum to 9646383703961.
Primes up to 86254457 at position 5012372 and composites up to 21123471 at position 19786181 sum to 209456854921713.
Primes up to 390180569 at position 20840220 and composites up to 91491160 at position 86192660 sum to 3950430820867201.

Julia

<lang julia>using Primes

function getsequencematches(N, masksize = 1_000_000_000)

   pmask = primesmask(masksize)
   found, psum, csum, pindex, cindex, pcount, ccount = 0, 2, 4, 2, 4, 1, 1
   incrementpsum() = (pindex += 1; if pmask[pindex] psum += pindex; pcount += 1 end)
   incrementcsum() = (cindex += 1; if !pmask[cindex] csum += cindex; ccount += 1 end)
   while found < N
       while psum < csum
           pindex >= masksize && return
           incrementpsum()
       end
       if psum == csum
           println("Primes up to $pindex at position $pcount and composites up to $cindex at position $ccount sum to $psum.")
           found += 1
           while psum == csum
               incrementpsum()
               incrementcsum()
           endrd
       end
       while csum < psum
           incrementcsum()
       end
   end

end

@time getsequencematches(11)

</lang>

Output:
Primes up to 5 at position 3 and composites up to 6 at position 2 sum to 10.
Primes up to 137 at position 33 and composites up to 72 at position 51 sum to 1988.
Primes up to 409 at position 80 and composites up to 190 at position 147 sum to 14697.
Primes up to 1039 at position 175 and composites up to 448 at position 361 sum to 83292.
Primes up to 4937 at position 660 and composites up to 1868 at position 1582 sum to 1503397.
Primes up to 18787 at position 2143 and composites up to 6544 at position 5699 sum to 18859052.
Primes up to 43753 at position 4556 and composites up to 14522 at position 12821 sum to 93952013.
Primes up to 1565929 at position 118785 and composites up to 440305 at position 403341 sum to 89171409882.
Primes up to 17662763 at position 1131142 and composites up to 4548502 at position 4229425 sum to 9646383703961.
Primes up to 86254457 at position 5012372 and composites up to 21123471 at position 19786181 sum to 209456854921713.
Primes up to 390180569 at position 20840220 and composites up to 91491160 at position 86192660 sum to 3950430820867201.
 44.526876 seconds (1.09 G allocations: 16.546 GiB, 3.13% gc time)

Perl

Not especially fast, but minimal memory usage.

Library: ntheory

<lang perl>use strict; use warnings; use feature <say state>; use ntheory <is_prime next_prime>;

sub comma { reverse ((reverse shift) =~ s/(.{3})/$1,/gr) =~ s/^,//r } sub suffix { my($d) = $_[0] =~ /(.)$/; $d == 1 ? 'st' : $d == 2 ? 'nd' : $d == 3 ? 'rd' : 'th' }

sub prime_sum {

   state $s = state $p = 2; state $i = 1;
   if ($i < (my $n = shift) ) { do { $s += $p = next_prime($p) } until ++$i == $n }
   $s

}

sub composite_sum {

   state $s = state $c = 4; state $i = 1;
   if ($i < (my $n = shift) ) { do { 1 until ! is_prime(++$c); $s += $c } until ++$i == $n }
   $s

}

my $ci++; for my $pi (1 .. 5_012_372) {

   next if prime_sum($pi) < composite_sum($ci);
   printf( "%20s - %11s prime sum, %12s composite sum\n",
       comma(prime_sum $pi), comma($pi).suffix($pi), comma($ci).suffix($ci))
       and next if prime_sum($pi) == composite_sum($ci);
   $ci++;
   redo

}</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

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

XPL0

<lang XPL0>func IsPrime(N); \Return 'true' if N is prime int N, I; [if N <= 2 then return N = 2; if (N&1) = 0 then \even >2\ return false; for I:= 3 to sqrt(N) do

   [if rem(N/I) = 0 then return false;
   I:= I+1;
   ];

return true; ];

int Cnt, N, M, SumP, SumC, NumP, NumC; [Cnt:= 0; N:= 1; M:= 1; NumP:= 2; NumC:= 4; SumP:= 2; SumC:= 4; Format(8, 0); Text(0, " sum prime composit "); loop [if SumC > SumP then

           [repeat NumP:= NumP+1 until IsPrime(NumP);
           SumP:= SumP + NumP;
           N:= N+1;
           ];
       if SumP > SumC then
           [repeat NumC:= NumC+1 until not IsPrime(NumC);
           SumC:= SumC + NumC;
           M:= M+1;
           ];
       if SumP = SumC then
           [RlOut(0, float(SumP));
           RlOut(0, float(N));
           RlOut(0, float(M));  CrLf(0);
           Cnt:= Cnt+1;
           if Cnt >= 6 then quit;
           repeat NumC:= NumC+1 until not IsPrime(NumC);
           SumC:= SumC + NumC;
           M:= M+1;
           ];
       ];

]</lang>

Output:
     sum     prime  composit
      10       3       2
    1988      33      51
   14697      80     147
   83292     175     361
 1503397     660    1582
18859052    2143    5699