Geschwindigkeitsvergleich (Benchmark) von & mit 10 Mio. großen Primzahlen Stand: 10.02.2019
zunächst 128-Bit-Zahl aus Primzahleigenschaften
gegeben : Prime(1000000000000000000000000)=58310039994836584070534263
Ergebnis: Prime(1000000000000000010000000)=58310039994836584663869571
Test 1: Befehl NextPrime(x) (bis 1000stellige Zahlen keine Fehler bekannt)
Sprache   \   CPU: i7-3770K 3.50GHz AMD FX-8320 3.5 GHz Ryzen 5 1500X 3.5GHz Ryzen 5 1600 3.4GHz i9-7900X 3.3...4.2 GHz AMD A6-5400K
c++GMP x64 V6b 20 Threads 106,3 s 79,2 s 34,7...36,4 s (3)
c++GMP x64 V6 20 Threads 121,6 s 105,4 s 75 s 37,3...49,6 s (3)
c++GMP x64 V5 20 Threads 150,5 s 67,57 s
c++GMP x64 V5 8 Threads 2,44 min 3,05 min
GP/PARI x64      1 Thread 8,18 min  
mathematica 11.3      4 Thread   9,61 min
c++GMP x64 V5 10,1 min  
c++GMP x32 V5 18,2 min  
c++GMP x32 V4 31 min  
JAVA x64 64 min > 2h (?)
Mathematica 82,63 min
c# x64 - (nur  J# )  
Test 2: Abkürzung mit ggT & PowMod, da Miller-Rabin-Test in diesem Bereich ohne Fehler
bekannte Fehler: Pseudoprimzahlen
Sprache   \   CPU: i7-3770K 3.50GHz AMD FX-8320 3.5 GHz Ryzen 5 1500X 3.5GHz Ryzen 5 1600 3.4GHz i9-7900X 3.3...4.2 GHz AMD Phenom II X6 3GHz
c++GMP x64 V6b 20 Threads 30,06 s 25,5 s 12,3...12,7 s (3) 52,9 s
c++GMP x64 V6 20 Threads 34,29 s 31,78 s 24,2 s 13,18..16,92 s (3)
c++GMP x64 V5 20 Threads 74 s - 36 s
c++GMP x64 V5 8 Threads 1,2 min (1) 1,6 min - 51,62 s
c++GMP x64 V5 1 Thread 5,01 min   Core2 T9300 2.50GHz
GP/PARI x64      1 Thread 8,18 min   - (kein 64 Bit möglich)
c++GMP x32 V5 1 Thread 11,38 min   23,46 min
JAVA x64           1 Thread (2) 11,57 min   -
c++ x64 192MulModRe 1Thread 14,60 min   -
c++ x64 192Bit WhileDouble 18,3 min 34,4 min -
c++GMP x32 V4 18,77 min    
c# x64 33,39 min    
c++ x64 192Bit WhileINT 45,5 min 47,3 min -
  Weiter ab hier mit Optimierung "nur bis 64 Bit" (also 10 Mio. 20stellige Primzahlen < 2^64 - 99)
gegeben : Prime(306268030480171300)=13169525310647365859
Ergebnis: Prime(306268030490171300)=13169525311087574047
Test 3: zunächst wieder mit NextPrime-Befehl
Sprache   \   CPU: i7-3770K 3.50GHz AMD FX-8320 3.5 GHz Ryzen 5 1500X 3.5GHz Ryzen 5 1600 3.4GHz i9-7900X 3.3...4.2 GHz
c++GMP x64 V5 8 Threads 58,6 s 73 s 55,6 s
GP/PARI x64      1 Thread 129 s        
c++GMP x64 V5 1 Thread 254,8 s 388 s      
mathematica 11.3 4 Threads       338,99 s=5,65 min
mathematica 11.3 1 Thread       1387,86 s=23,1 min
JAVA x64 BigInt 35,4 min  
Test 4: Abkürzung mit ggT & PowMod, da Miller Rabin-Test in diesem Bereich ohne Fehler (ohne GMP.dll)
Sprache   \   CPU: i7-3770K 3.50GHz AMD FX-8320 3.5 GHz Ryzen 5 1500X 3.5GHz Ryzen 5 1600 3.4GHz i9-7900X 3.3...4.3 GHz AMD Phenom II X6 3GHz
c++ 128MulModRe 20 Threads 23,4 s ? ? s ? s 7.39...7.5 s (4) ?
c++ 128MulModRe 20 Threads 23,80 s 17,87 s 18,5 s 13,2 s 8,3...11,15 s (3) 47,5 s
c++ 128MulModRe 8 Threads 22,41 s 16,49 s (0) 18,39 s 20...24,69 s (3)
c++ 128MulMod 8 Threads 23,47 s 17,66 s (0)
c++GMP x64 V5 8 Threads24,4 s 32,6 s
c++GMP x64 V5 1 Thread105,8 s 158,2 s
GP/PARI x64      1 Thread 157,9 s  
c++ 128MulMod  1 Thread 162,9 s  
c++GMP x32 V5    
JAVA x64 BigInt    
c++GMP x32 V4    
c# x64                 1 Thread 13,81 min 19,4 min
(0) Dieser letzte Test zeigt, dass gleichgetakete AMD-CPUs mit Ganzzahl 64Bit-MulMod schneller sind,
während Intel CPUs bei Floating Point & AVX-Befehlen schneller rechnen.
Die GMP Programme schaffen trotz 8 Threads nicht mal Verbesserungsfaktor 6, da die GMP-Befehle aus externer DLL die Parallelisierung ausbremsen.
(1) Mit 7 statt 8 Threads kaum messbare Verschlechterung. (vermutlich weil Turbo-Boost-Modus bei 89% etwas länger aktiv bleibt als bei 100% CPU-Last)
(2) JAVA schneidet nur deshalb so gut ab, weil PowMod per "Montgomery reduction" statt langsame while Schleife!
(3) zunächst mit Meltdown und Spectre Update KB4056892 4% langsamer; nach BIOS Optimierung 4,2 GHz (-2 -5) dann über 20% schneller!
(4) 16.11.2022: Neue GCD Optimierung mit tzcnt/builtin_ctz
Vergl. Software-Geschwindigkeitsvergleich 3^x & Liste-mathematische-Rekorde