Wikipedia:Humorarchiv/Proofreadersche Primzahl
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
[Quelltext bearbeiten]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