patternjavaModerate
Yet another prime number generator
Viewed 0 times
numbergeneratoryetanotherprime
Problem
The question asked to find all the prime numbers within a particular range. The way I approached this was to loop through each of the numbers within the range and for each number check whether it's a prime. My method for checking prime is to start at 3 and loop till number/2 in hops of 2 (essentially excluding all the even numbers).
Can somebody take a look at the code an tell me how I might be able to better this snippet and what are some of the aspects that I am missing?
Can somebody take a look at the code an tell me how I might be able to better this snippet and what are some of the aspects that I am missing?
public class PrimeBetween{
public static void main(String[] args){
printAllPrimes(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
}
public static void printAllPrimes(int start,int end){
for(int i = start;i <= end;i++){
if(isPrime(i))
System.out.println("Print prime:"+i);
}
}
private static boolean isPrime(int i){
if(i%2 == 0 && i!=2)
return false;
else{
if(i == 1) return false;
for(int p=3;p<=i/2;p+=2){
if(i%p == 0)
return false;
}
return true;
}
}
}Solution
Well, for starters, it is a proven mathematical fact that if a number is prime, it is not divisible by any prime number that is less than its square root. In your inner loop you go up to
Because you are checking for a range of numbers, you would probably benefit from a cache of primes, rather than testing every odd number less than the square root.
Something like this:
i/2 and you can change this to Math.floor(Math.sqrt(i)).Because you are checking for a range of numbers, you would probably benefit from a cache of primes, rather than testing every odd number less than the square root.
Something like this:
package mypackage;
import java.util.ArrayList;
/**
* Checks for primeness using a cache.
*/
public class PrimeCache {
private static ArrayList cache = null;
static {
cache = new ArrayList();
cache.add(2);
}
public static boolean isPrime(int i) {
if (i == 1) return false; // by definition
int limit = (int) Math.floor(Math.sqrt(i));
populateCache(limit);
return doTest(i, limit);
}
private static void populateCache(int limit) {
int start = cache.get(cache.size() - 1) + 1;
for (int i = start; i <= limit; i++) {
if (simpleTest(i)) cache.add(i);
}
}
private static boolean simpleTest(int i) {
int limit = (int) Math.floor(Math.sqrt(i));
return doTest(i, limit);
}
private static boolean doTest(int i, int limit) {
int counter = 0;
while (counter < cache.size() && cache.get(counter) <= limit) {
if (i % cache.get(counter) == 0) return false;
counter++;
}
return true;
}
}Code Snippets
package mypackage;
import java.util.ArrayList;
/**
* Checks for primeness using a cache.
*/
public class PrimeCache {
private static ArrayList<Integer> cache = null;
static {
cache = new ArrayList<Integer>();
cache.add(2);
}
public static boolean isPrime(int i) {
if (i == 1) return false; // by definition
int limit = (int) Math.floor(Math.sqrt(i));
populateCache(limit);
return doTest(i, limit);
}
private static void populateCache(int limit) {
int start = cache.get(cache.size() - 1) + 1;
for (int i = start; i <= limit; i++) {
if (simpleTest(i)) cache.add(i);
}
}
private static boolean simpleTest(int i) {
int limit = (int) Math.floor(Math.sqrt(i));
return doTest(i, limit);
}
private static boolean doTest(int i, int limit) {
int counter = 0;
while (counter < cache.size() && cache.get(counter) <= limit) {
if (i % cache.get(counter) == 0) return false;
counter++;
}
return true;
}
}Context
StackExchange Code Review Q#10823, answer score: 11
Revisions (0)
No revisions yet.