From 3b11af13d0f100c40a80a5e40251acae5358bfbc Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Tue, 7 Apr 2026 11:46:34 +0200 Subject: [PATCH] parallelize longest period finder --- Cargo.lock | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 4 ++-- src/period.rs | 17 ++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07b92cf..2b8a5a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,60 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "tea-3" version = "0.1.0" +dependencies = [ + "rayon", +] diff --git a/Cargo.toml b/Cargo.toml index d415757..71b0c40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +rayon = "1.11.0" diff --git a/src/main.rs b/src/main.rs index dec652e..cca4e1d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod period; mod tea3; use lfsr::Lfsr; -use period::{longest_period, period_bruteforce, period_floyd, period_paper}; +use period::{longest_period_parallel, period_bruteforce, period_floyd, period_paper}; use tea3::Tea3; fn main() { @@ -65,7 +65,7 @@ fn main() { // println!("\nPaper period p20: {}", period_paper(vec![0x7a, 0x02, 0x00, 0x00, 0x00])); // println!("\nPaper period p27: {}", period_paper(vec![0x00, 0x00, 0x00, 0x00, 0x00])); - let (p, seed) = longest_period(); + let (p, seed) = longest_period_parallel(); println!("\nLongest period: {}", p); println!("Seed: {:02x?}", seed); } diff --git a/src/period.rs b/src/period.rs index b6c18c8..ab6b138 100644 --- a/src/period.rs +++ b/src/period.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use rayon::prelude::*; use crate::tea3::Tea3; @@ -177,3 +178,19 @@ pub fn longest_period() -> (u64, [u8; 5]) { (best_period, best_seed) } + +pub fn longest_period_parallel() -> (u64, [u8; 5]) { + let limit: usize = 1usize << 40; + + (0usize..limit) + .into_par_iter() + .map(|x| { + let seed = Reg5::from_u40(x as u64); + let p = period_h(seed); + (p, seed.0) + }) + .reduce( + || (0u64, [0u8; 5]), + |a, b| if a.0 >= b.0 { a } else { b }, + ) +}