Strange result in last digits of primes.

Evelyn Lamb and Scientific American drew my attention to the recently announced observation that if you consider the last digit of each successive prime number ( which must be a 1, 3, 7 or 9 after the first 2 and 5) then it 'avoids' the last digit of the previous prime.

Any mathematician /programmer immediately tries coding it to see this improbable result.

The original discoverers checked a billion digits. My code checks far fewer ( 360,000 or 1,000,000)!

Give the code time- it does a 'Sieve of Eratosthenes' first, displayed graphically on-screen...

Note how say '1' followed by '1' is far less common than '1' followed by any of '3, 7 or 9'.

Now to investigate how far down-the-line this avoidance persists!


Code


WindowWidth  =1000
WindowHeight = 700
UpperLeftX   =  50
UpperLeftY   =  50

graphicbox #john.g2, 350,  10, 606, 610

open "Statistics of last digits of primes." for window as #john

    #john "trapclose [quit]"

    #john.g2 "down ; fill cyan"

    topinteger =1000000

    dim bin( 10, 10)    '   actually need only 1, 3, 7, 9.......

[start]
    dim ints( topinteger)
    for j =1 to topinteger
        ints( j) =1
        scan
    next j

    for j =2 to 1 +topinteger^0.5
        if ints( j) =1 then gosub [strikeout]
        scan
    next j

for j =2 to topinteger
    if ints( j) =1 then
        'print j
        currLastDigit =last( j)
        bin( currLastDigit, oldLastDigit) = bin( currLastDigit, oldLastDigit) +1
        oldLastDigit  =currLastDigit
    end if
    scan
next j

'data 1, 3, 7, 9

for i =1 to 9
    for j =1 to 9
        print bin( i, j),
    next j
    print ""
next i

wait

function last( j)
    j$ =str$( j)
    last =val( right$(j$,1))
end function

[strikeout]
    call setxy, i

    for k =2 *j to topinteger step j
        ints( k) =0
        call setxy, k
    next k
return

sub setxy jf
    y =int( jf /600)
    x =jf -600 *y
    #john.g2 "set "; 2+x; " "; 2+y
end sub

[quit]
close #john
end