Semiprime: Difference between revisions

Line 2,003:
# [4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95]
</lang>
=={{header|Rust}}==
<lang>
extern crate primal;
 
fn isqrt(n:usize) -> usize {
//from https://en.wikipedia.org/wiki/Integer_square_root
let mut shift = 2;
let mut n_shifted = n >> shift;
while n_shifted != 0 && n_shifted != n {
shift += 2;
n_shifted = n >> shift;
}
shift -= 2;
let mut result = 0;
while shift >= 0 {
result = result << 1;
let candidate_result = result + 1;
if candidate_result*candidate_result <= n >> shift {
result = candidate_result;
}
shift -= 2;
}
result
}
 
fn is_semiprime (mut n : usize) -> bool {
let root = isqrt(n) + 1;
let primes1 = primal::Sieve::new(root);
let mut count = 0;
for i in primes1.primes_from(2).take_while(|x| *x < root) {
while n % i == 0 {
n = n / i;
count += 1;
}
if n == 1 { break; }
}
if n != 1 { count += 1; }
count == 2
}
 
#[test]
fn test1 () {
assert_eq!((2..10).filter(|n| is_semiprime(*n)).count(),3);
}
 
#[test]
fn test2 () {
assert_eq!((2..100).filter(|n| is_semiprime(*n)).count(),34);
}
 
#[test]
fn test3 () {
assert_eq!((2..1_000).filter(|n| is_semiprime(*n)).count(),299);
}
 
#[test]
fn test4 () {
assert_eq!((2..10_000).filter(|n| is_semiprime(*n)).count(),2_625);
}
 
#[test]
fn test5 () {
assert_eq!((2..100_000).filter(|n| is_semiprime(*n)).count(),23_378);
}
 
#[test]
fn test6 () {
assert_eq!((2..1_000_000).filter(|n| is_semiprime(*n)).count(),210_035);
}
</lang>
 
{{out}}
<pre>
running 6 tests
test test1 ... ok
test test2 ... ok
test test3 ... ok
test test4 ... ok
test test5 ... ok
test test6 ... ok
 
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
</pre>
 
=={{header|Scala}}==