PDA

View Full Version : Java Prime Number Finder...



4th gen
03-30-2004, 10:25 PM
I started writing (badly ;) ) a prime number finder in java code today...below is where I'm at just now, however, it returns "4" as a prime number (which it obviously isn't), however, I can't sort it for the correct "4" output without either breaking the program or 'cheating' by starting > 4. Anyone got any ideas? :)


public class primefinder
{
public static void main(String[] args)
{
 int count1 = 0;
 int count2 = 0;
 
 for(int number=2; number<50; number++)
 {
   count1 = 0;
   for(int i=2; i<number/2; i++)
   {
      count2 = 0;
    if(number%2 == 0.0)
    {
         count2++;
         break;
       }
    else  
    {
      if(number%i == 0.0)
       count1++;
       }
   }
   if(count1 == 0 && count2 == 0)
     System.out.println(number+" is a prime number");
 }
   }
}

Entity101
03-30-2004, 10:33 PM
public boolean isPrime(long number)
{
  if ((number % 2 == 0) && (number != 2))
    return false;
  long endNum = (long)Math.sqrt((double)number);
  long curNum = 3;
  long remainder;
  while (curNum <= endNum)
  {
    remainder = number % curNum;
    if (remainder == 0)
      return false;
    curNum += 2;
  }
  return true;
}

4th gen
03-30-2004, 10:38 PM
Nice program! Did you write it?
Sadly mine works at finding prime numbers from a range of inputs (i.e. find all prime numbers from 2 - 1000), rather than checking whether an inputted number is prime...:(

edit: just saw your edit :)

ilw
03-30-2004, 11:37 PM
I tried briefly

