Goldbach's comet: Difference between revisions

added RPL
(→‎{{header|Wren}}: Converted this to a DOME script so we can plot the points using the new Wren-plot module.)
(added RPL)
 
(26 intermediate revisions by 14 users not shown)
Line 28:
 
 
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">
F is_prime(a)
I a == 2
R 1B
I a < 2 | a % 2 == 0
R 0B
L(i) (3 .. Int(sqrt(a))).step(2)
I a % i == 0
R 0B
R 1B
 
F g(n)
assert(n > 2 & n % 2 == 0, ‘n in goldbach function g(n) must be even’)
V count = 0
L(i) 1 .. n I/ 2
I is_prime(i) & is_prime(n - i)
count++
R count
 
print(‘The first 100 G numbers are:’)
 
V col = 1
L(n) (4.<204).step(2)
print(String(g(n)).ljust(4), end' I (col % 10 == 0) {"\n"} E ‘’)
col++
 
print("\nThe value of G(1000000) is "g(1'000'000))
</syntaxhighlight>
 
{{out}}
<pre>
The first 100 G numbers are:
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
 
The value of G(1000000) is 5402
</pre>
 
=={{header|ALGOL 68}}==
Generates an ASCII-Art scatter plot - the vertical axis is n/10 and the hotizontal is G(n).
{{libheader|ALGOL 68-primes}}
<langsyntaxhighlight lang="algol68">BEGIN # calculate values of the Goldbach function G where G(n) is the number #
# of prime pairs that sum to n, n even and > 2 #
# generates an ASCII scatter plot of G(n) up to G(2000) #
Line 94 ⟶ 143:
print( ( newline ) )
OD
END</langsyntaxhighlight>
{{out}}
<pre>
Line 313 ⟶ 362:
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">G: function [n][
size select 2..n/2 'x ->
and? [prime? x][prime? n-x]
Line 330 ⟶ 379:
; write the CSV data to a file which we can then visualize
; via our preferred spreadsheet app
write "comet.csv" csv</langsyntaxhighlight>
 
{{out}}
Line 349 ⟶ 398:
 
Here, you can find the result of the visualization - or the "Goldbach's comet": [https://i.ibb.co/JvLDRc0/Screenshot-2022-05-07-at-11-35-23.png 2D-chart of all G values up to 2000]
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">c := 0
while (c<100)
if (x := g(A_Index))
c++, result .= x (Mod(c, 10) ? "`t" : "`n")
MsgBox % result "`ng(1000000) : " g(1000000)
return
 
g(n, i:=1) {
if Mod(n, 2)
return false
while (++i <= n/2)
if (is_prime(i) && is_prime(n-i))
count++
return count
}
 
is_prime(N) {
Loop, % Floor(Sqrt(N))
if (A_Index > 1 && !Mod(N, A_Index))
Return false
Return true
}</syntaxhighlight>
{{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(1000000) : 5402</pre>
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f GOLDBACHS_COMET.AWK
BEGIN {
Line 388 ⟶ 473:
return(1)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 408 ⟶ 493:
</pre>
 
=={{headerHeader|FreeBASICBASIC}}==
==={{header|BASIC256}}===
<lang freebasic>Function isPrime(Byval ValorEval As Uinteger) As Boolean
{{trans|FreeBASIC}}
<syntaxhighlight lang="vb">#arraybase 1
print "The first 100 G numbers are:"
 
col = 1
for n = 4 to 202 step 2
print rjust(string(g(n)), 4);
if col mod 10 = 0 then print
col += 1
next n
 
print : print "G(1000000) = "; g(1000000)
end
 
function isPrime(v)
if v <= 1 then return False
for i = 2 to int(sqrt(v))
if v mod i = 0 then return False
next i
return True
end function
 
function g(n)
cont = 0
if n mod 2 = 0 then
for i = 2 to (1/2) * n
if isPrime(i) = 1 and isPrime(n - i) = 1 then cont += 1
next i
end if
return cont
end function</syntaxhighlight>
{{out}}
<pre>Similar to FreeBASIC entry.</pre>
 
==={{header|FreeBASIC}}===
<syntaxhighlight lang="freebasic">Function isPrime(Byval ValorEval As Uinteger) As Boolean
If ValorEval <= 1 Then Return False
For i As Integer = 2 To Int(Sqr(ValorEval))
Line 437 ⟶ 558:
 
Print !"\nThe value of G(1000000) is "; g(1000000)
Sleep</langsyntaxhighlight>
{{out}}
<pre>The first 100 G numbers are:
Line 453 ⟶ 574:
The value of G(1000000) is 5402</pre>
 
==={{header|Gambas}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">Use "isprime.bas"
 
Public Sub Main()
Print "The first 100 G numbers are:"
Dim n As Integer, col As Integer = 1
For n = 4 To 202 Step 2
Print Format$(Str(g(n)), "####");
If col Mod 10 = 0 Then Print
col += 1
Next
Print "\nG(1.000.000) = "; g(1000000)
End
 
Function g(n As Integer) As Integer
 
Dim i As Integer, count As Integer = 0
If n Mod 2 = 0 Then
For i = 2 To n \ 2 '(1/2) * n
If isPrime(i) And isPrime(n - i) Then count += 1
Next
End If
Return count
 
End Function</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{Header|SmileBASIC}}===
(click the image to view full-size)
[[File:GoldbachsComet SmileBASIC 3DS screenshot.png|thumb]]
<syntaxhighlight lang="smilebasic">OPTION STRICT: OPTION DEFINT
VAR MAX_G = 4000, MAX_P = 1000000
VAR ROOT_MAX_P = FLOOR(SQR(MAX_P))
VAR HALF_MAX_G = MAX_G DIV 2
VAR G[MAX_G + 1], P[MAX_P + 1]
VAR I, J
CLS: GCLS
P[0] = FALSE: P[1] = 0: P[2] = TRUE
FOR I = 4 TO MAX_P STEP 2 P[I] = FALSE: NEXT
FOR I = 3 TO MAX_P STEP 2 P[I] = TRUE: NEXT
FOR I = 3 TO ROOT_MAX_P STEP 2
IF P[I] THEN
FOR J = I * I TO MAX_P STEP I
P[J] = FALSE
NEXT
ENDIF
NEXT
FOR I = 1 TO MAX_G G[I] = 0: NEXT
G[4] = 1 ' 4 is the only sum of 2 even primes
FOR I = 3 TO HALF_MAX_G STEP 2
IF P[I] THEN
INC G[I + 1]
FOR J = I + 2 TO MAX_G - 1
IF P[J] THEN
INC G[I + 1]
ENDIF
NEXT
ENDIF
NEXT
VAR C = 0
FOR I = 4 TO 202 STEP 2
PRINT FORMAT$("%3D", G[I]),
INC C
IF C == 10 THEN PRINT: C = 0: ENDIF
NEXT
VAR GM = 0
FOR I = 3 TO MAX_P DIV 2 STEP 2
IF P[I] THEN
IF P[MAX_P - I] THEN INC GM: ENDIF
ENDIF
NEXT
PRINT FORMAT$("G(%D): ", MAX_P); GM
FOR I = 2 TO MAX_G - 10 STEP 10
FOR J = 1 TO I + 8 STEP 2
GPSET I DIV 10, 240-G[J],RGB(255,255,255)
NEXT
NEXT</syntaxhighlight>
 
==={{header|uBasic/4tH}}===
{{trans|FreeBASIC}}
For performance reasons only '''g(100000)''' is calculated. The value "810" has been verified and is correct.
<syntaxhighlight lang="text">Print "The first 100 G numbers are:"
c = 1
 
For n = 4 To 202 Step 2
Print Using "___#"; FUNC(_g(n));
If (c % 10) = 0 Then Print
c = c + 1
Next
 
Print "\nThe value of G(100000) is "; FUNC(_g(100000))
 
End
 
_isPrime
Param (1)
Local (1)
If a@ < 2 Then Return (0)
For b@ = 2 To FUNC(_Sqrt(a@))
If (a@ % b@) = 0 Then Unloop: Return (0)
Next
Return (1)
_g
Param (1)
Local (2)
c@ = 0
If (a@ % 2) = 0 Then 'n in goldbach function g(n) must be even
For b@ = 2 To a@/2
If FUNC(_isPrime(b@)) * FUNC(_isPrime(a@ - b@)) Then c@ = c@ + 1
Next
EndIf
Return (c@)
 
_Sqrt
Param (1)
Local (3)
 
Let b@ = 1
Let c@ = 0
 
Do Until b@ > a@
Let b@ = b@ * 4
Loop
 
Do While b@ > 1
Let b@ = b@ / 4
Let d@ = a@ - c@ - b@
Let c@ = c@ / 2
If d@ > -1 Then
Let a@ = d@
Let c@ = c@ + b@
Endif
Loop
 
Return (c@)</syntaxhighlight>
{{out}}
<pre>The first 100 G numbers are:
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
 
The value of G(100000) is 810
 
0 OK, 0:210 </pre>
 
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vb">import isprime
 
print "The first 100 G numbers are:"
 
col = 1
for n = 4 to 202 step 2
print g(n) using ("####");
if mod(col, 10) = 0 print
col = col + 1
next n
 
print "\nG(1000000) = ", g(1000000)
end
 
sub g(n)
count = 0
if mod(n, 2) = 0 then
for i = 2 to (1/2) * n
if isPrime(i) and isPrime(n - i) count = count + 1
next i
fi
return count
end sub</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
=={{Header|C++}}==
<syntaxhighlight lang="c++">
#include <cmath>
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <vector>
 
std::vector<bool> primes;
 
void initialise_primes(const int32_t& limit) {
primes.resize(limit);
for ( int32_t i = 2; i < limit; ++i ) {
primes[i] = true;
}
 
for ( int32_t n = 2; n < sqrt(limit); ++n ) {
for ( int32_t k = n * n; k < limit; k += n ) {
primes[k] = false;
}
}
}
 
int32_t goldbach_function(const int32_t& number) {
if ( number <= 2 || number % 2 == 1 ) {
throw std::invalid_argument("Argument must be even and greater than 2: " + std::to_string(number));
}
 
int32_t result = 0;
for ( int32_t i = 1; i <= number / 2; ++i ) {
if ( primes[i] && primes[number - i] ) {
result++;
}
}
return result;
}
 
int main() {
initialise_primes(2'000'000);
 
std::cout << "The first 100 Goldbach numbers:" << std::endl;
for ( int32_t n = 2; n < 102; ++n ) {
std::cout << std::setw(3) << goldbach_function(2 * n) << ( n % 10 == 1 ? "\n" : "" );
}
 
std::cout << "\n" << "The 1,000,000th Goldbach number = " << goldbach_function(1'000'000) << std::endl;
}
</syntaxhighlight>
{{ out }}
<pre>
The first 100 Goldbach numbers:
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
 
The 1,000,000th Goldbach number = 5402
</pre>
 
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
 
 
<syntaxhighlight lang="Delphi">
 
function GetGoldbachCount(N: integer): integer;
{Count number of prime number combinations add up to N }
var I: integer;
begin
Result:=0;
{Look at all number pairs that add up to N}
{And see if they are prime}
for I:=1 to N div 2 do
if IsPrime(I) and IsPrime(N-I) then Inc(Result);
end;
 
procedure ShowGoldbachComet(Memo: TMemo);
{Show first 100 Goldback numbers}
var I,N,Cnt,C: integer;
var S: string;
begin
Cnt:=0; N:=2; S:='';
while true do
begin
C:=GetGoldbachCount(N);
if C>0 then
begin
Inc(Cnt);
S:=S+Format('%3d',[C]);
if (Cnt mod 10)=0 then S:=S+CRLF;
if Cnt>=100 then break;
end;
Inc(N,2);
end;
Memo.Lines.Add(S);
end;
 
 
 
</syntaxhighlight>
{{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
 
 
Elapsed Time: 1.512 ms.
 
</pre>
 
 
=={{header|EasyLang}}==
{{trans|AWK}}
 
<syntaxhighlight lang="easylang">
func isprim n .
if n mod 2 = 0 and n > 2
return 0
.
i = 3
sq = sqrt n
while i <= sq
if n mod i = 0
return 0
.
i += 2
.
return 1
.
func goldbach n .
for i = 2 to n div 2
if isprim i = 1
cnt += isprim (n - i)
.
.
return cnt
.
numfmt 0 3
for n = 4 step 2 to 202
write goldbach n
if n mod 20 = 2
print ""
.
.
print goldbach 1000000
</syntaxhighlight>
 
=={{header|J}}==
Line 458 ⟶ 931:
Task implementation:
 
<langsyntaxhighlight Jlang="j"> 10 10$#/.~4,/:~ 0-.~,(<:/~ * +/~) p:1+i.p:inv 202
1 1 1 2 1 2 2 2 2 3
3 3 2 3 2 4 4 2 3 4
Line 468 ⟶ 941:
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</langsyntaxhighlight>
 
And, for G(1e6):
<syntaxhighlight lang="j">
<lang j>
-:+/1 p: 1e6-p:i.p:inv 1e6
5402</langsyntaxhighlight>
 
Explanation:
Line 490 ⟶ 963:
 
Instead, for G(1e6), we find all primes less than a million, subtract each from 1 million and count how many of the differences are prime and cut that in half. We cut that sum in half because this approach counts each pair twice (once with the smallest value first, again with the smallest value second -- since 1e6 is not the square of a prime we do not have a prime which appears twice in one of these sums).
 
=={{header|Java}}==
<syntaxhighlight lang="java">
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
 
import javax.imageio.ImageIO;
 
public final class GoldbachsComet {
 
public static void main(String[] aArgs) {
initialisePrimes(2_000_000);
System.out.println("The first 100 Goldbach numbers:");
for ( int n = 2; n < 102; n++ ) {
System.out.print(String.format("%3d%s", goldbachFunction(2 * n), ( n % 10 == 1 ? "\n" : "" )));
}
System.out.println();
System.out.println("The 1,000,000th Goldbach number = " + goldbachFunction(1_000_000));
createImage();
}
private static void createImage() {
final int width = 1040;
final int height = 860;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
List<Color> colours = List.of( Color.BLUE, Color.GREEN, Color.RED );
for ( int n = 2; n < 2002; n++ ) {
graphics.setColor(colours.get(n % 3));
graphics.fillOval(n / 2, height - 5 * goldbachFunction(2 * n), 10, 10);
}
try {
ImageIO.write(image, "png", new File("GoldbachsCometJava.png"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
private static int goldbachFunction(int aNumber) {
if ( aNumber <= 2 || aNumber % 2 == 1 ) {
throw new AssertionError("Argument must be even and greater than 2: " + aNumber);
}
int result = 0;
for ( int i = 1; i <= aNumber / 2; i++ ) {
if ( primes[i] && primes[aNumber - i] ) {
result += 1;
}
}
return result;
}
private static void initialisePrimes(int aLimit) {
primes = new boolean[aLimit];
for ( int i = 2; i < aLimit; i++ ) {
primes[i] = true;
}
for ( int n = 2; n < Math.sqrt(aLimit); n++ ) {
for ( int k = n * n; k < aLimit; k += n ) {
primes[k] = false;
}
}
}
private static boolean[] primes;
 
}
</syntaxhighlight>
{{ out }}
[[Media:GoldbachsCometJava.png]]
<pre>
The first 100 Goldbach numbers:
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
 
The 1,000,000th Goldbach number = 5402
</pre>
 
=={{header|jq}}==
'''Works with jq and gojq, the C and Go implementations of jq.'''
 
'''Preliminaries'''
<syntaxhighlight lang=jq>
def count(s): reduce s as $_ (0; .+1);
 
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
 
def nwise($n):
def n: if length <= $n then . else .[0:$n] , (.[$n:] | n) end;
n;
 
def is_prime:
. as $n
| if ($n < 2) then false
elif ($n % 2 == 0) then $n == 2
elif ($n % 3 == 0) then $n == 3
elif ($n % 5 == 0) then $n == 5
elif ($n % 7 == 0) then $n == 7
elif ($n % 11 == 0) then $n == 11
elif ($n % 13 == 0) then $n == 13
elif ($n % 17 == 0) then $n == 17
elif ($n % 19 == 0) then $n == 19
else
($n | sqrt) as $rt
| 23
| until( . > $rt or ($n % . == 0); .+2)
| . > $rt
end;
</syntaxhighlight>
'''The Tasks'''
<syntaxhighlight lang=jq>
# emit nothing if . is odd
def G:
select(. % 2 == 0)
| count( range(2; (./2)+1) as $i
| select(($i|is_prime) and ((.-$i)|is_prime)) );
 
def task1:
"The first 100 G numbers:",
([range(4; 203; 2) | G] | nwise(10) | map(lpad(4)) | join(" "));
 
def task($n):
$n, 4, 22
|"G(\(.)): \(G)";
 
task1, "", task(1000000)
</syntaxhighlight>
{{output}}
<pre>
The first 100 G numbers:
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
G(4): 1
G(22): 3
</pre>
 
=={{header|Julia}}==
Run in VS Code or REPL to view and save the plot.
<langsyntaxhighlight rubylang="julia">using Combinatorics
using Plots
using Primes
Line 508 ⟶ 1,146:
y = map(g, 2x)
scatter(x, y, markerstrokewidth = 0, color = ["red", "blue", "green"][mod1.(x, 3)])
</langsyntaxhighlight>{{out}}<pre>
The first 100 G numbers are:
1 1 1 2 1 2 2 2 2 3
Line 523 ⟶ 1,161:
The value of G(1000000) is 5402
</pre>
[[File:Jgoldbachplot.png]]
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function T(t) return setmetatable(t, {__index=table}) end
table.range = function(t,n) local s=T{} for i=1,n do s[i]=i end return s end
table.map = function(t,f) local s=T{} for i=1,#t do s[i]=f(t[i]) end return s end
Line 553 ⟶ 1,192:
g = T{}:range(100):map(function(n) return goldbach(2+n*2) end)
g:map(function(n) return string.format("%2d ",n) end):batch(10,function(t) print(t:concat()) end)
print("G(1000000) = "..goldbach(1000000))</langsyntaxhighlight>
{{out}}
<pre>The first 100 G numbers:
Line 567 ⟶ 1,206:
8 13 5 8 11 7 9 13 8 9
G(1000000) = 5402</pre>
 
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">ClearAll[GoldbachFuncion]
GoldbachFuncion[e_Integer] := Module[{ps},
ps = Prime[Range[PrimePi[e/2]]];
Line 576 ⟶ 1,216:
Grid[Partition[GoldbachFuncion /@ Range[4, 220, 2], 10]]
GoldbachFuncion[10^6]
DiscretePlot[GoldbachFuncion[e], {e, 4, 2000}, Filling -> None]</langsyntaxhighlight>
{{out}}
<pre>1 1 1 2 1 2 2 2 2 3
Line 593 ⟶ 1,233:
[graphical object showing Goldbach's comet]</pre>
 
=={{header|Nim}}==
{{libheader|nim-plotly}}
{{libheader|chroma}}
To display the Golbach’s comet, we use a library providing a Nim interface to “plotly”. The graph is displayed into a browser.
<syntaxhighlight lang="Nim">import std/[math, strformat, strutils, sugar]
import chroma, plotly
 
const
N1 = 100 # For part 1 of task.
N2 = 1_000_000 # For part 2 of task.
N3 = 2000 # For stretch part.
 
# Erathostenes sieve.
var isPrime: array[1..N1, bool]
for i in 2..N1: isPrime[i] = true
for n in 2..sqrt(N1.toFloat).int:
for k in countup(n * n, N1, n):
isPrime[k] = false
 
proc g(n: int): int =
## Goldbach function.
assert n > 2 and n mod 2 == 0, "“n” must be even and greater than 2."
for i in 1..(n div 2):
if isPrime[i] and isPrime[n - i]:
inc result
 
# Part 1.
echo &"First {N1} G numbers:"
var col = 1
for n in 2..N1:
stdout.write align($g( 2 * n), 3)
stdout.write if col mod 10 == 0: '\n' else: ' '
inc col
 
# Part 2.
echo &"\nG({N2}) = ", g(N2)
 
# Stretch part.
 
const Colors = collect(for name in ["red", "blue", "green"]: name.parseHtmlName())
var x, y: seq[float]
var colors: seq[Color]
for n in 2..N3:
x.add n.toFloat
y.add g(2 * n).toFloat
colors.add Colors[n mod 3]
 
let trace = Trace[float](type: Scatter, mode: Markers, marker: Marker[float](color: colors), xs: x, ys: y)
let layout = Layout(title: "Goldbach’s comet", width: 1200, height: 400)
Plot[float64](layout: layout, traces: @[trace]).show(removeTempFile = true)
</syntaxhighlight>
{{out}}
<pre>First 100 G numbers:
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
</pre>
 
=={{header|Perl}}==
{{libheader|ntheory}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 631 ⟶ 1,337:
binmode $fh;
print $fh $gd->png();
close $fh;</langsyntaxhighlight>
{{out}}
<pre> 1 1 1 2 1 2 2 2 2 3
Line 652 ⟶ 1,358:
{{libheader|Phix/online}}
You can run this online [http://phix.x10.mx/p2js/goldbach.htm here].
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Goldbachs_comet.exw
Line 700 ⟶ 1,406:
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 720 ⟶ 1,426:
 
=={{header|Picat}}==
<langsyntaxhighlight Picatlang="picat">main =>
println("First 100 G numbers:"),
foreach({G,I} in zip(take([G: T in 1..300, G=g(T),G>0],100),1..100))
Line 731 ⟶ 1,437:
{1 : I in 1..N // 2,
prime(I),prime(N-I)}.len,
0).</langsyntaxhighlight>
 
{{out}}
Line 749 ⟶ 1,455:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">from matplotlib.pyplot import scatter, show
from sympy import isprime
 
Line 773 ⟶ 1,479:
colors = [["red", "blue", "green"][(i // 2) % 3] for i in x]
scatter([i // 2 for i in x], y, marker='.', color = colors)
show()</langsyntaxhighlight>{{out}}
<pre>
The first 100 G numbers are:
Line 789 ⟶ 1,495:
The value of G(1000000) is 5402
</pre>
[[File:PGoldbachplot.png]]
 
=={{header|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 [[wp:Goldbach's_comet|wikipedia example image]].)
 
<syntaxhighlight lang="raku" perl6line>sub G (Int $n) { +(2..$n/2).grep: { .is-prime && ($n - $_).is-prime } }
 
# Task
Line 815 ⟶ 1,522:
values => [@y,],
).plot: :points;
</syntaxhighlight>
</lang>
{{out}}
<pre>The first 100 G values:
Line 832 ⟶ 1,539:
 
'''Stretch goal:''' (offsite SVG image) [https://raw.githubusercontent.com/thundergnat/rc/master/img/Goldbachs-Comet-Raku.svg Goldbachs-Comet-Raku.svg]
 
=={{header|RPL}}==
{{works with|HP|49}}
« '''IF''' 2 MOD '''THEN'''
"GOLDB Error: Odd number" DOERR
'''ELSE'''
0
2 PICK3 2 / CEIL '''FOR''' j
'''IF''' j ISPRIME? '''THEN'''
'''IF''' OVER j - ISPRIME? '''THEN''' 1 + '''END'''
'''END'''
'''NEXT''' NIP
'''END'''
» '<span style="color:blue">GOLDB</span>' STO
« « n <span style="color:blue">GOLDB</span> » 'n' 4 202 2 SEQ
OBJ→ DROP { 10 10 } →ARRY
1000000 <span style="color:blue">GOLDB</span> "G(1000000)" →TAG
» '<span style="color:blue">TASK</span>' STO
{{out}}
<pre>
2: [[ 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 ]]
1: G(1000000): 5402
</pre>
 
=={{header|Ruby}}==
following the J comments, but only generating primes up-to half a million
<syntaxhighlight lang="ruby">require 'prime'
 
n = 100
puts "The first #{n} Godbach numbers are: "
sums = Prime.each(n*2 + 2).to_a[1..].repeated_combination(2).map(&:sum)
sums << 4
sums.sort.tally.values[...n].each_slice(10){|slice| puts "%4d"*slice.size % slice}
 
n = 1000000
puts "\nThe value of G(#{n}) is #{Prime.each(n/2).count{|pr| (n-pr).prime?} }."
</syntaxhighlight>
{{out}}
<pre>The first 100 Godbach numbers are:
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
 
The value of G(1000000) is 5402.
</pre>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">// [dependencies]
// primal = "0.3"
// plotters = "0.3.2"
Line 908 ⟶ 1,677:
Err(error) => eprintln!("Error: {}", error),
}
}</langsyntaxhighlight>
 
{{out}}
Writes a file in SVG format to the current directory with similar content to the Raku example.
<pre>
First 100 G numbers:
Line 928 ⟶ 1,696:
</pre>
 
[[Media:Goldbach's comet rust.svg]]
=={{header|uBasic/4tH}}==
{{trans|FreeBASIC}}
For performance reasons only '''g(100000)''' is calculated. The value "810" has been verified and is correct.
<lang>Print "The first 100 G numbers are:"
c = 1
 
For n = 4 To 202 Step 2
Print Using "___#"; FUNC(_g(n));
If (c % 10) = 0 Then Print
c = c + 1
Next
 
Print "\nThe value of G(100000) is "; FUNC(_g(100000))
 
End
 
_isPrime
Param (1)
Local (1)
If a@ < 2 Then Return (0)
For b@ = 2 To FUNC(_Sqrt(a@))
If (a@ % b@) = 0 Then Unloop: Return (0)
Next
Return (1)
_g
Param (1)
Local (2)
c@ = 0
If (a@ % 2) = 0 Then 'n in goldbach function g(n) must be even
For b@ = 2 To a@/2
If FUNC(_isPrime(b@)) * FUNC(_isPrime(a@ - b@)) Then c@ = c@ + 1
Next
EndIf
Return (c@)
 
_Sqrt
Param (1)
Local (3)
 
Let b@ = 1
Let c@ = 0
 
Do Until b@ > a@
Let b@ = b@ * 4
Loop
 
Do While b@ > 1
Let b@ = b@ / 4
Let d@ = a@ - c@ - b@
Let c@ = c@ / 2
If d@ > -1 Then
Let a@ = d@
Let c@ = c@ + b@
Endif
Loop
 
Return (c@)</lang>
{{out}}
<pre>The first 100 G numbers are:
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
 
The value of G(100000) is 810
 
0 OK, 0:210 </pre>
 
=={{header|Wren}}==
{{libheader|DOME}}
{{libheader|Wren-math}}
{{libheader|Wren-traititerate}}
{{libheader|Wren-fmt}}
{{libheader|Wren-plot}}
ItThis appears that most people are interpretingfollows the stretchRaku goalexample to meanin thatplotting the first 2000two thousand G values should be calculated and plotted rather than the values up to G(2000). Soin weorder followto thatproduce herean image something like the image in the Wikipedia article.
<langsyntaxhighlight ecmascriptlang="wren">import "dome" for Window
import "graphics" for Canvas, Color
import "./math2" for Int
import "./traititerate" for Stepped
import "./fmt" for Fmt
import "./plot" for Axes
Line 1,090 ⟶ 1,782:
}
 
var Game = Main.new()</langsyntaxhighlight>
 
{{out}}
Line 1,110 ⟶ 1,802:
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">
<lang XPL0>
func IsPrime(N); \Return 'true' if N is prime
int N, I;
Line 1,153 ⟶ 1,845:
Text(0, "G(1,000,000) = "); IntOut(0, G(1_000_000));
CrLf(0);
]</langsyntaxhighlight>
 
{{out}}
1,150

edits