-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPrimeDivision.java
More file actions
150 lines (129 loc) · 4.16 KB
/
PrimeDivision.java
File metadata and controls
150 lines (129 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.File;
import java.io.FileOutputStream;
/*
* This class is for calculating primes with divison method
*/
class PrimeDivision{
Prime primeClass;
Int3 maxPrime;
long smallMaxPrime, startPrime;
Int3[] primesFound;
final static String FILENAME = "BigPrime.txt";
PrintWriter gapWriter;
// takes a object of Prime and maxPrime, so it can calcualte bigger primes
PrimeDivision(Prime p){
this.primeClass = p;
this.maxPrime = new Int3(p.maxPrime);
this.maxPrime.mul(this.maxPrime);
this.primeClass.initSmallPrimes();
this.smallMaxPrime = p.maxPrime;
this.startPrime = p.STARTPRIME;
}
public boolean hasFactors(Int3 number){
return primeClass.hasFactors(number);
}
public boolean isPrime(long number){
return primeClass.isPrime(number);
}
public Int3 findNextPrime(Int3 p){
Int3 p2 = p.clone();
p2.addSmall(2);
while (p2.less(maxPrime)){
if (!hasFactors(p2)){
return p2;
}
p2.addSmall(2);
}
return null;
}
public Int3 findPrevPrime(Int3 startPrime){
Int3 p = startPrime.clone();
p.sub(2);
while (true){
if (!hasFactors(p)){
return p;
}
p.sub(2);
}
// return null;
}
public void findPrimes(int nPrimesToFind, int step){
findPrimes(null, nPrimesToFind, step);
}
// find bigger primes with factorizing
public void findPrimes(Int3 start, int nPrimesToFind, int step){
double time = System.nanoTime();
if (start == null){
start = new Int3(primeClass.getBiggestPrime()); // current biggest prime from eratosthenes
} else if (start.dividable(2)){ // Start must be an odd number
start.addSmall(1);
}
if (step % 2 != 0){
System.out.println("WARNING: Step must be a even number.");
System.out.println("Changed step to: " + step);
step++;
}
if (step != 2){
nPrimesToFind /= 2;
}
primesFound = new Int3[nPrimesToFind];
int nPrimesFound = 0;
Int3 currentPrime = start.clone();
while((!currentPrime.greater(maxPrime))){
currentPrime.add(step);
if (!hasFactors(currentPrime)){ // prime found
primesFound[nPrimesFound] = currentPrime.clone();
writeOnePrime(primesFound[nPrimesFound], time);
nPrimesFound++;
if (nPrimesFound >= nPrimesToFind){
break;
}
}
}
}
// Prints all the primes with the distance for the primes that BigPrime has found
public void printPrimes(){
System.out.println("\nPrimes: \n");
for (int i = 0; i < primesFound.length; i++){
System.out.println("Prime: " + primesFound[i]);
}
}
public void writeOnePrime(Int3 prime, double time){
time = (System.nanoTime() - time) / 1000000; //milliseconds
if (gapWriter == null){
deleteFile();
}
try{
gapWriter = new PrintWriter(new FileWriter(FILENAME, true), true);
} catch (Exception e) {
e.printStackTrace();
return;
}
gapWriter.printf("Prime: %s used time %.4f ms.%n", prime.toString(), time);
gapWriter.close();
}
private void deleteFile(){
File a = new File(FILENAME);
a.delete();
}
public void writePrimesToFile(String filename, double time){
if (primesFound.length < 1){
return;
}
PrintWriter writer = null;
try{
writer = new PrintWriter(new FileOutputStream(filename), true);
} catch (Exception e) {
e.printStackTrace();
return;
}
writer.println("\nBig primes: \n");
for (int i = 0; i < primesFound.length; i++){
writer.println("Prime: " + primesFound[i]);
}
writer.printf("%n%nTime used: %.4f ms.%n", time);
writer.close();
}
}