41 lines
1.5 KiB
VB.net
41 lines
1.5 KiB
VB.net
Imports System, System.Collections.Generic, System.Linq, System.Console
|
|
|
|
Module LongPrimes
|
|
|
|
Function Period(ByVal n As Integer) As Integer
|
|
Dim m As Integer, r As Integer = 1
|
|
For i As Integer = 0 To n : r = 10 * r Mod n : Next
|
|
m = r : Period = 1 : While True
|
|
r = (10 * r) Mod n : If r = m Then Return Period
|
|
Period += 1 : End While
|
|
End Function
|
|
|
|
Sub Main()
|
|
Dim primes As IEnumerable(Of Integer) = SomePrimeGenerator.Primes(64000).Skip(1).Where(Function(p) Period(p) = p - 1).Append(99999)
|
|
Dim count As Integer = 0, limit As Integer = 500
|
|
WriteLine(String.Join(" ", primes.TakeWhile(Function(p) p <= limit)))
|
|
For Each prime As Integer In primes
|
|
If prime > limit Then
|
|
WriteLine($"There are {count} long primes below {limit}")
|
|
limit <<= 1 : End If : count += 1 : Next
|
|
End Sub
|
|
|
|
End Module
|
|
|
|
Module SomePrimeGenerator
|
|
|
|
Iterator Function Primes(lim As Integer) As IEnumerable(Of Integer)
|
|
Dim flags As Boolean() = New Boolean(lim) {},
|
|
j As Integer = 2, d As Integer = 3, sq As Integer = 4
|
|
While sq <= lim
|
|
If Not flags(j) Then
|
|
Yield j : For k As Integer = sq To lim step j
|
|
flags(k) = True : Next
|
|
End If : j += 1 : d += 2 : sq += d
|
|
End While : While j <= lim
|
|
If Not flags(j) Then Yield j
|
|
j += 1 : End While
|
|
End Function
|
|
|
|
End Module
|