for (number = (a + (a % 2)); number <= b&#59; number+2)
{
max = (number - (number % 2)) / 2   // round down &  halve
        max = max - 1 + (max % 2)  // To make it odd
for (denominator = max; denominator >= 3; denominator - 2)
{
if number % denominator = 0
{
break
}

if denominator ==3
prime found ...
}
}


doesn't find primes 1,2,3 but i think it should work after that, obviously its not written in proper code. I didn't really understand what you meant about '4' thing...

Even if you ignore the rest of my code, adding 2s judiciously instead of ++ will save you code and runtime.

Lamsey
03-31-2004, 12:23 AM
Here's mine:

/* Returns the prime numbers from 2 to 100000
*
* By Lamsey
*/
public class PrimeFinder
{
 public static void main(String[] args)
 {
   boolean prime;
   for (int number = 2; number < 1000001; number++)
   {
     prime = true;
     if ((number % 2) == 0)
       prime = false;
     else
     {
       for (int x = 3; x <= (number / 2); x += 2)
       {
         if ((number % x) == 0)
         {
           prime = false;
           break;
         }
       }
     }
     if (prime)
      System.out.println(number+" is prime.");
     else
      System.out.println(number+" is not prime.");
   }
 }
}

4th gen
03-31-2004, 12:25 AM
My finished one:



public class primefinder
{
public static void main(String[] args)
{
 int count1 = 0;
 int count2 = 0;
 long start_time = 0, end_time = 0;
 
 start_time = System.currentTimeMillis();
 
 for(int number=2; number<1000; number++)
 {
   count1 = 0;
   
   for(int i=2; i<=number/2; i++)
   {
      count2 = 0;
    if(number%2 == 0.0)
    {
         count2++;
         break;
       }
    else  
    {
      if(number%i == 0.0)
       count1++;
       }
   }
   if(count1 == 0 && count2 == 0)
     System.out.println(number+" is a prime number");
 }
 System.out.println("Finished");
 end_time = System.currentTimeMillis();
 System.out.println("Time taken = "+(end_time - start_time));
   }
}


Sorry, ilw, but I never understood what you said :(

4th gen
03-31-2004, 12:34 AM
Mine takes 31ms to find all primes <1000, Lamesy&#39;s takes 141
Mine takes 594ms to find all primes <10000, Lamesy&#39;s takes 703
Mine takes 41125 to find all primes <100000, Lamsey&#39;s takes 8641.

So, it looks like mine is faster for relatively small tasks, but Lamesy&#39;s is quicker for larger tasks...

Interestingly, removing the printline statement from Lamesy&#39;s (for when the number is not prime), brings his execution time for primes <100000 down to 3532ms, less than half...

I&#39;ve got to say his is better than mine :)

4th gen
03-31-2004, 01:24 AM
After tweaking Lamesy&#39;s code further, I&#39;ve just seen 16ms execution for primes <1000 and the average is around about 20-23ms, which is pretty quick :o

edit:



public class lamseycode
{
&nbsp;public static void main&#40;String&#91;&#93; args&#41;
&nbsp;{
&nbsp; &nbsp;boolean prime;
&nbsp; &nbsp;double start_time, end_time;
&nbsp; &nbsp;start_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp;for &#40;int number = 1; number &#60; 1000; number += 2&#41;
&nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp;prime = true;
&nbsp; &nbsp; &nbsp;for &#40;int x = 3; x &#60;= &#40;number / 2&#41;; x += 2&#41;
&nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;if&#40;number % x == 0&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prime = false;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;
&nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;if &#40;prime&#41;
&nbsp; &nbsp; &nbsp;System.out.println&#40;number+&#34; is prime.&#34;&#41;;
&nbsp; &nbsp; }
&nbsp; &nbsp; end_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp; System.out.println&#40;&#34;Time taken = &#34;+&#40;end_time - start_time&#41;&#41;;
&nbsp; }
}

4th gen
03-31-2004, 01:36 AM
After taking out all printline statements (just running a count on the number of primes) and using Lamsey&#39;s code, the execution time for primes <10000 (ten thousand, as compared to 1000 in the last post) is now 47ms :o :lol: :o



public class lamsey
{
&nbsp;public static void main&#40;String&#91;&#93; args&#41;
&nbsp;{
&nbsp; &nbsp;boolean prime;
&nbsp; &nbsp;int primes = 0;
&nbsp; &nbsp;double start_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp;for &#40;int number = 1; number &#60; 10000; number += 2&#41;
&nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp;prime = true;
&nbsp; &nbsp; &nbsp;for &#40;int x = 3; x &#60;= &#40;number / 2&#41;; x += 2&#41;
&nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;if&#40;number % x == 0&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prime = false;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;
&nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;if &#40;prime&#41;
&nbsp; &nbsp; &nbsp; &nbsp;primes++;
&nbsp; &nbsp; }
&nbsp; &nbsp; double end_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp; System.out.println&#40;&#34;Time taken = &#34;+&#40;end_time - start_time&#41;&#41;;
&nbsp; &nbsp; System.out.println&#40;&#34;Primes found = &#34;+primes&#41;;
&nbsp; }
}

Lamsey
03-31-2004, 03:28 PM
Great, now you have a program with no output. Very useful. :rolleyes:

I really wanted to know if 95,247 was prime or not :P

4th gen
03-31-2004, 03:34 PM
Originally posted by Lamsey@31 March 2004 - 14:28
Great, now you have a program with no output. Very useful. :rolleyes:

I really wanted to know if 95,247 was prime or not :P
Well, the point of removing the output was that it now shows you just how long it takes to calculate them, not to display them...

Besides, if you wanted to show them, you could always output to text file...

4th gen
03-31-2004, 04:33 PM
This code outputs the results to a text file, only slowing the program down by about 0.15 seconds for all primes < 100000 :D



import java.util.*;
import java.io.*;

