12 个版本
0.1.11 | 2022 年 10 月 28 日 |
---|---|
0.1.10 | 2022 年 10 月 28 日 |
253 在 数学 中
每月 38 次下载
49KB
998 行
目录
有限域
一个 Rust 库,用于有限域上的运算,包括
- Fp 元素的和、差、积和商
- GF(pn) 元素的和、差、积和商
- 获取本原多项式
- Fp 上多项式的和、差、积、商和余数
- GF(pn) 上多项式的和、差、积、商和余数
- Fp 矩阵的和、积
- GF(pn) 矩阵的和、积
- 有限域(Fp、GF(pn))上的矩阵的扫除法(或高斯消元法)也是可用的。
与其他库相比,它有什么不同之处?
优点
- 可以用 Fp、GF(pn) 对任何素数和任何乘数进行计算,不仅限于字符 2。
- 可以自由计算六种类型的元素:素域、伽罗瓦域、素域多项式、伽罗瓦域多项式、素域矩阵和伽罗瓦域矩阵。
- 每个都可以使用 +-*/ 进行计算,因此您可以编写自然代码。
- 有限域(Fp、GF(pn))上的矩阵运算也可以执行。
- 扫除法是可用的。
缺点
- 与其他库相比,它可能需要更长的时间,因为它没有针对每个字符进行优化。
用法
将以下内容添加到您的 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);
}
Fp 上的多项式
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);
}
GF(pn) 上的多项式
与上面相同
有限域上的矩阵
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);