Wikiup:Humorarchiv/Proofreadersche Primzahl

aus Wikipedia, der freien Enzyklopädie
< Wikiup:Humorarchiv
Dies ist die aktuelle Version dieser Seite, zuletzt bearbeitet am 11. Mai 2021 um 09:49 Uhr durch imported>Filzstift(1859).
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Diese Seite gehört zum Humorarchiv der deutschsprachigen Wikipedia.

Benutze keine dieser Artikel als Quelle für deine Arbeit oder Ähnliches. Denn die hier befindlichen Artikel gehören zu den Best-of unserer Fake-Artikel, sind blanker Unsinn, genügen nicht enzyklopädischen Ansprüchen oder wurden zu humoristischen Zwecken angelegt.

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

Literatur