fork download
  1. // 変な数字は考慮しない
  2.  
  3. class PrimeMT{
  4. public int num;
  5. public boolean[] primeData;
  6. public boolean[] primeDataSolved;
  7.  
  8. public PrimeMT(int n){
  9. num=n;
  10. initialize();
  11. solve();
  12. for (int i=-8;i<=8;i++)
  13. System.out.println("isPrime("+(num/2+i)+") -> "+isPrime(num/2+i));
  14. }
  15.  
  16. public static void main(String[] args){
  17. new PrimeMT(1000100);
  18. }
  19.  
  20. public void initialize(){
  21. primeData = new boolean[num]; // 全てfalse
  22. primeDataSolved = new boolean[num]; // 全てfalse
  23. primeData[0]=false; // ?
  24. primeData[1]=false;
  25. primeData[2]=true;
  26. }
  27.  
  28. public void solve(){
  29. Thread t1=new SolveThread(this);
  30. Thread t2=new SolveThread(this);
  31. Thread t3=new SolveThread(this);
  32. Thread t4=new SolveThread(this);
  33. try{
  34. t1.start();t2.start();t3.start();t4.start();
  35. t1.join();t2.join();t3.join();t4.join();
  36. e.printStackTrace();
  37. }
  38. }
  39.  
  40. public boolean isPrime(int i){
  41. if (i<0 || num<=i) return false;
  42. return primeData[i];
  43. }
  44.  
  45. public synchronized int getNext(int offset){
  46. for (;offset<num;offset++)
  47. if (!primeDataSolved[offset]){
  48. primeDataSolved[offset]=true;
  49. return offset;
  50. }
  51. return -1;
  52. }
  53. }
  54.  
  55. class SolveThread extends Thread{
  56. PrimeMT prime;
  57. int current;
  58. int num;
  59. public SolveThread(PrimeMT p){
  60. super();
  61. prime=p;
  62. num=p.num;
  63. current=3;
  64. }
  65. public void run(){
  66. while ((current=prime.getNext(current))!=-1){
  67. int j;
  68. for (j=2;j*j<current;j++)
  69. if (current%j==0) break;
  70. if (current%j!=0){
  71. prime.primeData[current]=true;
  72. for (j=1;j*current<num;j++)
  73. prime.primeDataSolved[j*current]=true;
  74. }
  75. }
  76. }
  77. }
Success #stdin #stdout 1.3s 321856KB
stdin
Standard input is empty
stdout
isPrime(500042) -> false
isPrime(500043) -> false
isPrime(500044) -> false
isPrime(500045) -> false
isPrime(500046) -> false
isPrime(500047) -> false
isPrime(500048) -> false
isPrime(500049) -> false
isPrime(500050) -> false
isPrime(500051) -> false
isPrime(500052) -> false
isPrime(500053) -> false
isPrime(500054) -> false
isPrime(500055) -> false
isPrime(500056) -> false
isPrime(500057) -> true
isPrime(500058) -> false