| Crates.io | galois_field |
| lib.rs | galois_field |
| version | 0.1.11 |
| created_at | 2022-10-27 04:55:53.962055+00 |
| updated_at | 2022-10-28 12:33:46.199009+00 |
| description | Library for convenient operations on finite field, polynomials, and matrices over finite field. |
| homepage | |
| repository | https://github.com/eightfx/galois_field |
| max_upload_size | |
| id | 698901 |
| size | 57,408 |
A Rust library for operations on finite field, featuring:
Sum, difference, product, and quotient of elements Fp
Sum, difference, product, and quotient of elements GF(pn)
Obtaining the primitive polynomial
Sum, difference, product, quotient, and remainder of polynomial over Fp
Sum, difference, product, quotient, and remainder of polynomial over GF(pn)
Sum, product of Matrix Fp
Sum, product of Matrix GF(pn)
The sweep method (or Gaussian elimination) of matrices on finite bodies (Fp, GF(pn)) is also available.
Can be calculated with Fp, GF(pn) for any prime and any multiplier, not limited to a char 2.
Can freely compute six types of element: prime field, Galois field, polynomial of prime field, polynomial of Galois field, matrix of prime field, and matrix of Galois field.
Each can be calculated with +-*/, so you can write natural code.
Matrix operations on finite field (Fp, GF(pn)) can also be performed.
The sweep method can be available.
It takes longer than other libraries because it is not optimized for each character.
Add this to your Cargo.toml:
[dependencies]
galois_field = "0.1.11"
use galois_field::*;
let char: u32 = 5;
let x:FiniteField = FiniteField{
char: char,
element:Element::PrimeField{element:0} // 0 in F_5
};
let y:FiniteField = FiniteField{
char: char,
element:Element::PrimeField{element:1} // 1 in F_5
};
println!("x + y = {:?}", (x.clone() + y.clone()).element); // ->1
println!("x - y = {:?}", (x.clone() - y.clone()).element); // -> 4
println!("x * y = {:?}", (x.clone() * y.clone()).element); // -> 0
println!("x / y = {:?}", (x.clone() / y.clone()).element); // -> 0
use galois_field::*;
fn main(){
// consider GF(2^4)
let char: u32 = 2;
let n = 4;
let primitive_polynomial = Polynomial::get_primitive_polynomial(char, n);
let x:FiniteField = FiniteField{
char: char,
element:Element::GaloisField{element:vec![0,1],primitive_polynomial:primitive_polynomial.clone()} // i.e. [0,1] = x -> 2 over GF(2^4)
};
let y:FiniteField = FiniteField{
char: char,
element:Element::GaloisField{element:vec![0,0,1,1],primitive_polynomial:primitive_polynomial.clone()} // i.e. [0,0,1,1] = x^3 + x^2 -> 12 over GF(2^4)
};
println!("x + y = {:?}", (x.clone() + y.clone()).element);
println!("x - y = {:?}", (x.clone() - y.clone()).element);
println!("x * y = {:?}", (x.clone() * y.clone()).element);
println!("x / y = {:?}", (x.clone() / y.clone()).element);
}
use galois_field::*;
fn main() {
// character
let char: u32 = 2;
let element0:FiniteField = FiniteField{
char: char,
element:Element::PrimeField{element:0} // 0 in F_5
};
let element1:FiniteField = FiniteField{
char: char,
element:Element::PrimeField{element:1} // 1 in F_5
};
let f: Polynomial = Polynomial {
coef: vec![element1.clone(),element0.clone(),element0.clone(),element0.clone(),element1.clone()]
};
let g: Polynomial = Polynomial {
coef: vec![element1.clone(),element0.clone(),element0.clone(),element1.clone(),element1.clone()]
};
println!("f + g = {:?}", (f.clone()+g.clone()).coef);
println!("f - g = {:?}", (f.clone()-g.clone()).coef);
println!("f * g = {:?}", (f.clone()*g.clone()).coef);
println!("f / g = {:?}", (f.clone()/g.clone()).coef);
println!("f % g = {:?}", (f.clone()%g.clone()).coef);
}
Same as above
use galois_field::*;
let char = 3;
let element0: FiniteField = FiniteField {
char: char,
element: Element::PrimeField { element: 0 },
};
let element1: FiniteField = FiniteField {
char: char,
element: Element::PrimeField { element: 1 },
};
let element2: FiniteField = FiniteField {
char: char,
element: Element::PrimeField { element: 2 },
};
let mut matrix_element:Vec<Vec<FiniteField>> = vec![
vec![element0.clone(),element1.clone(), element0.clone()],
vec![element2.clone(),element2.clone(), element1.clone()],
vec![element1.clone(),element0.clone(), element1.clone()]
];
let mut matrix = Matrix{
element: matrix_element,
};
println!("m+m = {:?}", m.clone()+m.clone());
println!("m*m = {:?}", m.clone()*m.clone());
let mut sweep_matrix = m.sweep_method();
println!("{:?}", sweep_matrix);