Hampir tentang bilangan prima (metode inkremental cepat untuk menghitung bilangan prima)

Setelah Anda serius memikirkan apa yang paling tidak perlu untuk menghitung urutan bilangan prima dari yang pertama hingga N? Kami mengambil semua yang kami butuhkan dan membuang yang tidak perlu - resep untuk strategi yang sukses. Dalam hal ini, perlu untuk mempertimbangkan semua operasi cepat dan membuang semua yang padat karya, seperti divisi. Dan orang yang memutuskan untuk menggambarkan bilangan prima melalui operasi divisi tampaknya telah memainkan trik pada kemanusiaan. Millennia berlalu, dan orang-orang masih terus berbagi ...


Kode pertama:


public HashMap<Long, Long> serialPrimes() {
   long range = Long.parseLong(this.range.getText().toString());
   HashMap<Long, Long> primes = new HashMap<>(); //    
   HashMap<Long, ArrayList<Long>> spectres = new HashMap<>(); //     
   HashMap<Long, ArrayList<Long>> toppings = new HashMap<>(); //      
   for(long i = 2; i < range; i++){
       if(toppings.keySet().contains(i)) { //      ,     i
           //  
           ArrayList<Long> spectre = toppings.get(i);
           spectres.put(i, spectre);
           toppings.remove(i);
           for(long spectreValue : spectre) {
               //      
               long topping = primes.get(spectreValue) + spectreValue;
               primes.put(spectreValue, topping);
               //    
               if(toppings.keySet().contains(topping)) {
                   toppings.get(topping).add(spectreValue);
               } else {
                   ArrayList<Long> newSpectre = new ArrayList<>();
                   newSpectre.add(spectreValue);
                   toppings.put(topping, newSpectre);
               }
           }
       } else { //      ,     i
           //   
           primes.put(i, i + i); //       ,   
   //   
           //     
           ArrayList<Long> newSpectre = new ArrayList<>();
           newSpectre.add(i);
           toppings.put(i + i, newSpectre);
       }
   }
   return primes;
}

Sekarang penjelasan.


, .


API P2P .


, -.


3 :



:


  • , 2 ()
  • T
  • ,
  • 2*n (, 2[4])
  • 4[2]
  • ,
  • ( , )

, .


1.500.000. , 2 . -, 3.000.000. 96 , 14 ( , ).


Dalam kisaran 2 hingga 3.000.000 terletak 216.816 bilangan prima.


Contoh Android


PS: Terlepas dari kelambatan operasi, kisaran bilangan prima dihitung dengan ayakan Eratosthenes atau hanya memeriksa nomor individu untuk kesederhanaan. Tetapi ketika urutan lengkap mereka diperlukan, maka perlu untuk berpikir kira-kira sama seperti yang dijelaskan di atas.
Tapi ayakan masih mengulangi semua angka, mencoba untuk membagi nomor yang diuji menjadi mereka. Satu-satunya "keuntungan" adalah tidak membuang-buang memori untuk menyimpan perhitungan menengah. Tapi, mungkin, butuh lebih banyak waktu untuk memeriksa satu nomor daripada menemukan semua bilangan prima sebelumnya dengan algoritma ini.


All Articles