quadratic_residues/
lib.rsuse std::collections::HashSet;
pub fn quadratic_residues(number: i32) -> Vec<i32> {
let mut quadratic_residues = quadratic_residues_all(number);
quadratic_residues = get_unique(quadratic_residues);
quadratic_residues.sort();
quadratic_residues
}
pub fn quadratic_non_residues(number: i32) -> Vec<i32> {
let quadratic_residues = quadratic_residues_all(number);
let mut quadratic_non_residues: Vec<i32> = vec![];
for x in 1..number {
if !quadratic_residues.contains(&x) {
quadratic_non_residues.push(x);
}
}
quadratic_non_residues
}
pub fn quadratic_residues_all(number: i32) -> Vec<i32> {
let mut v = vec_of_smaller_ints(number);
for x in v.iter_mut() {
*x = (*x * *x) % number;
}
return v;
}
fn vec_of_smaller_ints(n: i32) -> Vec<i32> {
(1..n).collect()
}
fn get_unique(vec: Vec<i32>) -> Vec<i32> {
let unique_only: HashSet<_> = vec.clone().drain(..).collect();
let mut unique_vec: Vec<_> = unique_only.into_iter().collect();
unique_vec.sort();
unique_vec
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quadratic_residues() {
assert_eq!(quadratic_residues(7), vec![1, 2, 4]);
}
#[test]
fn test_quadratic_non_residue() {
assert_eq!(quadratic_non_residues(7), vec![3, 5, 6]);
}
#[test]
fn test_quadratic_residues_all() {
assert_eq!(quadratic_residues_all(7), vec![1, 4, 2, 2, 4, 1]);
}
}