Browse Source

sequential is now really fast

master
mortie 7 years ago
parent
commit
5de0de5d31
3 changed files with 42 additions and 20 deletions
  1. 17
    3
      inf2440/hw2/Main.java
  2. 20
    17
      inf2440/hw2/Sequential.java
  3. 5
    0
      inf2440/hw2/Timer.java

+ 17
- 3
inf2440/hw2/Main.java View File

@@ -25,8 +25,14 @@ class Main {
t.start();
long n = maxNum * maxNum;
for (long j = n; j >= n - 100; --j) {

Timer t2 = new Timer().start();
long[] factors = s.factor(sieve, j);
System.out.println(
t2.end().prettyTime()+": "+
Util.factors(j, factors));

/*
if (j > (n - 5) || j < (n - 95)) {
if (j == n - 96)
System.out.println(".............");
@@ -34,6 +40,7 @@ class Main {
System.out.println(
Util.factors(j, factors));
}
*/
}
t.end();
}
@@ -50,7 +57,8 @@ class Main {
Sequential sseq = new Sequential();
Parallel spar = new Parallel();

boolean findPrimes = true;
//boolean findPrimes = true;
boolean findPrimes = false;
boolean factor = true;

int maxNum = Integer.parseInt(args[0]);
@@ -73,11 +81,17 @@ class Main {

System.out.println("\nFactoring sequentially...");
Timer seq = testFactor(sseq, maxNum, sieve);
System.out.println("Sequential: "+seq.prettyTime());
Timer seqAvg = new Timer(seq.time / 100);
System.out.println(
"Sequential: "+seq.prettyTime()+
" ("+seqAvg.prettyTime()+" per factor)");

System.out.println("\nFactoring in parallel...");
Timer par = testFactor(spar, maxNum, sieve);
System.out.println("Parallel: "+par.prettySpeedup(seq));
Timer parAvg = new Timer(par.time / 100);
System.out.println(
"Parallel: "+par.prettySpeedup(seq)+
" ("+parAvg.prettyTime()+" per factor)");
}

spar.stopThreads();

+ 20
- 17
inf2440/hw2/Sequential.java View File

@@ -13,28 +13,31 @@ class Sequential implements Solver {

ArrayList<Long> arr = new ArrayList<>();

while (true) {
long prime;
for (prime = 2; prime <= sqrt; ++prime) {
if (num % prime == 0) {
arr.add(new Long(prime));
num /= prime;
break;
}
}
// Easier to assume all primes are odd
while (num % 2 == 0) {
arr.add(new Long(2));
num /= 2;
}

if (prime > sqrt) {
arr.add(new Long(num));
break;
}
// Find factors
long prime;
for (prime = 3; prime <= sqrt; prime += 2) {
if (!sieve.isPrime((int)prime))
continue;

if (num <= sqrt && sieve.isPrime((int)num)) {
if (num != 1)
arr.add(new Long(num));
break;
if (num % prime == 0) {
do {
arr.add(new Long(prime));
num /= prime;
} while (num % prime == 0);
sqrt = (int)Math.sqrt(num);
}
}

// Add num if we didn't find all the factors before sqrt(num)
if (num != 1)
arr.add(new Long(num));

long[] a = new long[arr.size()];
for (int i = 0; i < a.length; ++i) {
a[i] = arr.get(i);

+ 5
- 0
inf2440/hw2/Timer.java View File

@@ -5,6 +5,11 @@ class Timer implements Comparable<Timer> {

private long start = 0;

Timer() {}
Timer(long time) {
this.time = time;
}

public Timer start() {
start = System.nanoTime();
return this;

Loading…
Cancel
Save