n 番目の素数を計算 (n <= 100000)
// <applet code="PrimeApp.class" width="177" height="77"></applet> /** * 素数を求める Java Applet * @see https://mind.kittttttan.info/math/primeapp.html */ import java.applet.Applet; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JTextField; import java.awt.Container; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class PrimeApp extends Applet implements ActionListener { private final static int MAX = 100000; private Container contentPane; private JPanel panel1; private JPanel panel2; private JButton btn; private JLabel labelp; private JLabel labelt; private JTextField tf; /** * Initialize */ public void init() { btn = new JButton("OK"); btn.addActionListener(this); tf = new JTextField("7", 7); //tf.setToolTipText("Input Integer"); labelp = new JLabel("Prime Number"); labelt = new JLabel("Time[ms]"); panel1 = new JPanel(); panel1.add(tf); panel1.add(btn); panel2 = new JPanel(); panel2.add(labelp); panel2.add(labelt); add(panel1, BorderLayout.CENTER); add(panel2, BorderLayout.SOUTH); } /** * Called when button pushed */ public void actionPerformed(ActionEvent e) { try { long start = System.currentTimeMillis(); String s = tf.getText(); int n = Integer.parseInt(s); if (n > MAX) { labelp.setText("too BIG"); labelt.setText("Error"); return; } //int p = getPrime(n); int p = sieve(n); long stop = System.currentTimeMillis(); String ps = String.valueOf(p); String t = String.valueOf(stop - start) + "ms"; labelp.setText(ps); labelt.setText(t); } catch (NumberFormatException err) { labelp.setText("Input 1, 2, ..."); labelt.setText("Error"); } catch (ArrayIndexOutOfBoundsException err) { labelp.setText("ArrayIndexOut"); labelt.setText("Error"); } } /** * Get <var>n</var>th prime number * @param n * @return prime number */ public static int getPrime(int n){ if (n < 1) { return -1; } if (n < 2) { return 2; } int[] primes = new int[n]; int index = 2, i, j, pj; primes[0] = 2; primes[1] = 3; boolean addflag; for (i = 5; index < n; i+=2) { addflag = true; for (j = 1; (pj = primes[j]) * pj <= i; j++) { if (i % pj == 0) { addflag = false; break; } } if (addflag) { primes[index++] = i; } } return primes[index - 1]; } /** * Get <var>n</var>th prime number * @param n * @return prime number */ public static int sieve(int n) { if (n < 1) {return 0;} double times; if (n < 50) {times = 5;} else {times = Math.log(n) + 2;} int limit = (int)Math.floor(n*times); int sq = (int)Math.sqrt(limit); boolean[] s = new boolean[limit+1]; int i, j; s[0] = false; s[1] = false; for (i = 2; i < limit+1; i++) { s[i] = true; } for (i = 2; i < sq+1; i++) { if (s[i]) { for (j = i*i; j < limit+1; j+=i) { s[j] = false; } } } int[] primes = new int[n]; j = 0; for (i = 0; j < n; i++) { if (s[i]) {primes[j++] = i;} } return primes[j - 1]; } }