54 lines
1.2 KiB
Plaintext
54 lines
1.2 KiB
Plaintext
' FB 1.05.0 Win64
|
|
|
|
Function isPrime(n As Integer) As Boolean
|
|
If n Mod 2 = 0 Then Return n = 2
|
|
If n Mod 3 = 0 Then Return n = 3
|
|
Dim d As Integer = 5
|
|
While d * d <= n
|
|
If n Mod d = 0 Then Return False
|
|
d += 2
|
|
If n Mod d = 0 Then Return False
|
|
d += 4
|
|
Wend
|
|
Return True
|
|
End Function
|
|
|
|
Sub getPrimeFactors(factors() As UInteger, n As UInteger)
|
|
If n < 2 Then Return
|
|
If isPrime(n) Then
|
|
Redim factors(0 To 0)
|
|
factors(0) = n
|
|
Return
|
|
End If
|
|
Dim factor As UInteger = 2
|
|
Do
|
|
If n Mod factor = 0 Then
|
|
Redim Preserve factors(0 To UBound(factors) + 1)
|
|
factors(UBound(factors)) = factor
|
|
n \= factor
|
|
If n = 1 Then Return
|
|
If isPrime(n) Then factor = n
|
|
Else
|
|
factor += 1
|
|
End If
|
|
Loop
|
|
End Sub
|
|
|
|
Dim factors() As UInteger
|
|
Dim primes(1 To 17) As UInteger = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59}
|
|
Dim n As UInteger
|
|
For i As UInteger = 1 To 17
|
|
Erase factors
|
|
n = 1 Shl primes(i) - 1
|
|
getPrimeFactors factors(), n
|
|
Print "2^";Str(primes(i)); Tab(5); " - 1 = "; Str(n); Tab(30);" => ";
|
|
For j As UInteger = LBound(factors) To UBound(factors)
|
|
Print factors(j);
|
|
If j < UBound(factors) Then Print " x ";
|
|
Next j
|
|
Print
|
|
Next i
|
|
Print
|
|
Print "Press any key to quit"
|
|
Sleep
|