elegant_pairing/lib.rs
1#![no_std]
2use num_integer::Roots;
3
4pub fn pair<I: Roots + Clone>(n: I, m: I) -> I{
5 if n >= m{
6 return n.clone() * n.clone() + n + m;
7 }
8 return m.clone() * m + n;
9}
10pub fn unpair<I: Roots + Clone>(z: I) -> (I,I){
11 let q = z.sqrt();
12 let l = z - q.clone() * q.clone();
13 if l < q{
14 return (l,q);
15 }
16 return (q.clone(),l - q);
17}