Goldbach's comet: Difference between revisions

Added Rust solution
(Added Rust solution)
Line 832:
 
'''Stretch goal:''' (offsite SVG image) [https://raw.githubusercontent.com/thundergnat/rc/master/img/Goldbachs-Comet-Raku.svg Goldbachs-Comet-Raku.svg]
 
=={{header|Rust}}==
<lang rust>// [dependencies]
// primal = "0.3"
// plotters = "0.3.2"
 
use plotters::prelude::*;
 
fn goldbach(n: u64) -> u64 {
let mut p = 2;
let mut count = 0;
loop {
let q = n - p;
if q < p {
break;
}
if primal::is_prime(p) && primal::is_prime(q) {
count += 1;
}
if p == 2 {
p += 1;
} else {
p += 2;
}
}
count
}
 
fn goldbach_plot(filename: &str) -> Result<(), Box<dyn std::error::Error>> {
let gvalues : Vec<u64> = (1..=2000).map(|x| goldbach(2 * x + 2)).collect();
let mut gmax = *gvalues.iter().max().unwrap();
gmax = 10 * ((gmax + 9) / 10);
 
let root = SVGBackend::new(filename, (1000, 500)).into_drawing_area();
root.fill(&WHITE)?;
 
let mut chart = ChartBuilder::on(&root)
.x_label_area_size(20)
.y_label_area_size(20)
.margin(10)
.caption("Goldbach's Comet", ("sans-serif", 24).into_font())
.build_cartesian_2d(0usize..2000usize, 0u64..gmax)?;
 
chart
.configure_mesh()
.disable_x_mesh()
.disable_y_mesh()
.draw()?;
 
chart.draw_series(
gvalues
.iter()
.cloned()
.enumerate()
.map(|p| Circle::new(p, 2, BLUE.filled())),
)?;
 
Ok(())
}
 
fn main() {
println!("First 100 G numbers:");
for i in 1..=100 {
print!(
"{:2}{}",
goldbach(2 * i + 2),
if i % 10 == 0 { "\n" } else { " " }
);
}
 
println!("\nG(1000000) = {}", goldbach(1000000));
 
match goldbach_plot("goldbach.svg") {
Ok(()) => {}
Err(error) => eprintln!("Error: {}", error),
}
}</lang>
 
{{out}}
Writes a file in SVG format to the current directory with similar content to the Raku example.
<pre>
First 100 G numbers:
1 1 1 2 1 2 2 2 2 3
3 3 2 3 2 4 4 2 3 4
3 4 5 4 3 5 3 4 6 3
5 6 2 5 6 5 5 7 4 5
8 5 4 9 4 5 7 3 6 8
5 6 8 6 7 10 6 6 12 4
5 10 3 7 9 6 5 8 7 8
11 6 5 12 4 8 11 5 8 10
5 6 13 9 6 11 7 7 14 6
8 13 5 8 11 7 9 13 8 9
 
G(1000000) = 5402
</pre>
 
=={{header|uBasic/4tH}}==
1,777

edits