Compare commits
5 Commits
ba3478e6ce
...
be3fd52cfa
| Author | SHA1 | Date | |
|---|---|---|---|
| be3fd52cfa | |||
| 0b391ed590 | |||
| f5b971e35f | |||
| abfb1aee89 | |||
| 4b3bf0cfac |
@@ -6,7 +6,9 @@ indivisible \- prime number generator and tester
|
||||
[\fIOPTIONS\fR] <\fIn\fR>
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
Indivisible is a program for working with prime numbers. Its default behaviour will attempt to find the \fInth\fR prime.
|
||||
Indivisible is a program for working with prime numbers. It can either generate
|
||||
primes up to a limit \fIn\fR or test to see if \fIn\fR is a prime. It makes use
|
||||
of a segmented sieve of Eratosthenes.
|
||||
|
||||
.SH "OPTIONS"
|
||||
.TP
|
||||
@@ -19,6 +21,9 @@ Import prime numbers from \fIFILE\fR
|
||||
\fB\-t\fR, \fB\-\-test\fR
|
||||
Test if n is a prime instead of generation
|
||||
.TP
|
||||
\fB\-s\fR, \fB\-\-sieve\fR <\fISIZE\fR>
|
||||
Set a custom sieve size
|
||||
.TP
|
||||
\fB\-v\fR, \fB\-\-verbose\fR
|
||||
Print all found primes
|
||||
.TP
|
||||
|
||||
19
src/main.rs
19
src/main.rs
@@ -35,12 +35,12 @@ struct Opt {
|
||||
test:bool,
|
||||
#[structopt(help = "Max of the prime to generate or number to test for primality")]
|
||||
num:usize,
|
||||
#[structopt(short, long, name = "SIZE", default_value = "1000", help = "Set a custom sieve size")]
|
||||
sieve:usize,
|
||||
//#[structopt(short, long, name = "n", default_value = "1", help = "Number of threads to spawn")]
|
||||
//jobs:u64,
|
||||
}
|
||||
|
||||
const SEGMENT_SIZE:usize = 0x100000000;
|
||||
|
||||
fn main() {
|
||||
let opts = Opt::from_args();
|
||||
let mut prime_list = Vec::new();
|
||||
@@ -49,7 +49,12 @@ fn main() {
|
||||
let in_file = File::open(opts.import.unwrap()).unwrap();
|
||||
let reader = BufReader::new(in_file);
|
||||
for p in reader.lines().into_iter() {
|
||||
prime_list.push(p.unwrap().parse().unwrap());
|
||||
let prime:u64 = p.unwrap().parse().unwrap();
|
||||
if (prime as usize) > opts.num {
|
||||
break;
|
||||
}
|
||||
|
||||
prime_list.push(prime);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,11 +66,11 @@ fn main() {
|
||||
let mut start:usize = if prime_list.is_empty() {
|
||||
2
|
||||
} else {
|
||||
*prime_list.last().unwrap() as usize
|
||||
(*prime_list.last().unwrap() + 1) as usize
|
||||
};
|
||||
while start < opts.num {
|
||||
let end = if start + SEGMENT_SIZE < opts.num {
|
||||
start + SEGMENT_SIZE
|
||||
let end = if start + opts.sieve < opts.num {
|
||||
start + opts.sieve
|
||||
} else {
|
||||
opts.num + 1
|
||||
};
|
||||
@@ -78,7 +83,7 @@ fn main() {
|
||||
}
|
||||
prime_list.append(&mut new_primes);
|
||||
|
||||
start += SEGMENT_SIZE;
|
||||
start += opts.sieve;
|
||||
}
|
||||
|
||||
if opts.test {
|
||||
|
||||
10
test.sh
10
test.sh
@@ -17,9 +17,12 @@ fi
|
||||
tests=0
|
||||
passed=0
|
||||
|
||||
## TEST 1
|
||||
((tests++))
|
||||
echo -n "${tests}: Find 5th prime number..."
|
||||
if [[ $("$BINARY" 5) == 11 ]]
|
||||
echo -n "${tests}: Find all prime numbers before 70..."
|
||||
expect="2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 "
|
||||
|
||||
if [ "$("$BINARY" -v 70 | tr '\n' ' ')" = "$expect" ]
|
||||
then
|
||||
echo " pass"
|
||||
((passed++))
|
||||
@@ -27,6 +30,7 @@ else
|
||||
echo " FAIL"
|
||||
fi
|
||||
|
||||
## TEST 2
|
||||
((tests++))
|
||||
echo -n "${tests}: 11 is prime..."
|
||||
if "$BINARY" -t 11
|
||||
@@ -37,6 +41,7 @@ else
|
||||
echo " FAIL"
|
||||
fi
|
||||
|
||||
## TEST 3
|
||||
((tests++))
|
||||
echo -n "${tests}: 9 is not prime..."
|
||||
if ! "$BINARY" -t 9
|
||||
@@ -47,4 +52,5 @@ else
|
||||
echo " FAIL"
|
||||
fi
|
||||
|
||||
## RESULTS
|
||||
echo "Results: $passed/$tests"
|
||||
|
||||
Reference in New Issue
Block a user