Files
rssss/src/gf.rs

32 lines
914 B
Rust

use std::ops::{Add, Mul, Sub};
use generic_array::{ArrayLength, GenericArray};
use rand::{Rng, RngCore};
use generic_array::typenum::Unsigned;
pub trait GF: Add<Output=Self> + Sub<Output=Self> + Mul<Output=Self> + Copy + Clone + Eq + TryFrom<usize> {
const ORDER: usize;
type ChunkSize: ArrayLength;
/// Additive identity
const ZERO: Self;
/// Multiplicative identity
const ONE: Self;
/// Multiplicative inverse
fn minv(self) -> Self;
fn decode(chunk: GenericArray<u8, Self::ChunkSize>) -> Self;
fn encode(self) -> GenericArray<u8, Self::ChunkSize>;
fn decode_slice(s: &[u8]) -> Self {
let mut chunk = GenericArray::<u8, Self::ChunkSize>::default();
for i in 0..Self::ChunkSize::to_usize() {
chunk[i] = s.get(i).copied().unwrap_or(0);
}
Self::decode(chunk)
}
fn sample(rng: &mut (impl Rng + ?Sized)) -> Self;
}