Hey Emillie.
Hvis du ønsker at optimere din løsning vil jeg gerne fraråde dig at bruge tid på tråde. Paralellisme er først og fremmest skide svært, men vigtigst af alt, bruger du en naiv og meget langsom algoritme...
En langt bedre (og kode-mæssig simplel) løsning er Miller Rabins Primtals Test. Tjek:
http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_testJeg har lavet en implementering her:
- import java.util.Random;
-
-
- public class MillerRabin {
- private static int countPrim = 0;
-
- public static void main(String[] args) {
- CalcPrim(10, 37870);
- }
-
- /**
- * Repeats the Miller Rabin test
- * @param start
- * @param end
- */
- private static void CalcPrim(int start, int end) {
- if(start % 2 == 0) //even then get next odd
- start++;
-
-
- for(int i = start; i < end; i=i+2){
- MillerRabinTest(i, 2);
- }
-
- System.out.println("Number of prims "+countPrim);
- }
-
- /**
- * Calc s and t and calc calculator
- * @param test-number
- * @param times we will test
- */
- private static void MillerRabinTest(int m, int repeat) {
- Random b = new Random();
-
- //find s and t
- int t = m-1;
- int s = 0;
- while(t%2 == 0){
- t = t/2;
- s++;
- }
-
- boolean aPrime = true;
- for(int i = 0; i < repeat; i++){
- if(!makeTest(s,t,b.nextInt(m-1)+1, m)){
- aPrime = false;
- }
- }
- if(aPrime == true){
- //System.out.println(m+" is a prim");
- countPrim++;
- }
-
- }
-
- private static long pow(int b, int t, int m){
- long res = 1;
- String binaryT = Integer.toBinaryString(t);
- for(int i = 0; i < binaryT.length(); i++){
- res = (res*res)%m;
- res = (res*(binaryT.substring(i,i+1).equals("1") ? b:1))%m;
- }
- return res%m;
- }
-
-
- private static boolean makeTest(int s, int t, int b, int m) {
- long y = (long) pow(b, t, m);
- if(y == 1){
- return true;
- }
- for(int i = 0; i<=s-1; i++){
- if(y == m-1){
- return true;
- }
- y = (long) pow((int) y, 2, m);
- }
- return false;
- }
-
- }
Derudover vil jeg også lige informerer dig. Flere tråde vil bare gøre din implementation concurrent. Du vil ikke bruge alle processorer ved at bruge den.