#有限域 # #矩阵运算 #多项式 #素域 #伽罗瓦 #gf

galois_field

用于方便进行有限域、多项式和有限域上的矩阵运算的库

12 个版本

0.1.11 2022 年 10 月 28 日
0.1.10 2022 年 10 月 28 日

253数学

每月 38 次下载

MIT 许可证

49KB
998

目录

  1. 有限域
  2. 与其他库相比,它有什么不同之处?
    1. 优点
    2. 缺点
  3. 用法
  4. 示例
    1. 素域
    2. 伽罗瓦域
    3. Fp 上的多项式
    4. GF(pn) 上的多项式
    5. 有限域上的矩阵

有限域

一个 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);

没有运行时依赖项