pub fn generate(n: usize) -> Vec<u32> {
if n == 0 {
return vec![];
}
if n == 1 {
return vec![0];
}
let mut seq = vec![0, 1];
for i in 2..n {
let next = 2 * seq[i - 1] + seq[i - 2];
seq.push(next);
}
seq
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pell_basic() {
let seq = generate(10);
assert_eq!(seq, vec![0, 1, 2, 5, 12, 29, 70, 169, 408, 985]);
}
#[test]
fn test_pell_empty() {
let seq = generate(0);
assert_eq!(seq, Vec::<u32>::new());
}
#[test]
fn test_pell_one() {
let seq = generate(1);
assert_eq!(seq, vec![0]);
}
#[test]
fn test_pell_two() {
let seq = generate(2);
assert_eq!(seq, vec![0, 1]);
}
#[test]
fn test_pell_recurrence() {
let seq = generate(12);
for i in 2..seq.len() {
assert_eq!(seq[i], 2 * seq[i - 1] + seq[i - 2]);
}
}
#[test]
fn test_pell_known_values() {
let seq = generate(12);
assert_eq!(seq[0], 0);
assert_eq!(seq[1], 1);
assert_eq!(seq[2], 2); assert_eq!(seq[3], 5); assert_eq!(seq[4], 12); assert_eq!(seq[5], 29); assert_eq!(seq[6], 70); assert_eq!(seq[7], 169); assert_eq!(seq[8], 408); assert_eq!(seq[9], 985); assert_eq!(seq[10], 2378); assert_eq!(seq[11], 5741); }
#[test]
fn test_pell_growth() {
let seq = generate(12);
for i in 2..seq.len() {
assert!(seq[i] > seq[i - 1]);
}
}
#[test]
fn test_pell_faster_than_fibonacci() {
let pell_seq = generate(10);
assert!(pell_seq[9] > 34);
assert_eq!(pell_seq[9], 985);
}
#[test]
fn test_pell_sqrt2_approximation() {
let seq = generate(10);
for i in 3..seq.len() {
let ratio = seq[i] as f64 / seq[i - 1] as f64;
assert!(ratio > 2.0 && ratio < 3.0);
}
let ratio_late = seq[9] as f64 / seq[8] as f64;
let one_plus_sqrt2 = 1.0 + 2.0_f64.sqrt();
assert!((ratio_late - one_plus_sqrt2).abs() < 0.01);
}
#[test]
fn test_pell_specific_values() {
let seq = generate(10);
assert_eq!(seq[0], 0);
assert_eq!(seq[1], 1);
assert_eq!(seq[2], 2);
assert_eq!(seq[3], 5);
assert_eq!(seq[4], 12);
assert_eq!(seq[5], 29);
assert_eq!(seq[6], 70);
assert_eq!(seq[7], 169);
assert_eq!(seq[8], 408);
assert_eq!(seq[9], 985);
}
#[test]
fn test_pell_starts_with_zero() {
let seq = generate(5);
assert_eq!(seq[0], 0);
assert_eq!(seq[1], 1);
}
#[test]
fn test_pell_rapid_growth() {
let seq = generate(12);
for i in 2..seq.len() {
assert!(seq[i] >= 2 * seq[i - 1]);
}
}
#[test]
fn test_pell_longer_sequence() {
let seq = generate(13);
assert_eq!(seq.len(), 13);
assert_eq!(seq[12], 13860); }
}
pub fn short() -> Vec<u32> {
generate(8)
}
pub fn classic() -> Vec<u32> {
generate(10)
}
pub fn extended() -> Vec<u32> {
generate(12)
}