当前位置:首页 > Rust > 正文

用 Rust 实现多项式运算(从零开始构建你的数学工具库)

在数值计算、密码学和图形处理等领域,Rust多项式运算是一项基础而重要的技能。本教程将带你从零开始,使用 Rust 编程语言 实现一个简单的多项式结构,并支持加法与乘法操作。无论你是 Rust 新手还是有一定经验的开发者,都能轻松上手!

用 Rust 实现多项式运算(从零开始构建你的数学工具库) Rust多项式运算 Rust数学库 Rust编程教程 多项式加法乘法 第1张

什么是多项式?

多项式是由变量(如 x)和系数通过加法、乘法以及非负整数次幂组成的代数表达式。例如:

3x² + 2x + 1

在这个例子中,系数分别是 [3, 2, 1],对应 x 的 2 次、1 次和 0 次项。

设计思路

我们将用一个 Vec(整数向量)来表示多项式的系数,索引代表幂次。例如:

  • [1, 2, 3] 表示 1 + 2x + 3x²
  • [5, 0, 4] 表示 5 + 0x + 4x² = 5 + 4x²

注意:我们按升幂顺序存储(常数项在前),这是工程中的常见做法。

定义 Polynomial 结构体

首先,创建一个新的 Rust 项目:

cargo new polynomial_mathcd polynomial_math

然后,在 src/main.rs 中定义我们的结构体:

#[derive(Debug, Clone)]pub struct Polynomial {    coeffs: Vec,}impl Polynomial {    // 构造函数:传入系数向量    pub fn new(coeffs: Vec) -> Self {        // 移除高位的零(例如 [1, 2, 0, 0] → [1, 2])        let mut c = coeffs;        while c.len() > 1 && *c.last().unwrap() == 0 {            c.pop();        }        Polynomial { coeffs: c }    }    // 获取次数(最高非零项的幂)    pub fn degree(&self) -> usize {        if self.coeffs.is_empty() || (self.coeffs.len() == 1 && self.coeffs[0] == 0) {            return 0;        }        self.coeffs.len() - 1    }}

实现多项式加法

两个多项式相加,只需将对应幂次的系数相加。我们为 Polynomial 实现 Add trait:

use std::ops::Add;impl Add for Polynomial {    type Output = Polynomial;    fn add(self, other: Polynomial) -> Polynomial {        let len = usize::max(self.coeffs.len(), other.coeffs.len());        let mut result = vec![0; len];        for i in 0..len {            let a = if i < self.coeffs.len() { self.coeffs[i] } else { 0 };            let b = if i < other.coeffs.len() { other.coeffs[i] } else { 0 };            result[i] = a + b;        }        Polynomial::new(result)    }}

实现多项式乘法

乘法稍微复杂一点:第 i 项和第 j 项相乘会贡献到第 (i+j) 项。我们手动实现 mul 方法(也可实现 Mul trait):

impl Polynomial {    pub fn multiply(&self, other: &Polynomial) -> Polynomial {        if self.coeffs.is_empty() || other.coeffs.is_empty() {            return Polynomial::new(vec![0]);        }        let mut result = vec![0; self.coeffs.len() + other.coeffs.len() - 1];        for (i, &a) in self.coeffs.iter().enumerate() {            for (j, &b) in other.coeffs.iter().enumerate() {                result[i + j] += a * b;            }        }        Polynomial::new(result)    }}

完整测试示例

现在,让我们写一个 main 函数来测试我们的 Rust数学库

fn main() {    // 定义 p1 = 2x + 1 (即 [1, 2])    let p1 = Polynomial::new(vec![1, 2]);        // 定义 p2 = x² + 3 (即 [3, 0, 1])    let p2 = Polynomial::new(vec![3, 0, 1]);    // 加法:p1 + p2 = (1+3) + 2x + x² = 4 + 2x + x²    let sum = p1.clone() + p2.clone();    println!("Sum: {:?}", sum.coeffs); // 输出 [4, 2, 1]    // 乘法:(2x + 1)(x² + 3) = 2x³ + x² + 6x + 3    let product = p1.multiply(&p2);    println!("Product: {:?}", product.coeffs); // 输出 [3, 6, 1, 2]}

进阶建议

这个基础实现已经涵盖了 多项式加法乘法的核心逻辑。你可以进一步:

  • 支持泛型(如 f64Complex
  • 实现求值(evaluate at x)
  • 添加格式化输出(Display trait)
  • 集成单元测试(使用 #[cfg(test)]

结语

通过本 Rust编程教程,你已经掌握了如何用 Rust 构建一个实用的多项式运算模块。这不仅加深了你对代数结构的理解,也锻炼了系统编程能力。Rust 的内存安全和零成本抽象特性,使其成为开发高性能数学库的理想选择。

动手试试吧!修改代码、添加新功能,让你的 Rust多项式运算库更强大!