public class lamsey
{
&nbsp;public static void main&#40;String&#91;&#93; args&#41; throws Exception
&nbsp;{
&nbsp; &nbsp;File outFile = new File&#40;&#34;primes.txt&#34;&#41;;
FileOutputStream outFileStream = new FileOutputStream&#40;outFile&#41;;
PrintWriter outStream = new PrintWriter&#40;outFileStream&#41;;
&nbsp; &nbsp;
&nbsp; &nbsp;boolean prime;
&nbsp; &nbsp;int primes=0;
&nbsp; &nbsp;double start_time=System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp;System.out.println&#40;&#34;Working...please wait&#34;&#41;;
&nbsp; &nbsp;for &#40;int number=1;number&#60;100000;number+=2&#41;
&nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp;prime=true;
&nbsp; &nbsp; &nbsp;for &#40;int x=3;x&#60;=number/2;x+=2&#41;
&nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;if&#40;number%x==0&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prime=false;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;
&nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;if&#40;prime&#41;
&nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;primes++;
&nbsp; &nbsp; &nbsp; &nbsp;outStream.println&#40;number+&#34; is a prime number&#34;&#41;;
&nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp;}
&nbsp; &nbsp;double end_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp;System.out.println&#40;&#34;Time taken = &#34;+&#40;end_time - start_time&#41;&#41;;
&nbsp; &nbsp;System.out.println&#40;&#34;Primes found = &#34;+primes&#41;;
&nbsp;}
}

4th gen
04-02-2004, 11:39 PM
This code is a little bit quicker than mine and Lamesy&#39;s attempts so far:


import java.lang.*;

class sieve
{
public static void main &#40;String &#91;&#93; args&#41;
&nbsp; &nbsp;{
&nbsp;final int max = 100000;
&nbsp; &nbsp; &nbsp; &nbsp;final int startat = 1;
&nbsp; &nbsp; &nbsp; &nbsp;int n = max;
&nbsp; &nbsp; &nbsp; &nbsp;double limit;
&nbsp; &nbsp; &nbsp; &nbsp;double start_time=0, end_time=0;
&nbsp; &nbsp; &nbsp; &nbsp;int primesfound=0;
&nbsp; &nbsp; &nbsp; &nbsp;start_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;boolean numberpool &#91;&#93; = new boolean &#91;n&#93;;
&nbsp; &nbsp; &nbsp; &nbsp;for&#40;int i=2; i&#60;n; i++&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; numberpool&#91;i&#93;=true;
&nbsp; &nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp; &nbsp;limit = Math.sqrt&#40;n&#41;;
&nbsp; &nbsp; &nbsp; &nbsp;int j=2;
&nbsp; &nbsp; &nbsp; &nbsp;for &#40;int i=j+j; i&#60;n; i=i+j&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; numberpool&#91;i&#93;=false;
&nbsp; &nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp; &nbsp;for &#40;j=3; j&#60;=limit; j=j+2&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; if &#40;numberpool&#91;j&#93;==true&#41;
&nbsp; &nbsp; &nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for &#40;int i=j+j; i&#60;n; i=i+j&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; numberpool&#91;i&#93;=false;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp; &nbsp;System.out.println&#40;&#34;Prime Numbers from &#34; + startat + &#34; to &#34; + max + &#34;&#58;&#34;&#41;;
&nbsp; &nbsp; &nbsp; &nbsp;for &#40;int i=startat; i&#60;max; i++&#41;
&nbsp; &nbsp; &nbsp; &nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp; if &#40;numberpool&#91;i&#93;==true&#41;
&nbsp; &nbsp; &nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;primesfound++;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp; &nbsp;end_time = System.currentTimeMillis&#40;&#41;;
&nbsp; &nbsp; &nbsp; &nbsp;System.out.println&#40;&#34;Time taken = &#34;+&#40;end_time - start_time&#41;&#41;;
&nbsp; &nbsp; &nbsp; &nbsp;System.out.println&#40;&#34;Number of primes found &#34;+primesfound&#41;;
&nbsp; &nbsp;}
}


I should say it&#39;s not my code (well, I never wrote it anyway), but here are a few results:

Prime Numbers from 1 to 100000:
Time taken = 16.0ms
Number of primes found 9592

Prime Numbers from 1 to 1000000:
Time taken = 94.0ms
Number of primes found 78498

Prime Numbers from 1 to 10000000:
Time taken = 860.0ms
Number of primes found 664579

:o