pub fn is_prime(n: u64) -> bool
{
if n == 2 { return true };
if n % 2 == 0 { return false };
let max: u64 = (n as f64).sqrt() as u64 + 1;
let mut d = 3;
while d <= max {
if n % d == 0 { return false };
d += 2;
}
true
}
pub fn permutations<'a,T>(input: &Vec<&'a T>) -> Vec<Vec<&'a T>> {
let mut result = Vec::new();
if input.len() == 1 {
result.push(vec![input[0]]);
} else {
for (i,&v) in input.iter().enumerate() {
let without = input.iter().enumerate()
.filter(|&(i2,_)| i2 != i)
.map(|(_,&b)| b)
.collect();
for mut p in permutations(&without) {
let mut item = vec![v];
item.append(&mut p);
result.push(item);
}
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_prime_positives() {
for p in vec![1,2,3,5,7,13,17,19,23,105199,179425331,32416190071] {
assert!(is_prime(p), "p={}", p);
}
}
#[test]
fn is_prime_negatives() {
for p in vec![4,6,8,9,10,12,14,15,16,18,20,32193578231536531] {
assert!(!is_prime(p), "p={}", p);
}
}
#[test]
fn permutations_1() {
assert_eq!(permutations(&vec![&0]), vec![vec![&0]]);
assert_eq!(permutations(&vec![&0,&1]), vec![vec![&0,&1],vec![&1,&0]]);
assert_eq!(permutations(&vec![&0,&1,&2]),vec![
vec![&0,&1,&2],
vec![&0,&2,&1],
vec![&1,&0,&2],
vec![&1,&2,&0],
vec![&2,&0,&1],
vec![&2,&1,&0]]);
}
#[test]
fn permutations_2() {
assert_eq!(permutations(&vec![&'a',&'b']),
vec![vec![&'a',&'b'], vec![&'b',&'a']]);
}
}