N-smooth numbers: Difference between revisions

Content added Content deleted
(qualify task requirements [“calculate”] otherwise a few `printf` would be sufficient, →‎Pascal: standardize [use language as per ISO specifications], resolve {{incorrect}}])
m (Rust - task doesn't need arbitrary precision integers, 128-bit is sufficient.)
Line 3,258: Line 3,258:
=={{header|Rust}}==
=={{header|Rust}}==
{{trans|C}}
{{trans|C}}
<lang rust>// [dependencies]
<lang rust>fn is_prime(n: u32) -> bool {
// rug = "1.8"

fn is_prime(n: u32) -> bool {
if n < 2 {
if n < 2 {
return false;
return false;
Line 3,295: Line 3,292:
}
}


fn find_nsmooth_numbers(n: u32, count: usize) -> Vec<rug::Integer> {
fn find_nsmooth_numbers(n: u32, count: usize) -> Vec<u128> {
use rug::{Assign, Integer};
let primes = find_primes(2, n);
let primes = find_primes(2, n);
let num_primes = primes.len();
let num_primes = primes.len();
Line 3,304: Line 3,300:
for i in 0..num_primes {
for i in 0..num_primes {
index.push(0);
index.push(0);
queue.push(Integer::from(primes[i]));
queue.push(primes[i] as u128);
}
}
result.push(Integer::from(1));
result.push(1);
for i in 1..count {
for i in 1..count {
for p in 0..num_primes {
for p in 0..num_primes {
if queue[p] == result[i - 1] {
if queue[p] == result[i - 1] {
index[p] += 1;
index[p] += 1;
queue[p].assign(&result[index[p]] * primes[p]);
queue[p] = result[index[p]] * primes[p] as u128;
}
}
}
}
Line 3,320: Line 3,316:
}
}
}
}
result.push(Integer::from(&queue[min_index]));
result.push(queue[min_index]);
}
}
result
result