Goldbach's comet: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added XPL0 example.)
Line 110: Line 110:


'''Stretch goal:''' (offsite SVG image) [https://raw.githubusercontent.com/thundergnat/rc/master/img/Goldbachs-Comet-Raku.svg Goldbachs-Comet-Raku.svg]
'''Stretch goal:''' (offsite SVG image) [https://raw.githubusercontent.com/thundergnat/rc/master/img/Goldbachs-Comet-Raku.svg Goldbachs-Comet-Raku.svg]

=={{header|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 PT(1_000_000);

func G(E); \Ways E can be expressed as sum of two primes
int E, C, I, J, T;
[C:= 0; I:= 0;
loop [J:= I;
if PT(J) + PT(I) > E then return C;
loop [T:= PT(J) + PT(I);
if T = E then C:= C+1;
if T > E then quit;
J:= J+1;
];
I:= I+1;
];
];

int I, N;
[I:= 0; \make prime table
for N:= 2 to 1_000_000 do
if IsPrime(N) then
[PT(I):= N; I:= I+1];
I:= 4; \show first 100 G numbers
Format(4, 0);
for N:= 1 to 100 do
[RlOut(0, float(G(I)));
if rem(N/10) = 0 then CrLf(0);
I:= I+2;
];
CrLf(0);
Text(0, "G(1,000,000) = "); IntOut(0, G(1_000_000));
CrLf(0);
]</lang>

{{out}}
<pre>
1 1 1 2 1 2 2 2 2 3
3 3 2 3 2 4 4 2 3 4
3 4 5 4 3 5 3 4 6 3
5 6 2 5 6 5 5 7 4 5
8 5 4 9 4 5 7 3 6 8
5 6 8 6 7 10 6 6 12 4
5 10 3 7 9 6 5 8 7 8
11 6 5 12 4 8 11 5 8 10
5 6 13 9 6 11 7 7 14 6
8 13 5 8 11 7 9 13 8 9

G(1,000,000) = 5402
</pre>

Revision as of 14:59, 7 May 2022

Task
Goldbach's comet
You are encouraged to solve this task according to the task description, using any language you may know.
This page uses content from Wikipedia. The original article was at Goldbach's comet. The list of authors can be seen in the page history. As with Rosetta Code, the text of Wikipedia is available under the GNU FDL. (See links for details on variance)

Goldbach's comet is the name given to a plot of the function g(E), the so-called Goldbach function.

The Goldbach function is studied in relation to Goldbach's conjecture. The function g(E) is defined for all even integers E>2 to be the number of different ways in which E can be expressed as the sum of two primes.

Examples
  • G(4) = 1, since 4 can only be expressed as the sum of one distinct pair of primes (4 = 2 + 2)
  • G(22) = 3, since 22 can be expressed as the sum of 3 distinct pairs of primes (22 = 11 + 11 = 5 + 17 = 3 + 19)


Task
  • Find and show (preferably, in a neat 10x10 table) the first 100 G numbers (that is: the result of the G function described above, for the first 100 even numbers >= 4)
  • Find and display the value of G(1000000)


Stretch
  • Calculate the values of G up to 2000 (inclusive) and display the results in a scatter 2d-chart, aka the Goldbach's Comet


See also



Arturo

<lang rebol>G: function [n][

   size select 2..n/2 'x ->
       and? [prime? x][prime? n-x]

]

print "The first 100 G values:" loop split.every: 10 map select 4..202 => even? => G 'row [

   print map to [:string] row 'item -> pad item 3

]

print ["\nG(1000000) =" G 1000000]

csv: join.with:",\n" map select 4..2000 => even? 'x ->

   ~"|x|, |G x|"
write the CSV data to a file which we can then visualize
via our preferred spreadsheet app

write "comet.csv" csv</lang>

Output:
The first 100 G values:
  1   1   1   2   1   2   2   2   2   3 
  3   3   2   3   2   4   4   2   3   4 
  3   4   5   4   3   5   3   4   6   3 
  5   6   2   5   6   5   5   7   4   5 
  8   5   4   9   4   5   7   3   6   8 
  5   6   8   6   7  10   6   6  12   4 
  5  10   3   7   9   6   5   8   7   8 
 11   6   5  12   4   8  11   5   8  10 
  5   6  13   9   6  11   7   7  14   6 
  8  13   5   8  11   7   9  13   8   9 

G(1000000) = 5402

Here, you can find the result of the visualization - or the "Goldbach's comet": 2D-chart of all G values up to 2000

Raku

For the stretch, actually generates a plot, doesn't just calculate values to be plotted by a third party application. Deviates slightly from the stretch goal, plots the first two thousand defined values rather than the values up to two thousand that happen to be defined. (More closely matches the wikipedia example image.)

<lang perl6>sub G (Int $n) { +(2..$n/2).grep: { .is-prime && ($n - $_).is-prime } }

  1. Task

put "The first 100 G values:\n", (^100).map({ G 2 × $_ + 4 }).batch(10)».fmt("%2d").join: "\n";

put "\nG 1_000_000 = ", G 1_000_000;

  1. Stretch

use SVG; use SVG::Plot;

my @x = map 2 × * + 4, ^2000; my @y = @x.map: &G;

'Goldbachs-Comet-Raku.svg'.IO.spurt: SVG.serialize: SVG::Plot.new(

   width       => 1000,
   height      => 500,
   background  => 'white',
   title       => "Goldbach's Comet",
   x           => @x,
   values      => [@y,],

).plot: :points; </lang>

Output:
The first 100 G values:
 1  1  1  2  1  2  2  2  2  3
 3  3  2  3  2  4  4  2  3  4
 3  4  5  4  3  5  3  4  6  3
 5  6  2  5  6  5  5  7  4  5
 8  5  4  9  4  5  7  3  6  8
 5  6  8  6  7 10  6  6 12  4
 5 10  3  7  9  6  5  8  7  8
11  6  5 12  4  8 11  5  8 10
 5  6 13  9  6 11  7  7 14  6
 8 13  5  8 11  7  9 13  8  9

G 1_000_000 = 5402

Stretch goal: (offsite SVG image) Goldbachs-Comet-Raku.svg

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 PT(1_000_000);

func G(E); \Ways E can be expressed as sum of two primes int E, C, I, J, T; [C:= 0; I:= 0; loop [J:= I;

       if PT(J) + PT(I) > E then return C;
       loop    [T:= PT(J) + PT(I);
               if T = E then C:= C+1;
               if T > E then quit;
               J:= J+1;
               ];
       I:= I+1;
       ];

];

int I, N; [I:= 0; \make prime table for N:= 2 to 1_000_000 do

       if IsPrime(N) then
               [PT(I):= N;  I:= I+1];

I:= 4; \show first 100 G numbers Format(4, 0); for N:= 1 to 100 do

       [RlOut(0, float(G(I)));
       if rem(N/10) = 0 then CrLf(0);
       I:= I+2;
       ];

CrLf(0); Text(0, "G(1,000,000) = "); IntOut(0, G(1_000_000)); CrLf(0); ]</lang>

Output:
   1   1   1   2   1   2   2   2   2   3
   3   3   2   3   2   4   4   2   3   4
   3   4   5   4   3   5   3   4   6   3
   5   6   2   5   6   5   5   7   4   5
   8   5   4   9   4   5   7   3   6   8
   5   6   8   6   7  10   6   6  12   4
   5  10   3   7   9   6   5   8   7   8
  11   6   5  12   4   8  11   5   8  10
   5   6  13   9   6  11   7   7  14   6
   8  13   5   8  11   7   9  13   8   9

G(1,000,000) = 5402