Wikipedia:Humorarchiv/Proofreadersche Primzahl
Vorlage:Humorarchiv-Artikel Eine proofreadersche Primzahl ist eine Primzahl, die die Bedingung erfüllt, dass ihre Quersumme gleich dem Quadrat der Anzahl ihrer Ziffern ist. Sie wurden definiert durch Benutzer:Proofreader und erstmalig berechnet von Benutzer:Martin-vogel.
Es gibt nur endlich viele, denn jede Ziffer kann höchstens 9 sein, also ist die Quersumme bei n Stellen höchstens 9n. Da die Quersumme auch gleich n² sein soll, kann n höchstens 9 sein. Bei genau neun Stellen müsste die Zahl aus neun Neunen bestehen, das ist keine Primzahl, also kann eine proofreadersche Primzahl höchstens acht Stellen haben (Lit.: Scherben, 2005).
Es gibt insgesamt 5774 proofreadersche Primzahlen im Dezimalsystem, die ersten lauten:
- 13
- 31
- 1069
- 1087
- 1249
- 1429
- 1447
- 1483
- 1609
- 1627
- 1663
- 1753
- 1861
- 1933
- 1951
- 2239
- 2293
Die höchste lautet 99.999.847.
Von den 5774 proofreaderschen Primzahlen sind
0 1-stellig 2 2-stellig 0 3-stellig 93 4-stellig 741 5-stellig 0 6-stellig 4220 7-stellig 718 8-stellig
Proofreadersche Primzahlen gleicher Stellenanzahl unterscheiden sich durch ganzzahlige Vielfache von 18, da sie ungerade (Faktor 2) mit gleicher Quersumme (Faktor 9) sind.
Es gibt keine 3- und keine 6-stelligen proofreadersche Primzahlen, denn dann wäre das Quadrat der Stellenzahl 9 bzw. 36 und damit die Zahl durch 9 teilbar, also keine Primzahl.
Code
Der folgende VBA-Code berechnet alle proofreaderschen Primzahlen. Man kann ihn in den Skripteditor von Microsoft Office kopieren und anschließend durch Aufruf der Subroutine ProofreaderPrimes() starten. Die Ausgabe steht im Quelltext zu diesem Artikel als Kommentar.
Option Explicit
Public Function IsPrime(ByVal Zahl As Long) As Boolean
'Primzahltest
Dim l As Long
If Zahl <> 2 And (Zahl And 1) = 0 Then
Exit Function
ElseIf Zahl <> 3 And Zahl Mod 3 = 0 Then
Exit Function
End If
For l = 6 To Sqr(Zahl) + 1 Step 6
If Zahl Mod (l - 1) = 0 Then
Exit Function
ElseIf Zahl Mod (l + 1) = 0 Then
Exit Function
End If
Next
IsPrime = True
End Function
Public Function GetCheckSum(iValue As Long) As Integer
'Quersumme
Dim CheckSum As Integer
Dim sValue As String
Dim i As Integer
Dim ValueCount As Integer
Dim cValue As String
CheckSum = 0
sValue = CStr(iValue)
ValueCount = Len(sValue)
If ValueCount > 0 Then
For i = 1 To ValueCount
cValue = Mid$(sValue, i, 1)
If Asc(cValue) >= 48 And Asc(cValue) <= 57 Then
CheckSum = CheckSum + CInt(cValue)
End If
Next i
End If
GetCheckSum = CheckSum
End Function
Sub ProofreaderPrimes()
Dim i, i2 As Integer
Dim j As Long
Dim iPartSum, iSum As Integer
Debug.Print " 1 : (Anzahl 0)"
For i = 2 To 8 'Zahl der Stellen (>1 aber <9, da sonst immer i^2>GetCheckSum(j))
iPartSum = 0 'Anzahl Treffer zählen
i2 = i * i 'i^2
Debug.Print i; ": ";
For j = (10 ^ (i - 1) + 1) To (10 ^ i - 1) Step 2 'nur ungerade Zahlen
If j Mod 3 <> 0 Then 'durch 3 dividierbare Zahlen sind nicht prim
If GetCheckSum(j) = i2 Then 'Proofreadersche Bedingung
'Primzahlcheck (ganz innen, weil für große j am langsamsten)
If IsPrime(j) Then iPartSum = iPartSum + 1: Debug.Print j;
End If
End If
Next j
Debug.Print "(Anzahl " & iPartSum & ")"
iSum = iSum + iPartSum 'Anzahl Treffer summieren
Next i
Debug.Print "Gesamt: " & iSum
End Sub