PGSystemTester

Excel UDF Next Highest Prime Number For Excel

Jul 8th, 2017
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Function NextHighestPrimeNumber(StartingNumber As Double) As Variant
  2. Dim CeilingTest As Double
  3. Dim i As Double
  4. 'PGCodeRider
  5. 'Calculates answer to 10 trillion in 4 seconds on my laptop, which is pretty good.
  6.  
  7. If StartingNumber < 11 Then
  8.  
  9.             If StartingNumber > 6 Then
  10.                 NextHighestPrimeNumber = 11
  11.  
  12.             ElseIf StartingNumber > 4 Then
  13.                 NextHighestPrimeNumber = 7
  14.  
  15.             ElseIf StartingNumber > 2 Then
  16.                 NextHighestPrimeNumber = 5
  17.  
  18.             ElseIf StartingNumber > 0 Then
  19.                 NextHighestPrimeNumber = 3
  20.  
  21.             ElseIf StartingNumber = 0 Then
  22.                 NextHighestPrimeNumber = 1
  23.  
  24.             Else
  25.                 NextHighestPrimeNumber = "Pick A Positive Integer"
  26.  
  27.             End If
  28.  
  29.         Exit Function
  30.  
  31. Else
  32.  
  33. 'Create Array (Skips 3 and 5 because those are hard coded to check for to save time of calculating unnecassary square roots
  34.    ReDim prime_array(6) As Double
  35.         prime_array(0) = 7
  36.         prime_array(1) = 11
  37.         prime_array(2) = 13
  38.         prime_array(3) = 17
  39.         prime_array(4) = 19
  40.         prime_array(5) = 23
  41.         prime_array(6) = 29
  42.  
  43.     'zz failed code: If StartingNumber Mod 2 = 0 Then if over Long Limit (2.1 billion)
  44.    
  45.     If StartingNumber - (Int(StartingNumber / 2) * 2) = 0 Then
  46.         StartingNumber = StartingNumber - 1
  47.     End If
  48. End If
  49.  
  50.  
  51. NewNumber:
  52.         StartingNumber = StartingNumber + 2
  53.  
  54.         If StartingNumber - (Int(StartingNumber / 3) * 3) = 0 Then
  55.             GoTo NewNumber
  56.  
  57.         ElseIf StartingNumber - (Int(StartingNumber / 5) * 5) = 0 Then
  58.             GoTo NewNumber
  59.  
  60.         Else
  61.             CeilingTest = Int(VBA.Sqr(StartingNumber))
  62.         End If
  63.  
  64.  
  65. 'Array loop
  66.    For i = 0 To UBound(prime_array)
  67.         If prime_array(i) > CeilingTest Then
  68.             NextHighestPrimeNumber = StartingNumber
  69.             Exit Function
  70.  
  71.         ElseIf StartingNumber - (Int(StartingNumber / prime_array(i)) * prime_array(i)) = 0 Then
  72.             GoTo NewNumber
  73.  
  74.         End If
  75.     Next i
  76.  
  77.  
  78. ExpandArray:
  79.     ReDim Preserve prime_array(UBound(prime_array) + 1)
  80.     prime_array(UBound(prime_array)) = AddArrayFactorMember(prime_array())
  81.  
  82.  
  83.     If StartingNumber - (Int(StartingNumber / prime_array(UBound(prime_array))) * prime_array(UBound(prime_array))) = 0 Then
  84.         GoTo NewNumber
  85.  
  86.     'test if bigger than ceiling
  87.    ElseIf prime_array(UBound(prime_array)) > CeilingTest Then
  88.         NextHighestPrimeNumber = StartingNumber
  89.         Exit Function
  90.  
  91.     Else
  92.         GoTo ExpandArray
  93.     End If
  94.  
  95. End Function
  96.  
  97. Private Function AddArrayFactorMember(Old_Array() As Double) As Double
  98. Dim i As Double
  99. Dim StartingNumber As Double: StartingNumber = Old_Array(UBound(Old_Array) - 1)
  100.  
  101.  
  102. NewNumber:
  103.     StartingNumber = StartingNumber + 2
  104.    
  105.     If StartingNumber - (Int(StartingNumber / 3) * 3) = 0 Then
  106.         GoTo NewNumber
  107.        
  108.     ElseIf StartingNumber - (Int(StartingNumber / 5) * 5) = 0 Then
  109.         GoTo NewNumber
  110.    
  111.     Else
  112.         CeilingTest = Int(VBA.Sqr(StartingNumber))
  113.        
  114.     End If
  115.    
  116.  
  117.     For i = 0 To UBound(Old_Array)
  118.         If Old_Array(i) > CeilingTest Then
  119.             AddArrayFactorMember = StartingNumber
  120.             Exit Function
  121.  
  122.         ElseIf StartingNumber - (Int(StartingNumber / Old_Array(i)) * Old_Array(i)) = 0 Then
  123.             GoTo NewNumber
  124.            
  125.         End If
  126.        
  127.     Next i
  128.  
  129. End Function
Add Comment
Please, Sign In to add comment