54 lines
1.6 KiB
Plaintext
54 lines
1.6 KiB
Plaintext
Function GetSig(Byval N As Uinteger) As Uinteger 'Return signature of N
|
|
'A "signature" is the count of each digit in N packed into a 32-bit word
|
|
Dim As Uinteger Sig = 0
|
|
Do While N > 0
|
|
Sig += 1 Shl (N Mod 10)
|
|
N \= 10
|
|
Loop
|
|
Return Sig
|
|
End Function
|
|
|
|
Dim As Uinteger limite = 1e9
|
|
Dim Shared As Boolean Sieve(limite)
|
|
|
|
Sub MakeSieve(Size As Uinteger) 'Make prime number sieve
|
|
Dim As Uinteger Prime, i, K
|
|
Size \= 2 'ignore even numbers
|
|
For i = 0 To Size 'set Sieve flags all true
|
|
Sieve(i) = True
|
|
Next
|
|
For i = 0 To Size
|
|
If Sieve(i) Then 'found a prime, which is equal to
|
|
Prime = i * 2 + 3 ' twice the index + 3
|
|
K = i + Prime 'first multiple to strike off
|
|
While K <= Size 'strike off all multiples
|
|
Sieve(K) = False
|
|
K += Prime
|
|
Wend
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
MakeSieve(limite)
|
|
Print "Smallest members of first 25 Ormiston triples:"
|
|
Dim As Uinteger Cnt = 0, N0 = 0, N1 = 0, Sig0 = 0, Sig1 = 0, N = 3, Sig
|
|
Dim As Double t0 = Timer
|
|
Do
|
|
If Sieve(N \ 2 - 1) Then ' is prime
|
|
Sig = GetSig(N)
|
|
If Sig = Sig0 Andalso Sig = Sig1 Then
|
|
Cnt += 1
|
|
If Cnt <= 25 Then
|
|
Print Using "#,###,###,###"; N0;
|
|
If Cnt Mod 5 = 0 Then Print
|
|
End If
|
|
End If
|
|
Sig0 = Sig1: Sig1 = Sig
|
|
N0 = N1: N1 = N
|
|
End If
|
|
If N >= limite Then Print Cnt; " Ormiston triples before one billion." : Exit Do
|
|
N += 2
|
|
Loop
|
|
|
|
Sleep
|