fn main() {
 assert_eq!(vec![2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127], 素数生成::<i8>().collect::<Vec<_>>());
 assert_eq!(65521, 素数生成::<u16>().last().unwrap());
 assert_eq!(78498, 素数生成::<u32>().take_while(|&p| p < 1000000).count());
}

fn 素数生成<T>() -> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
 let 孫 = 素数生成Iterator::<T>::new(None);
 let 子 = 素数生成Iterator::<T>::new(Some(孫));
 素数生成Iterator::<T>::new(Some(子))
}

struct 素数生成Iterator<T> {
 素数: Vec<T>,
 倍数: Vec<T>,
 新素数: T,
 上限: usize,
 子: Option<Box<Self>>,
}

impl<T> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
 fn new(子指定: Option<Self>) -> Self {
  let three = T::one().checked_add(&T::one()).unwrap().checked_add(&T::one()).unwrap();
  Self {
   素数: vec![T::one()],
   倍数: vec![three],
   新素数: T::one(),
   上限: 0,
   子: 子指定.map(|子| Box::new(子)),
  }
 }
}