pub fn generate(n: usize) -> Vec<u32> {
(1..=n)
.map(|i| {
let i = i as u32;
i * (3 * i - 1) / 2
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pentagonal_basic() {
let seq = generate(10);
assert_eq!(seq, vec![1, 5, 12, 22, 35, 51, 70, 92, 117, 145]);
}
#[test]
fn test_pentagonal_empty() {
let seq = generate(0);
assert_eq!(seq, Vec::<u32>::new());
}
#[test]
fn test_pentagonal_one() {
let seq = generate(1);
assert_eq!(seq, vec![1]);
}
#[test]
fn test_pentagonal_formula() {
let seq = generate(12);
for (i, &value) in seq.iter().enumerate() {
let n = (i + 1) as u32;
let expected = n * (3 * n - 1) / 2;
assert_eq!(value, expected);
}
}
#[test]
fn test_pentagonal_known_values() {
let seq = generate(8);
assert_eq!(seq[0], 1); assert_eq!(seq[1], 5); assert_eq!(seq[2], 12); assert_eq!(seq[3], 22); assert_eq!(seq[4], 35); assert_eq!(seq[5], 51); assert_eq!(seq[6], 70); assert_eq!(seq[7], 92); }
#[test]
fn test_pentagonal_growth() {
let seq = generate(15);
for i in 1..seq.len() {
assert!(seq[i] > seq[i - 1]);
}
}
#[test]
fn test_pentagonal_differences() {
let seq = generate(10);
let mut diffs = Vec::new();
for i in 1..seq.len() {
diffs.push(seq[i] - seq[i - 1]);
}
for i in 1..diffs.len() {
assert_eq!(diffs[i] - diffs[i - 1], 3);
}
assert_eq!(diffs[0], 4);
}
#[test]
fn test_pentagonal_second_differences() {
let seq = generate(10);
let mut diffs1 = Vec::new();
for i in 1..seq.len() {
diffs1.push(seq[i] - seq[i - 1]);
}
for i in 1..diffs1.len() {
let second_diff = diffs1[i] - diffs1[i - 1];
assert_eq!(second_diff, 3);
}
}
#[test]
fn test_pentagonal_quadratic_growth() {
let seq = generate(10);
let ratio = seq[8] as f32 / seq[2] as f32;
assert!(ratio > 8.0 && ratio < 11.0);
}
#[test]
fn test_pentagonal_faster_than_triangular() {
let pent = generate(10);
assert!(pent[9] > 55);
assert_eq!(pent[9], 145);
}
#[test]
fn test_pentagonal_relation_to_triangular() {
let pent = generate(8);
for i in 1..pent.len() {
let n = (i + 1) as u32;
let triangular_prev = if i == 0 {
0
} else {
let m = i as u32;
m * (m + 1) / 2
};
let expected = n + 3 * triangular_prev;
assert_eq!(pent[i], expected);
}
}
#[test]
fn test_pentagonal_longer_sequence() {
let seq = generate(15);
assert_eq!(seq.len(), 15);
assert_eq!(seq[14], 330); }
#[test]
fn test_pentagonal_specific_values() {
let seq = generate(5);
assert_eq!(seq, vec![1, 5, 12, 22, 35]);
}
}
pub fn short() -> Vec<u32> {
generate(8)
}
pub fn classic() -> Vec<u32> {
generate(12)
}
pub fn extended() -> Vec<u32> {
generate(16)
}