Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
3
Task/Goldbachs-comet/00-META.yaml
Normal file
3
Task/Goldbachs-comet/00-META.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/Goldbach's_comet
|
||||
note: Prime Numbers
|
||||
27
Task/Goldbachs-comet/00-TASK.txt
Normal file
27
Task/Goldbachs-comet/00-TASK.txt
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
'''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 [https://upload.wikimedia.org/wikipedia/en/f/fb/Goldbachs_comet.gif Goldbach's Comet]
|
||||
|
||||
|
||||
;See also
|
||||
;* [[wp:Goldbach's conjecture|Wikipedia: Goldbach's conjecture]]
|
||||
;* [[oeis:A045917|OEIS: A045917 - From Goldbach problem: number of decompositions of 2n into unordered sums of two primes]]
|
||||
|
||||
|
||||
|
||||
|
||||
26
Task/Goldbachs-comet/11l/goldbachs-comet.11l
Normal file
26
Task/Goldbachs-comet/11l/goldbachs-comet.11l
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
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))
|
||||
63
Task/Goldbachs-comet/ALGOL-68/goldbachs-comet.alg
Normal file
63
Task/Goldbachs-comet/ALGOL-68/goldbachs-comet.alg
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
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) #
|
||||
# (Goldbach's Comet) #
|
||||
PR read "primes.incl.a68" PR # include prime utilities #
|
||||
INT max prime = 1 000 000; # maximum number we will consider #
|
||||
INT max plot = 2 000; # maximum G value for the comet #
|
||||
[]BOOL prime = PRIMESIEVE max prime; # sieve of primes to max prime #
|
||||
[ 0 : max plot ]INT g2; # table of G values: g2[n] = G(2n) #
|
||||
# construct the table of G values #
|
||||
FOR n FROM LWB g2 TO UPB g2 DO g2[ n ] := 0 OD;
|
||||
g2[ 4 ] := 1; # 4 is the only sum of two even primes #
|
||||
FOR p FROM 3 BY 2 TO max plot OVER 2 DO
|
||||
IF prime[ p ] THEN
|
||||
g2[ p + p ] +:= 1;
|
||||
FOR q FROM p + 2 BY 2 TO max plot - p DO
|
||||
IF prime[ q ] THEN
|
||||
g2[ p + q ] +:= 1
|
||||
FI
|
||||
OD
|
||||
FI
|
||||
OD;
|
||||
# show the first hundred G values #
|
||||
INT c := 0;
|
||||
FOR n FROM 4 BY 2 TO 202 DO
|
||||
print( ( whole( g2[ n ], -4 ) ) );
|
||||
IF ( c +:= 1 ) = 10 THEN print( ( newline ) ); c := 0 FI
|
||||
OD;
|
||||
# show G( 1 000 000 ) #
|
||||
INT gm := 0;
|
||||
FOR p FROM 3 TO max prime OVER 2 DO
|
||||
IF prime[ p ] THEN
|
||||
IF prime[ max prime - p ] THEN
|
||||
gm +:= 1
|
||||
FI
|
||||
FI
|
||||
OD;
|
||||
print( ( "G(", whole( max prime, 0 ), "): ", whole( gm, 0 ), newline ) );
|
||||
# find the maximum value of G up to the maximum plot size #
|
||||
INT max g := 0;
|
||||
FOR n FROM 2 BY 2 TO max plot DO
|
||||
IF g2[ n ] > max g THEN max g := g2[ n ] FI
|
||||
OD;
|
||||
# draw an ASCII scatter plot of G, each position represents 5 G values #
|
||||
# the vertical axis is n/10, the horizontal axis is G(n) #
|
||||
INT plot step = 10;
|
||||
STRING plot value = " .-+=*%$&#@";
|
||||
FOR g FROM 0 BY plot step TO max plot - plot step DO
|
||||
[ 0 : max g ]INT values;
|
||||
FOR v pos FROM LWB values TO UPB values DO values[ v pos ] := 0 OD;
|
||||
INT max v := 0;
|
||||
FOR g element FROM g BY 2 TO g + ( plot step - 1 ) DO
|
||||
INT g2 value = g2[ g element ];
|
||||
values[ g2 value ] +:= 1;
|
||||
IF g2 value > max v THEN max v := g2 value FI
|
||||
OD;
|
||||
print( ( IF g MOD 100 = 90 THEN "+" ELSE "|" FI ) );
|
||||
FOR v pos FROM 1 TO max v DO # exclude 0 values from the plot #
|
||||
print( ( plot value[ values[ v pos ] + 1 ] ) )
|
||||
OD;
|
||||
print( ( newline ) )
|
||||
OD
|
||||
END
|
||||
37
Task/Goldbachs-comet/AWK/goldbachs-comet.awk
Normal file
37
Task/Goldbachs-comet/AWK/goldbachs-comet.awk
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# syntax: GAWK -f GOLDBACHS_COMET.AWK
|
||||
BEGIN {
|
||||
print("The first 100 G numbers:")
|
||||
for (n=4; n<=202; n+=2) {
|
||||
printf("%4d%1s",g(n),++count%10?"":"\n")
|
||||
}
|
||||
n = 1000000
|
||||
printf("\nG(%d): %d\n",n,g(n))
|
||||
n = 4
|
||||
printf("G(%d): %d\n",n,g(n))
|
||||
n = 22
|
||||
printf("G(%d): %d\n",n,g(n))
|
||||
exit(0)
|
||||
}
|
||||
function g(n, count,i) {
|
||||
if (n % 2 == 0) { # n must be even
|
||||
for (i=2; i<=(1/2)*n; i++) {
|
||||
if (is_prime(i) && is_prime(n-i)) {
|
||||
count++
|
||||
}
|
||||
}
|
||||
}
|
||||
return(count)
|
||||
}
|
||||
function is_prime(n, d) {
|
||||
d = 5
|
||||
if (n < 2) { return(0) }
|
||||
if (n % 2 == 0) { return(n == 2) }
|
||||
if (n % 3 == 0) { return(n == 3) }
|
||||
while (d*d <= n) {
|
||||
if (n % d == 0) { return(0) }
|
||||
d += 2
|
||||
if (n % d == 0) { return(0) }
|
||||
d += 4
|
||||
}
|
||||
return(1)
|
||||
}
|
||||
18
Task/Goldbachs-comet/Arturo/goldbachs-comet.arturo
Normal file
18
Task/Goldbachs-comet/Arturo/goldbachs-comet.arturo
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
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
|
||||
22
Task/Goldbachs-comet/AutoHotkey/goldbachs-comet.ahk
Normal file
22
Task/Goldbachs-comet/AutoHotkey/goldbachs-comet.ahk
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
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
|
||||
}
|
||||
31
Task/Goldbachs-comet/Delphi/goldbachs-comet.delphi
Normal file
31
Task/Goldbachs-comet/Delphi/goldbachs-comet.delphi
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
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;
|
||||
40
Task/Goldbachs-comet/EasyLang/goldbachs-comet.easy
Normal file
40
Task/Goldbachs-comet/EasyLang/goldbachs-comet.easy
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
proc isprime n . r .
|
||||
r = 1
|
||||
if n <= 1
|
||||
r = 0
|
||||
break 1
|
||||
.
|
||||
if n mod 2 = 0
|
||||
if n = 2
|
||||
break 1
|
||||
.
|
||||
r = 0
|
||||
break 1
|
||||
.
|
||||
for i = 3 step 2 to sqrt n
|
||||
if n mod i = 0
|
||||
r = 0
|
||||
break 2
|
||||
.
|
||||
.
|
||||
.
|
||||
proc goldbach n . cnt .
|
||||
cnt = 0
|
||||
for i = 1 to n div 2
|
||||
call isprime i r
|
||||
if r = 1
|
||||
call isprime n - i r
|
||||
cnt += r
|
||||
.
|
||||
.
|
||||
.
|
||||
numfmt 0 3
|
||||
for n = 4 step 2 to 202
|
||||
call goldbach n r
|
||||
write r
|
||||
if n mod 20 = 2
|
||||
print ""
|
||||
.
|
||||
.
|
||||
call goldbach 1000000 r
|
||||
print r
|
||||
29
Task/Goldbachs-comet/FreeBASIC/goldbachs-comet-1.basic
Normal file
29
Task/Goldbachs-comet/FreeBASIC/goldbachs-comet-1.basic
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
Function isPrime(Byval ValorEval As Uinteger) As Boolean
|
||||
If ValorEval <= 1 Then Return False
|
||||
For i As Integer = 2 To Int(Sqr(ValorEval))
|
||||
If ValorEval Mod i = 0 Then Return False
|
||||
Next i
|
||||
Return True
|
||||
End Function
|
||||
|
||||
Function g(n As Uinteger) As Uinteger
|
||||
Dim As Uinteger i, count = 0
|
||||
If (n Mod 2 = 0) Then 'n in goldbach function g(n) must be even
|
||||
For i = 2 To (1/2) * n
|
||||
If isPrime(i) And isPrime(n - i) Then count += 1
|
||||
Next i
|
||||
End If
|
||||
Return count
|
||||
End Function
|
||||
|
||||
Print "The first 100 G numbers are:"
|
||||
|
||||
Dim As Uinteger col = 1
|
||||
For n As Uinteger = 4 To 202 Step 2
|
||||
Print Using "####"; g(n);
|
||||
If (col Mod 10 = 0) Then Print
|
||||
col += 1
|
||||
Next n
|
||||
|
||||
Print !"\nThe value of G(1000000) is "; g(1000000)
|
||||
Sleep
|
||||
47
Task/Goldbachs-comet/FreeBASIC/goldbachs-comet-2.basic
Normal file
47
Task/Goldbachs-comet/FreeBASIC/goldbachs-comet-2.basic
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
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
|
||||
11
Task/Goldbachs-comet/J/goldbachs-comet-1.j
Normal file
11
Task/Goldbachs-comet/J/goldbachs-comet-1.j
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
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
|
||||
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
|
||||
2
Task/Goldbachs-comet/J/goldbachs-comet-2.j
Normal file
2
Task/Goldbachs-comet/J/goldbachs-comet-2.j
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
-:+/1 p: 1e6-p:i.p:inv 1e6
|
||||
5402
|
||||
25
Task/Goldbachs-comet/Jq/goldbachs-comet-1.jq
Normal file
25
Task/Goldbachs-comet/Jq/goldbachs-comet-1.jq
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
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;
|
||||
15
Task/Goldbachs-comet/Jq/goldbachs-comet-2.jq
Normal file
15
Task/Goldbachs-comet/Jq/goldbachs-comet-2.jq
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# 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)
|
||||
15
Task/Goldbachs-comet/Julia/goldbachs-comet.julia
Normal file
15
Task/Goldbachs-comet/Julia/goldbachs-comet.julia
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
using Combinatorics
|
||||
using Plots
|
||||
using Primes
|
||||
|
||||
g(n) = iseven(n) ? count(p -> all(isprime, p), partitions(n, 2)) : error("n must be even")
|
||||
|
||||
println("The first 100 G numbers are: ")
|
||||
|
||||
foreach(p -> print(lpad(p[2], 4), p[1] % 10 == 0 ? "\n" : ""), map(g, 4:2:202) |> enumerate)
|
||||
|
||||
println("\nThe value of G(1000000) is ", g(1_000_000))
|
||||
|
||||
x = collect(2:2002)
|
||||
y = map(g, 2x)
|
||||
scatter(x, y, markerstrokewidth = 0, color = ["red", "blue", "green"][mod1.(x, 3)])
|
||||
29
Task/Goldbachs-comet/Lua/goldbachs-comet.lua
Normal file
29
Task/Goldbachs-comet/Lua/goldbachs-comet.lua
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
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
|
||||
table.batch = function(t,n,f) for i=1,#t,n do local s=T{} for j=1,n do s[j]=t[i+j-1] end f(s) end return t end
|
||||
|
||||
function isprime(n)
|
||||
if n < 2 then return false end
|
||||
if n % 2 == 0 then return n==2 end
|
||||
if n % 3 == 0 then return n==3 end
|
||||
for f = 5, n^0.5, 6 do
|
||||
if n%f==0 or n%(f+2)==0 then return false end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function goldbach(n)
|
||||
local count = 0
|
||||
for i = 1, n/2 do
|
||||
if isprime(i) and isprime(n-i) then
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
return count
|
||||
end
|
||||
|
||||
print("The first 100 G numbers:")
|
||||
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))
|
||||
8
Task/Goldbachs-comet/Mathematica/goldbachs-comet.math
Normal file
8
Task/Goldbachs-comet/Mathematica/goldbachs-comet.math
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
ClearAll[GoldbachFuncion]
|
||||
GoldbachFuncion[e_Integer] := Module[{ps},
|
||||
ps = Prime[Range[PrimePi[e/2]]];
|
||||
Total[Boole[PrimeQ[e - ps]]]
|
||||
]
|
||||
Grid[Partition[GoldbachFuncion /@ Range[4, 220, 2], 10]]
|
||||
GoldbachFuncion[10^6]
|
||||
DiscretePlot[GoldbachFuncion[e], {e, 4, 2000}, Filling -> None]
|
||||
46
Task/Goldbachs-comet/Nim/goldbachs-comet.nim
Normal file
46
Task/Goldbachs-comet/Nim/goldbachs-comet.nim
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
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)
|
||||
36
Task/Goldbachs-comet/Perl/goldbachs-comet.pl
Normal file
36
Task/Goldbachs-comet/Perl/goldbachs-comet.pl
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
use strict;
|
||||
use warnings;
|
||||
use feature 'say';
|
||||
|
||||
use List::Util 'max';
|
||||
use GD::Graph::bars;
|
||||
use ntheory 'is_prime';
|
||||
|
||||
sub table { my $t = shift() * (my $c = 1 + max map {length} @_); ( sprintf( ('%'.$c.'s')x@_, @_) ) =~ s/.{1,$t}\K/\n/gr }
|
||||
|
||||
sub G {
|
||||
my($n) = @_;
|
||||
scalar grep { is_prime($_) and is_prime($n - $_) } 2 .. $n/2;
|
||||
}
|
||||
|
||||
my @y;
|
||||
push @y, G(2*$_ + 4) for my @x = 0..1999;
|
||||
|
||||
say $_ for table 10, @y;
|
||||
printf "G $_: %d", G($_) for 1e6;
|
||||
|
||||
my @data = ( \@x, \@y);
|
||||
my $graph = GD::Graph::bars->new(1200, 400);
|
||||
$graph->set(
|
||||
title => q/Goldbach's Comet/,
|
||||
y_max_value => 170,
|
||||
x_tick_number => 10,
|
||||
r_margin => 10,
|
||||
dclrs => [ 'blue' ],
|
||||
) or die $graph->error;
|
||||
my $gd = $graph->plot(\@data) or die $graph->error;
|
||||
|
||||
open my $fh, '>', 'goldbachs-comet.png';
|
||||
binmode $fh;
|
||||
print $fh $gd->png();
|
||||
close $fh;
|
||||
49
Task/Goldbachs-comet/Phix/goldbachs-comet.phix
Normal file
49
Task/Goldbachs-comet/Phix/goldbachs-comet.phix
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #000080;font-style:italic;">--
|
||||
-- demo\rosetta\Goldbachs_comet.exw
|
||||
-- ================================
|
||||
--
|
||||
-- Note: this plots n/2 vs G(n) for n=6 to 4000 by 2, matching wp and
|
||||
-- Algol 68, Python, and Raku. However, while not wrong, Arturo
|
||||
-- and Wren apparently plot n vs G(n) for n=6 to 2000 by 2, so
|
||||
-- should you spot any (very) minor differences, that'd be why.
|
||||
--</span>
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #7060A8;">requires</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1.0.2"</span><span style="color: #0000FF;">)</span>
|
||||
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">limit</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">4000</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">primes</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_primes_le</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$],</span>
|
||||
<span style="color: #000000;">goldbach</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">reinstate</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">),{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">primes</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">i</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">primes</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">primes</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">primes</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">></span><span style="color: #000000;">limit</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">goldbach</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">fhg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">extract</span><span style="color: #0000FF;">(</span><span style="color: #000000;">goldbach</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">tagstart</span><span style="color: #0000FF;">(</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #004080;">string</span> <span style="color: #000000;">fhgs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fhg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%2d"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">gm</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1e6</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">get_primes_le</span><span style="color: #0000FF;">(</span><span style="color: #000000;">499999</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]),</span><span style="color: #7060A8;">is_prime</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The first 100 G values:\n%s\n\nG(1,000,000) = %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">fhgs</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gm</span><span style="color: #0000FF;">})</span>
|
||||
|
||||
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #000000;">IupGraph</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">get_data</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*graph*/</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{{</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">extract</span><span style="color: #0000FF;">(</span><span style="color: #000000;">goldbach</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)),</span><span style="color: #004600;">CD_RED</span><span style="color: #0000FF;">},</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">extract</span><span style="color: #0000FF;">(</span><span style="color: #000000;">goldbach</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)),</span><span style="color: #004600;">CD_BLUE</span><span style="color: #0000FF;">},</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">extract</span><span style="color: #0000FF;">(</span><span style="color: #000000;">goldbach</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)),</span><span style="color: #004600;">CD_DARK_GREEN</span><span style="color: #0000FF;">}}</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">graph</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">IupGraph</span><span style="color: #0000FF;">(</span><span style="color: #000000;">get_data</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"RASTERSIZE=640x440,MARKSTYLE=PLUS"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">IupSetAttributes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">graph</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"XTICK=%d,XMIN=0,XMAX=%d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">/</span><span style="color: #000000;">20</span><span style="color: #0000FF;">,</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #7060A8;">IupSetAttributes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">graph</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"YTICK=20,YMIN=0,YMAX=%d"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #000000;">goldbach</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">20</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">graph</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`TITLE="Goldbach's comet",MINSIZE=400x300`</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<!--
|
||||
12
Task/Goldbachs-comet/Picat/goldbachs-comet.picat
Normal file
12
Task/Goldbachs-comet/Picat/goldbachs-comet.picat
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
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))
|
||||
printf("%2d %s",G,cond(I mod 10 == 0,"\n",""))
|
||||
end,
|
||||
nl,
|
||||
printf("G(1_000_000): %d\n", g(1_000_000)).
|
||||
|
||||
g(N) = cond((N > 2, N mod 2 == 0),
|
||||
{1 : I in 1..N // 2,
|
||||
prime(I),prime(N-I)}.len,
|
||||
0).
|
||||
25
Task/Goldbachs-comet/Python/goldbachs-comet.py
Normal file
25
Task/Goldbachs-comet/Python/goldbachs-comet.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
from matplotlib.pyplot import scatter, show
|
||||
from sympy import isprime
|
||||
|
||||
def g(n):
|
||||
assert n > 2 and n % 2 == 0, 'n in goldbach function g(n) must be even'
|
||||
count = 0
|
||||
for i in range(1, n//2 + 1):
|
||||
if isprime(i) and isprime(n - i):
|
||||
count += 1
|
||||
return count
|
||||
|
||||
print('The first 100 G numbers are:')
|
||||
|
||||
col = 1
|
||||
for n in range(4, 204, 2):
|
||||
print(str(g(n)).ljust(4), end = '\n' if (col % 10 == 0) else '')
|
||||
col += 1
|
||||
|
||||
print('\nThe value of G(1000000) is', g(1_000_000))
|
||||
|
||||
x = range(4, 4002, 2)
|
||||
y = [g(i) for i in x]
|
||||
colors = [["red", "blue", "green"][(i // 2) % 3] for i in x]
|
||||
scatter([i // 2 for i in x], y, marker='.', color = colors)
|
||||
show()
|
||||
22
Task/Goldbachs-comet/Raku/goldbachs-comet.raku
Normal file
22
Task/Goldbachs-comet/Raku/goldbachs-comet.raku
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
sub G (Int $n) { +(2..$n/2).grep: { .is-prime && ($n - $_).is-prime } }
|
||||
|
||||
# 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;
|
||||
|
||||
# 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;
|
||||
10
Task/Goldbachs-comet/Ruby/goldbachs-comet.rb
Normal file
10
Task/Goldbachs-comet/Ruby/goldbachs-comet.rb
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
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?} }."
|
||||
75
Task/Goldbachs-comet/Rust/goldbachs-comet.rust
Normal file
75
Task/Goldbachs-comet/Rust/goldbachs-comet.rust
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
// [dependencies]
|
||||
// primal = "0.3"
|
||||
// plotters = "0.3.2"
|
||||
|
||||
use plotters::prelude::*;
|
||||
|
||||
fn goldbach(n: u64) -> u64 {
|
||||
let mut p = 2;
|
||||
let mut count = 0;
|
||||
loop {
|
||||
let q = n - p;
|
||||
if q < p {
|
||||
break;
|
||||
}
|
||||
if primal::is_prime(p) && primal::is_prime(q) {
|
||||
count += 1;
|
||||
}
|
||||
if p == 2 {
|
||||
p += 1;
|
||||
} else {
|
||||
p += 2;
|
||||
}
|
||||
}
|
||||
count
|
||||
}
|
||||
|
||||
fn goldbach_plot(filename: &str) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let gvalues : Vec<u64> = (1..=2000).map(|x| goldbach(2 * x + 2)).collect();
|
||||
let mut gmax = *gvalues.iter().max().unwrap();
|
||||
gmax = 10 * ((gmax + 9) / 10);
|
||||
|
||||
let root = SVGBackend::new(filename, (1000, 500)).into_drawing_area();
|
||||
root.fill(&WHITE)?;
|
||||
|
||||
let mut chart = ChartBuilder::on(&root)
|
||||
.x_label_area_size(20)
|
||||
.y_label_area_size(20)
|
||||
.margin(10)
|
||||
.caption("Goldbach's Comet", ("sans-serif", 24).into_font())
|
||||
.build_cartesian_2d(0usize..2000usize, 0u64..gmax)?;
|
||||
|
||||
chart
|
||||
.configure_mesh()
|
||||
.disable_x_mesh()
|
||||
.disable_y_mesh()
|
||||
.draw()?;
|
||||
|
||||
chart.draw_series(
|
||||
gvalues
|
||||
.iter()
|
||||
.cloned()
|
||||
.enumerate()
|
||||
.map(|p| Circle::new(p, 2, BLUE.filled())),
|
||||
)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("First 100 G numbers:");
|
||||
for i in 1..=100 {
|
||||
print!(
|
||||
"{:2}{}",
|
||||
goldbach(2 * i + 2),
|
||||
if i % 10 == 0 { "\n" } else { " " }
|
||||
);
|
||||
}
|
||||
|
||||
println!("\nG(1000000) = {}", goldbach(1000000));
|
||||
|
||||
match goldbach_plot("goldbach.svg") {
|
||||
Ok(()) => {}
|
||||
Err(error) => eprintln!("Error: {}", error),
|
||||
}
|
||||
}
|
||||
78
Task/Goldbachs-comet/Wren/goldbachs-comet.wren
Normal file
78
Task/Goldbachs-comet/Wren/goldbachs-comet.wren
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
import "dome" for Window
|
||||
import "graphics" for Canvas, Color
|
||||
import "./math2" for Int
|
||||
import "./iterate" for Stepped
|
||||
import "./fmt" for Fmt
|
||||
import "./plot" for Axes
|
||||
|
||||
var limit = 4002
|
||||
var primes = Int.primeSieve(limit-1).skip(1).toList
|
||||
var goldbach = {4: 1}
|
||||
for (i in Stepped.new(6..limit, 2)) goldbach[i] = 0
|
||||
for (i in 0...primes.count) {
|
||||
for (j in i...primes.count) {
|
||||
var s = primes[i] + primes[j]
|
||||
if (s > limit) break
|
||||
goldbach[s] = goldbach[s] + 1
|
||||
}
|
||||
}
|
||||
|
||||
System.print("The first 100 G values:")
|
||||
var count = 0
|
||||
for (i in Stepped.new(4..202, 2)) {
|
||||
count = count + 1
|
||||
Fmt.write("$2d ", goldbach[i])
|
||||
if (count % 10 == 0) System.print()
|
||||
}
|
||||
|
||||
primes = Int.primeSieve(499999).skip(1)
|
||||
var gm = 0
|
||||
for (p in primes) {
|
||||
if (Int.isPrime(1e6 - p)) gm = gm + 1
|
||||
}
|
||||
System.print("\nG(1000000) = %(gm)")
|
||||
|
||||
var Red = []
|
||||
var Blue = []
|
||||
var Green = []
|
||||
|
||||
// create lists for the first 2000 G values for plotting by DOME.
|
||||
for(e in Stepped.new(4..limit, 2)) {
|
||||
var c = e % 6
|
||||
var n = e/2 - 1
|
||||
if (c == 0) {
|
||||
Red.add([n, goldbach[e]])
|
||||
} else if (c == 2) {
|
||||
Blue.add([n, goldbach[e]])
|
||||
} else {
|
||||
Green.add([n, goldbach[e]])
|
||||
}
|
||||
}
|
||||
|
||||
class Main {
|
||||
construct new() {
|
||||
Window.title = "Goldbach's comet"
|
||||
Canvas.resize(1000, 600)
|
||||
Window.resize(1000, 600)
|
||||
Canvas.cls(Color.white)
|
||||
var axes = Axes.new(100, 500, 800, 400, 0..2000, 0..200)
|
||||
axes.draw(Color.black, 2)
|
||||
var xMarks = Stepped.new(0..2000, 200)
|
||||
var yMarks = Stepped.new(0..200, 20)
|
||||
axes.mark(xMarks, yMarks, Color.black, 2)
|
||||
var xMarks2 = Stepped.new(0..2000, 400)
|
||||
var yMarks2 = Stepped.new(0..200, 40)
|
||||
axes.label(xMarks2, yMarks2, Color.black, 2, Color.black)
|
||||
axes.plot(Red, Color.red, "+")
|
||||
axes.plot(Blue, Color.blue, "+")
|
||||
axes.plot(Green, Color.green, "+")
|
||||
}
|
||||
|
||||
init() {}
|
||||
|
||||
update() {}
|
||||
|
||||
draw(alpha) {}
|
||||
}
|
||||
|
||||
var Game = Main.new()
|
||||
43
Task/Goldbachs-comet/XPL0/goldbachs-comet.xpl0
Normal file
43
Task/Goldbachs-comet/XPL0/goldbachs-comet.xpl0
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
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);
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue