funktion um auf primzahl zu testen (zahlengröße 10000stellen und mehr)

  • Allgemein

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Triple-Axe.

    funktion um auf primzahl zu testen (zahlengröße 10000stellen und mehr)

    irgendwie bin ich blind. wenn ich eine 310 stellige zahl auf primzahl testen will geht es nicht
    309 stellen geht aber noch ;(

    fehler :

    System.OverflowException wurde nicht behandelt.
    Message=Der Wert für ein Double war zu groß oder zu klein.
    Source=Microsoft.VisualBasic
    mein button1

    VB.NET-Quellcode

    1. Dim test As String = Fast("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890") '310 stellen


    VB.NET-Quellcode

    1. Function Fast(ByVal n As String) As Boolean
    2. '(c) by http://dotnet-snippets.de/dns/effizientere-primzahlpruefung-grosser-zahlen-SID1373.aspx
    3. If n Mod 2 = 0 OrElse n Mod 3 = 0 OrElse n Mod 7 = 0 OrElse n Mod 5 = 0 Then Return False
    4. Dim r As Single = Math.Sqrt(n), f As Short = 11
    5. If r Mod 1 = 0 Then Return False
    6. While f <= r
    7. If n Mod f = 0 OrElse n Mod (f + 2) = 0 Then Return False
    8. f += 6
    9. End While
    10. Return True
    11. End Function


    kann mir jemand n tip geben was da falsch ist bzw was ich sonst machen könnte um richtig große zahlen auf prim zu testen

    EDIT : modulo ist double also kann es keine 310 stellen ;( :pinch:
    nene du hast mich falsch verstanden :
    If n Mod 2 = 0 OrElse n Mod 3 = 0 OrElse n Mod 7 = 0 OrElse n Mod 5 = 0 Then Return False
    DAS

    VB.NET-Quellcode

    1. Mod
    ist Double ;(

    ich werd mal schauen ob ich damit dotnetperls.com/prime was gebastelt bekomm was mit mod ersetzt

    ich habe das vb2010 von meinem dad finanziert bekommen also von der seite für alles offen

    edit :

    c# 2 .net converter spuckt modulo aus developerfusion.com/tools/convert/csharp-to-vb/

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Function IsPrime(candidate As Integer) As Boolean
    2. ' Test whether the parameter is a prime number.
    3. If (candidate And 1) = 0 Then
    4. If candidate = 2 Then
    5. Return True
    6. Else
    7. Return False
    8. End If
    9. End If
    10. ' Note:
    11. ' ... This version was changed to test the square.
    12. ' ... Original version tested against the square root.
    13. ' ... Also we exclude 1 at the very end.
    14. Dim i As Integer = 3
    15. While (i * i) <= candidate
    16. If (candidate Mod i) = 0 Then
    17. Return False
    18. End If
    19. i += 2
    20. End While
    21. Return candidate <> 1
    22. End Function


    mal ne doove frage wie prüfe ich ohne MOD / modulo eine division auf rest :?:

    edit : wenn das mein mathe lehrer sehen würde der würde mir den hals umdrehen :D
    aber nur unter der bedingung das mich der it ausbilder nicht vorher erwischt

    @ wer auch immer das liest : schonmal ne primzahl gebaut ?
    wenn ja über 15 stellen ?


    kann mir jemand sagen warum ich bei einer 15 stelligen zahl unter 1 sekunde brauche um sie zu generieren und auf prim zu testen und wenn nicht neu generieren zu lassen

    aber bei einer 16 stelligen zahl dauert es ca 10 min bei 100% cpu last ?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Triple-Axe“ ()

    Wenn, dann musst Du Integerdivision verwenden, kein Modulo.
    Und Du musst auch nur durch Primzahlen dividieren, um zu testen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab mal ne kleine IsPrime Erweiterung für BigInteger geschrieben.
    Wie gut das Ding performancemäßig ist, kann ich allerdings nicht sagen. Auch nicht, ob die AsParallel Sache irgendwas bringt ;)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Imports System.Numerics
    3. Imports System.Threading.Tasks
    4. Module Extensionmethods
    5. ''' <summary>
    6. ''' This function returns the largest BigInteger that multiplied with itself
    7. ''' is smaller or equal than the BigInteger to test
    8. ''' </summary>
    9. ''' <param name="num">The number of which the Sqrt should be calculated</param>
    10. ''' <returns>The Squareroot of num</returns>
    11. ''' <remarks></remarks>
    12. <Extension()>
    13. Public Function Sqrt(ByVal num As BigInteger) As BigInteger
    14. If num < 0 Then Throw New System.ArgumentException("Must be 0 or greater", "num")
    15. If num = 0 Then
    16. Return BigInteger.Zero
    17. ElseIf num < 4 Then
    18. Return BigInteger.One
    19. ElseIf num < 9 Then
    20. Return New BigInteger(2)
    21. End If
    22. Dim j_min, j_max, j_tmp, r As BigInteger
    23. j_min = BigInteger.One
    24. j_max = num >> 1
    25. While BigInteger.Add(j_min, BigInteger.One) < j_max
    26. j_tmp = BigInteger.Add(j_min, j_max) >> 1
    27. r = BigInteger.Multiply(j_tmp, j_tmp)
    28. If r = num Then
    29. j_min = j_tmp
    30. Exit While
    31. ElseIf r > num Then
    32. j_max = j_tmp
    33. Else
    34. j_min = j_tmp
    35. End If
    36. End While
    37. Return j_min
    38. End Function
    39. ''' <summary>
    40. ''' This is just for storing some precalculated primes to increase performance
    41. ''' </summary>
    42. ''' <param name="b"></param>
    43. ''' <returns></returns>
    44. ''' <remarks></remarks>
    45. <Extension()> Public Function PrecalculatedPrimes(ByVal b As BigInteger) As HashSet(Of BigInteger)
    46. Static h As New HashSet(Of BigInteger) From {
    47. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
    48. 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
    49. 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
    50. 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
    51. 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
    52. 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
    53. 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
    54. 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
    55. 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
    56. 467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
    57. 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
    58. 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
    59. 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
    60. 739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
    61. 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
    62. 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
    63. 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013,
    64. 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069,
    65. 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151,
    66. 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223,
    67. 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291,
    68. 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373,
    69. 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
    70. 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511,
    71. 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583,
    72. 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657,
    73. 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733,
    74. 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811,
    75. 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889,
    76. 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987,
    77. 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
    78. 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
    79. 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213,
    80. 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,
    81. 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
    82. 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
    83. 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531,
    84. 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617,
    85. 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
    86. 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
    87. 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819,
    88. 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903,
    89. 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
    90. 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
    91. 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181,
    92. 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257,
    93. 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
    94. 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,
    95. 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511,
    96. 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571,
    97. 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
    98. 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727,
    99. 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,
    100. 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907,
    101. 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
    102. 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
    103. 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139,
    104. 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231,
    105. 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
    106. 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,
    107. 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493,
    108. 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583,
    109. 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
    110. 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751,
    111. 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831,
    112. 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937,
    113. 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003,
    114. 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087,
    115. 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179,
    116. 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279,
    117. 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387,
    118. 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,
    119. 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521,
    120. 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639,
    121. 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693,
    122. 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791,
    123. 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
    124. 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939,
    125. 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053,
    126. 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133,
    127. 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221,
    128. 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301,
    129. 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367,
    130. 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473,
    131. 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571,
    132. 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,
    133. 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761,
    134. 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833,
    135. 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917,
    136. 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997,
    137. 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,
    138. 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,
    139. 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297,
    140. 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411,
    141. 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499,
    142. 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561,
    143. 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643,
    144. 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723,
    145. 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,
    146. 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919,
    147. 7927}
    148. Return h
    149. End Function
    150. <Extension()> Public Function IsPrime(ByVal num As System.Numerics.BigInteger) As Boolean
    151. If num < 1 Then Throw New System.ArgumentException("Must be greater than 0", "num")
    152. If num = 1 Then
    153. Return False
    154. ElseIf num = 2 OrElse num = 3 Then
    155. Return True
    156. End If
    157. Static pcp As HashSet(Of BigInteger) = PrecalculatedPrimes(BigInteger.Zero)
    158. ' Is it one of our precalced primes?
    159. If pcp.Contains(num) Then Return True
    160. ' Can it be divided by any of our precalced primes?
    161. Dim sq As BigInteger = Sqrt(num)
    162. Dim num_half As BigInteger = num >> 1
    163. Dim r = (From p As BigInteger In pcp Where p <= sq AndAlso BigInteger.Remainder(num, p) = 0 Select p Take 1).AsParallel
    164. If r.Count > 0 Then Return False
    165. Debug.Print("hot candidate: " & num.ToString)
    166. ' Check for any number ABOVE the largest prime in our precalced primes
    167. Dim i As BigInteger = PrecalculatedPrimes(BigInteger.Zero).Max
    168. Dim l As New List(Of BigInteger)
    169. While i <= sq
    170. While l.Count < 10000
    171. l.Add(i)
    172. i += 2
    173. If i > sq Then Exit While
    174. End While
    175. r = (From p In l Where BigInteger.Remainder(num, p) = 0 Select p Take 1).AsParallel
    176. If r.Count > 0 Then Return False
    177. l.Clear()
    178. End While
    179. Return True
    180. End Function
    181. End Module
    So, habs noch mal ein kleines bißchen optimiert (6k+1 bzw +5) und dann mal getestet:

    VB.NET-Quellcode

    1. Dim i As Numerics.BigInteger = UInt64.MaxValue
    2. i += 1
    3. Dim count As Integer = 0
    4. Dim stp As New Stopwatch
    5. stp.Start()
    6. Do
    7. count += 1
    8. If i.IsPrime Then
    9. Exit Do
    10. End If
    11. i += 1
    12. Loop
    13. stp.Stop()
    14. TextBox1.Text = "Found " & i.ToString & " in " & count & " numbers in " & stp.Elapsed.ToString
    15. MessageBox.Show("Found " & i.ToString & " in " & count & " numbers in " & stp.Elapsed.ToString)



    Ergebnis:
    Found 18446744073709551629 in 14 numbers in 00:07:50.0400636 (also knapp 8 Minuten)

    Das ganze auf meinem nicht gerade schnellen Pentium Dual Core E6300 (2.8GHz). Gestartet aus der IDE als Release/x86

    Jetzt müsste ich nur noch wissen ... ist 18446744073709551629 denn nun wirklich prim? ;) Und die anderen 13 Zahlen davor nicht? Die Online Tools die ich gefunden habe, helfen nicht, da sie nur bis max 15/16 Stellen prüfen, aber meine hat ja nun 20 Stellen.
    krass dein code ;)


    prim = prim wenn : nur durch 1 oder sich selber teilbar ...
    wenn eine zahl ein gerades ende hat und nicht die komplette zahl nicht 2 ist : kein prim


    mal eben von hand testen :

    Quellcode

    1. 18446744073709551629 / 2 = 9223372036854775814,5 > könnte prim sein da , zahl
    2. 18446744073709551629 / 3 = 6148914691236517209,6666666666667 > könnte prim sein da , zahl
    3. 18446744073709551629 / 4 = 4611686018427387907,25 > könnte prim sein da , zahl
    4. 18446744073709551629 / 5 = 3689348814741910325,8 > könnte prim sein da , zahl
    5. 18446744073709551629 / 6 = 3074457345618258604,8333333333333 > könnte prim sein da , zahl
    6. 18446744073709551629 / 7 = 2635249153387078804,1428571428571 > könnte prim sein da , zahl
    7. 18446744073709551629 / 8 = 2305843009213693953,625 > könnte prim sein da , zahl
    8. 18446744073709551629 / 9 = 2049638230412172403,2222222222222 > könnte prim sein da , zahl
    9. 18446744073709551629/1=18446744073709551629 > is klar *G
    10. 18446744073709551629/18446744073709551629=1


    ich behaupte : ist prim :D

    hier ein onlineprimtester der es kann :

    jjam.de/Java/Applets/Primzahlen/Miller_Rabin.html

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Triple-Axe“ ()

    du musst aber mehr zahlen durchprobieren um das behaupten zu können...
    Alles was du bei deinen Rechnungen umsonst gemacht hast, ist durch die jeweiligen Vielfachen zu teilen(also 4,3,8,9, da bei denen das Ergebnis klar war, aber was ist mit 11, 13, 17 und all den anderen schönen Primzahlen die noch reinpassen könnten?!)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    du musst aber mehr zahlen durchprobieren um das behaupten zu können...
    Alles was du bei deinen Rechnungen umsonst gemacht hast, ist durch die jeweiligen Vielfachen zu teilen(also 4,3,8,9, da bei denen das Ergebnis klar war, aber was ist mit 11, 13, 17 und all den anderen schönen Primzahlen die noch reinpassen könnten?!)
    stimmt :pinch:

    also eher mit de.wikipedia.org/wiki/Miller-Rabin-Test testen danke dir für den tip ich sollte mal pause machen :D