//******************************************************************************
//
// File: Prime32File.java
// Package: edu.rit.hyb.prime
// Unit: Class edu.rit.hyb.prime.Prime32File
//
// This Java source file is copyright (C) 2008 by Alan Kaminsky. All rights
// reserved. For further information, contact the author, Alan Kaminsky, at
// ark@cs.rit.edu.
//
// This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
// software; you can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// PJ is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// A copy of the GNU General Public License is provided in the file gpl.txt. You
// may also obtain a copy of the GNU General Public License on the World Wide
// Web at http://www.gnu.org/licenses/gpl.html.
//
//******************************************************************************
package edu.rit.hyb.prime;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Class Prime32File is a sequential program that stores a list of 32-bit prime
* numbers in a file.
*
* Usage: java edu.rit.hyb.prime.Prime32File primefile
*
primefile = Output prime file
*
* The program calculates all odd primes less than 232. The program
* stores a series of values in the output prime file. Each value is stored as
* an unsigned byte. Each value is the difference between two consecutive odd
* primes, divided by 2.
*
* The odd primes are 3, 5, 7, 11, 13, 17, 19, 23, . . .
*
* The differences between consecutive odd primes are 2, 2, 4, 2, 4, 2, 4, . . .
*
* The bytes stored in the output prime file are the differences divided by 2,
* namely 1, 1, 2, 1, 2, 1, 2, . . .
*
* @author Alan Kaminsky
* @version 03-Jun-2008
*/
public class Prime32File
{
// Prevent construction.
private Prime32File()
{
}
// Main program.
/**
* Main program.
*/
public static void main
(String[] args)
throws Exception
{
// Parse command line arguments.
if (args.length != 1) usage();
File primefile = new File (args[0]);
// Open output file.
OutputStream out =
new BufferedOutputStream (new FileOutputStream (primefile));
// Find all odd primes less than 2^16.
Sieve smallPrime = new Sieve (0, 65536);
smallPrime.initialize();
long p = 3;
while (smallPrime.sieveOut (p))
{
do p += 2; while (! smallPrime.isPrime (p));
}
// Write differences of all odd primes less than 2^16 to output file.
LongIterator iter = smallPrime.iterator();
iter.next(); // First number returned is 3, omit.
long prev_p = writePrimeDiffs (out, iter, 3);
// Find all odd primes less than 2^32, in chunks of 65,536.
Sieve largePrime = new Sieve (0, 65536);
for (long lb = 65536; lb < 4294967296L; lb += 65536)
{
// Sieve multiples of small odd primes out of the chunk.
largePrime.lb (lb);
largePrime.sieveOut (smallPrime.iterator());
// Write differences of odd primes in chunk to output file.
prev_p = writePrimeDiffs (out, largePrime.iterator(), prev_p);
}
// Close output file.
out.close();
}
// Hidden operations.
/**
* Write the differences between consecutive primes, divided by 2, to the
* given output stream.
*
* @param out Output stream.
* @param iter Iterator for primes to write.
* @param prev_p Previous prime written.
*
* @return Last prime written.
*
* @exception IOException
* Thrown if an I/O error occurred.
*/
private static long writePrimeDiffs
(OutputStream out,
LongIterator iter,
long prev_p)
throws IOException
{
long curr_p;
while ((curr_p = iter.next()) != 0)
{
int diff_over_2 = (int) ((curr_p - prev_p) >> 1);
out.write (diff_over_2);
prev_p = curr_p;
}
return prev_p;
}
/**
* Print a usage message and exit.
*/
private static void usage()
{
System.err.println ("Usage: java edu.rit.hyb.prime.Prime32File ");
System.err.println (" = Output prime file");
System.exit (1);
}
}
Ads help maintain this website.