素数

ほぼ日連載中のシリコンの谷は、いま。(http://www.1101.com/siliconvalley/2003-11-04.html)に触発されて、n番目の素数を求めるプログラムを作ってみた。

import java.util.*;

public class PrimeNumber {
	
  /** 生成した素数を保存 */
  private Vector primes;
	
  /** 最小値=2 */
  public static final int MINIMUM_PRIME = 2;
	
  /**
   * n番目の素数を返す
   */
  public int getPrime(int n) {
		
    if (n == 1) return MINIMUM_PRIME;
		
    this.primes = new Vector();
    this.primes.add(new Integer(MINIMUM_PRIME));
		
    int p = MINIMUM_PRIME + 1;
    for (int i = 2; i < n; i++) {
      this.primes.add(new Integer(p));
      do {
        p += 2;
      } while (!isPrime(p));
    }
    return p;
  }
	
  /**
   * 引数が素数かどうかを判定 
   * @param   number  判定したい数値
   * @return  true:素数、false:素数ではない
   */
  private boolean isPrime(int number) {
		
    if (number == MINIMUM_PRIME) return true;
    for (int i = 0; i < this.primes.size(); i++) {
      if (((Integer)this.primes.get(i)).intValue() > number / 2) break;
      if (number % (((Integer)this.primes.get(i))).intValue() == 0) {
        return false;
      }
    }
    return true;
  }
	
  public static void main(String args[]) {
    if (args.length == 0) {
      System.exit(0);
    }
    PrimeNumber primeNumber = new PrimeNumber();
    int n = Integer.parseInt(args[0]);
    System.out.println(Integer.toString(n) + "番目の素数は"
      + Integer.toString(primeNumber.getPrime(n)) + "です\n");
  }
}

速度はまあまあだけど、コードが冗長になってしまった。もうちょっとエレガントにしたいなぁ。(ちなみに1000番目の素数は7919)
しかし、いきなり面接でこんなこと言われたらきっとパニックだわ。シリコンバレーへの道は遠い。(っていつから目指してたんだ?)