parallelize longest period finder

This commit is contained in:
2026-04-07 11:46:34 +02:00
parent caaabe204e
commit 3b11af13d0
4 changed files with 74 additions and 2 deletions

54
Cargo.lock generated
View File

@@ -2,6 +2,60 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 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]] [[package]]
name = "tea-3" name = "tea-3"
version = "0.1.0" version = "0.1.0"
dependencies = [
"rayon",
]

View File

@@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
rayon = "1.11.0"

View File

@@ -3,7 +3,7 @@ mod period;
mod tea3; mod tea3;
use lfsr::Lfsr; 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; use tea3::Tea3;
fn main() { fn main() {
@@ -65,7 +65,7 @@ fn main() {
// println!("\nPaper period p20: {}", period_paper(vec![0x7a, 0x02, 0x00, 0x00, 0x00])); // println!("\nPaper period p20: {}", period_paper(vec![0x7a, 0x02, 0x00, 0x00, 0x00]));
// println!("\nPaper period p27: {}", period_paper(vec![0x00, 0x00, 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!("\nLongest period: {}", p);
println!("Seed: {:02x?}", seed); println!("Seed: {:02x?}", seed);
} }

View File

@@ -1,4 +1,5 @@
use std::collections::HashMap; use std::collections::HashMap;
use rayon::prelude::*;
use crate::tea3::Tea3; use crate::tea3::Tea3;
@@ -177,3 +178,19 @@ pub fn longest_period() -> (u64, [u8; 5]) {
(best_period, best_seed) (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 },
)
}