svp 0.1.0

Lattice sieving over the integers with arbitrary precision.
Documentation
# SVP

Lattice sieving over the integers with arbitrary precision.

Includes the sampling algorithm described by [ \[GPV08\]](https://eprint.iacr.org/2007/432)
and the Gauss Seive described in [ \[MV10\]](https://eccc.weizmann.ac.il//report/2009/065/).

# Example

```rust
use svp::{nvec, Lattice, KleinSampler, GaussSieve};

// LLL/BKZ reduced basis
let mut b = vec![
  nvec![-1, 0, 1, 0, 1, 0, 0, 0, -1, 1],
  nvec![-2, 2, -1, 0, 2, 3, 0, 1, 0, -2],
  nvec![-3, 1, -1, 1, 0, -4, -1, -2, 0, 0],
  nvec![1, 6, 0, 0, 1, 0, 2, 0, 0, 2],
  nvec![-2, 1, -4, -1, -1, 0, 0, 4, -3, 2],
  nvec![1, 0, -5, -10, 4, -3, -2, 0, 3, 4],
  nvec![5, 0, -4, 4, 6, -6, 0, 4, -9, -7],
  nvec![4, 3, -2, -7, -2, 3, 0, -6, -12, -2],
  nvec![1, 6, 0, 1, -3, 3, -15, 3, -1, 2],
  nvec![0, 3, 11, -9, -5, -4, -3, 8, -1, -7],
];

// Precompute norms
for i in 0..b.len() {
  b[i].norm = Some(&b[i] * &b[i]);
}

// Init lattice
let l = Lattice { basis: b.clone() };

// Compute Gram-Schmidt matrix
let gs = l.gso();

// Init sieve
let mut s = GaussSieve {
  b: l,
  k: KleinSampler::init(&gs, (gs.len() as f64).ln()),
  l: vec![],
  s: b.clone(),
};

// Start sieving
let short_vecs = s.sieve();
```