85 lines
3.5 KiB
Text
85 lines
3.5 KiB
Text
BEGIN # find the differences between primes for each value of the gap #
|
|
# the prime and the next #
|
|
PR read "primes.incl.a68" PR # include prime utilities #
|
|
INT max prime = 2 000 000; # maximum prime we will consider #
|
|
[]BOOL prime = PRIMESIEVE max prime; # sieve the primes to max prime #
|
|
[ 1 : max prime OVER 2 ]INT start prime; # index of the first prime with #
|
|
# gap of subscript / 2 #
|
|
# find the prime gaps #
|
|
FOR i TO UPB start prime DO start prime[ i ] := 0 OD;
|
|
INT prev prime := 3;
|
|
FOR i FROM 5 BY 2 TO UPB prime DO
|
|
IF prime[ i ] THEN
|
|
INT gap = ( i - prev prime ) OVER 2;
|
|
IF start prime[ gap ] = 0 THEN
|
|
start prime[ gap ] := prev prime
|
|
FI;
|
|
prev prime := i
|
|
FI
|
|
OD;
|
|
|
|
# to reiterate the task: we must find the earliest start primes where #
|
|
# the distance betweeen the gaps is 10, 100, 1000, 10 000 etc. #
|
|
# The distance is the distance between the start prime with gap g and #
|
|
# start prime with the a gap of g + 2, e.g. 3 has a gap of 2 as the next #
|
|
# prime is 5, 7 has a gap of 4 as the next prime is 11, so the distance #
|
|
# is: 7 - 3 = 4 #
|
|
|
|
# shows a prime gap #
|
|
PROC show gap = ( INT start pos )VOID:
|
|
print( ( whole( start prime[ start pos ], 0 )
|
|
, "(", whole( start pos * 2, 0 ),")"
|
|
, whole( start prime[ start pos ] + ( start pos * 2 ), 0 )
|
|
)
|
|
);
|
|
# shows a prime gap distance #
|
|
PROC show distance = ( INT gap, pos )VOID:
|
|
BEGIN
|
|
print( ( "First distance > ", whole( gap, 0 )
|
|
, " betweeen prime gaps:", newline
|
|
, " ", whole( ABS ( start prime[ pos + 1 ] - start prime[ pos ] ), 0 )
|
|
, " between "
|
|
)
|
|
);
|
|
show gap( pos );
|
|
print( " and " );
|
|
show gap( pos + 1 );
|
|
print( ( newline ) )
|
|
END # show distance # ;
|
|
INT g10 := 0, g100 := 0, gt := 0, g10t := 0, g100t := 0, gm := 0;
|
|
FOR i TO UPB start prime - 1 DO
|
|
IF start prime[ i ] /= 0 AND start prime[ i + 1 ] /= 0 THEN
|
|
INT distance = ABS ( start prime[ i + 1 ] - start prime[ i ] );
|
|
IF distance > 10
|
|
THEN
|
|
IF g10 = 0 THEN g10 := i FI
|
|
FI;
|
|
IF distance > 100
|
|
THEN
|
|
IF g100 = 0 THEN g100 := i FI
|
|
FI;
|
|
IF distance > 1 000
|
|
THEN
|
|
IF gt = 0 THEN gt := i FI
|
|
FI;
|
|
IF distance > 10 000
|
|
THEN
|
|
IF g10t = 0 THEN g10t := i FI
|
|
FI;
|
|
IF distance > 100 000
|
|
THEN
|
|
IF g100t = 0 THEN g100t := i FI
|
|
FI;
|
|
IF distance > 1 000 000
|
|
THEN
|
|
IF gm = 0 THEN gm := i FI
|
|
FI
|
|
FI
|
|
OD;
|
|
show distance( 10, g10 );
|
|
show distance( 100, g100 );
|
|
show distance( 1 000, gt );
|
|
show distance( 10 000, g10t );
|
|
show distance( 100 000, g100t );
|
|
show distance( 1 000 000, gm )
|
|
END
|