Advertisement
Guest User

Untitled

a guest
Jun 21st, 2012
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 1.75 KB | None | 0 0
  1. import std.algorithm;
  2. import std.math;
  3. import std.stdio;
  4. import std.stream;
  5.  
  6. // Adapting Project Euler problem #10 algorithm.
  7. bool[] generatePrimeSieve(ulong limit)
  8. in {
  9.     assert (limit >= 1);
  10. }
  11. body {
  12.     bool[] primeSieve;
  13.     const ulong crossLimit = cast(ulong)(floor(sqrt(cast(real)limit)) - 1)/2;
  14.  
  15.     primeSieve.length = limit / 2;
  16.     primeSieve.fill(true);
  17.     primeSieve[0] = false; // special case for one
  18.  
  19.     foreach (i, ref b; primeSieve[1 .. crossLimit])
  20.         if (b)
  21.             for (auto j = 2*(i+1)*(i+2); j <= (limit - 1)/2; j += 2*(i+1)+1)
  22.                 primeSieve[j] = false;
  23.  
  24.     return primeSieve;
  25. }
  26.  
  27. bool checkPrime(ulong n, bool[] primeSieve)
  28. {
  29.     if (n == 0 || n == 1)
  30.         return false;
  31.  
  32.     if (n == 2)
  33.         return true;
  34.     else
  35.     if (n % 2 == 0)
  36.         return false;
  37.  
  38.     return primeSieve[(n-1)/2];
  39. }
  40.  
  41. void loadPrimeSieve(ref bool[] sieve, string inputFilename)
  42. {
  43.     auto inputFile = new BufferedFile;
  44.     ulong tempLength;
  45.  
  46.     inputFile.open(inputFilename);
  47.     inputFile.read(tempLength);
  48.     sieve.length = tempLength; // some rough edges
  49.     inputFile.read(cast(ubyte[])sieve);
  50.     clear(inputFile);
  51. }
  52.  
  53. void savePrimeSieve(bool[] sieve, string outputFilename)
  54. {
  55.     auto outputFile = new BufferedFile;
  56.  
  57.     outputFile.create(outputFilename);
  58.     outputFile.write(cast(ulong)sieve.length);
  59.     outputFile.write(cast(ubyte[])sieve);
  60.     outputFile.flush;
  61.     clear(outputFile);
  62. }
  63.  
  64. void main()
  65. {
  66.     immutable ulong limit = 30_000_000;
  67.     bool[] primeSieve1 = generatePrimeSieve(limit);
  68.     bool[] primeSieve2;
  69.  
  70.     savePrimeSieve(primeSieve1, "primeSieve.dat");
  71.     loadPrimeSieve(primeSieve2, "primeSieve.dat");
  72.  
  73.     ulong n;
  74.  
  75.     write("Enter a positive integer for primality test: ");
  76.     readf("%s\n", &n);
  77.     writeln("Hmm, so is the number ", n, " a prime? ",
  78.         checkPrime(n, primeSieve2) ? "Yes." : "No.");
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement