2 个不稳定版本
0.2.0 | 2022年3月13日 |
---|---|
0.1.0 | 2021年11月28日 |
#833 in 数学
135KB
2.5K SLoC
野蛮计算机代数系统
野蛮是一个从头开始用纯 Rust 编写的新的计算机代数系统。其目标是正确性、简洁性和可用性,按照这个顺序。整个系统编译成一个仅2.5MB大小的单一代执行文件,没有任何依赖。虽然这个执行文件会随着野蛮的成熟而增长,但计划是最终以5MB或更小的体积交付一个有用的计算机代数系统。
“野蛮”这个名字是对Sage(领先的开源计算机代数系统)的参考/致敬。由于 Sage 已经存在并且工作得非常好,因此尝试复制它是没有意义的。相反,野蛮的目标是成为 Sage 的一种对立面:Sage 是多个数学包的统一前端,而野蛮是一个紧密集成的单体系统。Sage 涵盖了许多数学领域,包括尖端的研究课题,而野蛮将专注于工程师和其他使用数学概念的人所使用的“面包和黄油”数学。Sage 具有无数复杂函数的令人惊讶的实现,而野蛮的代码是原始的,简单但正确地完成任务,不考虑当输入是一个百万位数字时性能是否仍然最优。
野蛮处于早期开发阶段,尚未准备好用于严肃的工作。然而,它可以用来进行实验,并且愉快地接受贡献以推动项目前进。
特性
以下是野蛮今天提供的内容:
- 任意精度整数、有理数和复数算术
- 符号表达式的输入、简化和求值
- 支持向量矩阵,系数为任意表达式
- 具有语法和括号突出显示、持久历史和自动多行输入的 REPL
- 基于宏的系统,用于定义具有元数据和自动类型检查的函数
- 可以从任何 Rust 程序中使用 库
以下功能是 计划 的,其中一些工作已经完成
- 用户定义的变量和函数
- 内置的帮助系统
- 更多来自数学各个领域的函数
- 更强大的表达式简化
- Jupyter 内核
相比之下,以下内容被认为是 Savage 的 非特性,目前和未来都没有计划添加这些特性。
- 高级/研究级数学:一般来说,如果它不属于典型的本科课程,那么它可能也不属于 Savage。
- 物理学/金融学/机器学习/与数学相邻的其他领域:范围将无限扩大,这正是 Savage 避免的事情。
- 实现的正式验证:所需的技术还不成熟,Savage 不是一个研究项目。
- 以牺牲简单性为代价的性能:是的,我知道可以使用一些复杂的傅里叶技巧来加快乘法运算。不,我不会实现这一点。
- 通用编程:太复杂了,不是这个项目的重点。
- 文件/网络 I/O:Savage 仅执行计算,没有更多也没有更少。函数没有副作用。
- 模块/包/扩展/插件:世界已经足够复杂。要么内置了某些功能,要么Savage根本不提供。
- 图形用户界面:虽然可以创建一个由
savage_core
包支持的图形用户界面前端,但Savage项目本身并没有这样的计划。
安装
从源码构建Savage需要 Rust 1.56 或更高版本。 在您的系统上安装了支持的Rust版本后,您只需要运行
cargo install savage
将Savage REPL安装到Cargo二进制目录(通常是 $HOME/.cargo/bin
)。当然,您也可以克隆此仓库并从仓库根目录运行 cargo run
REPL。
未来,每个Savage版本都将提供针对主要平台的预构建可执行文件。
概述
算术
Savage中的算术运算没有精度限制(除了系统可用的内存量)
in: 1 + 1
out: 2
in: 1.1 ^ 100
out: 13780.612339822270184118337172089636776264331200038466433146477552154985209
5523076769401159497458526446001
in: 3 ^ 4 ^ 5
out: 373391848741020043532959754184866588225409776783734007750636931722079040617
26525122999368893880397722046876506543147515810872705459216085858135133698280918
73141917485942625809388070199519564042855718180410466812887974029255176680123406
17298396574731619152386723046235125934896058590588284654793540505936202376547807
44273058214452705898875625145281779341335214192074462302751872918543286237573706
39854853194764169262638199728870069070138992565242971985276987492741962768110607
02333710356481
结果会自动以分数或十进制形式打印,具体取决于输入是否包含分数或十进制数字
in: 6/5 * 3
out: 18/5
in: 1.2 * 3
out: 3.6
变量 i
预定义为代表虚数单位,允许使用标准符号输入复数
in: (1 + i) ^ 12
out: -64
线性代数
向量和矩阵是Savage中的第一等公民,支持标准加法、减法、乘法和指数运算符。系数可以是任意表达式
in: [a, b] - [a, c]
out: [0, b - c]
in: [a, b, c] * 3
out: [a * 3, b * 3, c * 3]
in: [[1, 2], [3, 4]] * [5, 6]
out: [17, 39]
行列式是符号评估的
in: det([[a, 2], [3, a]])
out: a ^ 2 - 6
逻辑
标准 &&
、||
、!
和比较运算符都是可用的。Savage可以自动评估许多公理和矛盾,即使存在未定义的变量
in: a && true
out: a
in: a || true
out: true
in: a || !a
out: true
in: a < a
out: false
数论
验证梅森数 M31 是素数
in: is_prime(2^31 - 1)
out: true
计算第1000万个素数
in: nth_prime(10^7)
out: 179424673
计算10百万以内的素数数量
in: prime_pi(10^7)
out: 664579
这些处理素数的函数由超快速的 primal
包提供。未来将在Savage中添加更多数论函数。
Savage作为一个库
Savage的所有实际计算机代数功能都包含在 savage_core
包中。该包公开了构建利用符号数学功能软件所需的一切。假设 savage_core
已添加到crate的 Cargo.toml
依赖项中,则可以使用如下方式使用它
use std::collections::HashMap;
use savage_core::{expression::Expression, helpers::*};
fn main() {
// Expressions can be constructed by parsing a string literal...
let lhs = "det([[a, 2], [3, a]])".parse::<Expression>().unwrap();
// ... or directly from code using helper functions.
let rhs = pow(var("a"), int(2)) - int(6);
let mut context = HashMap::new();
// The context can be used to set the values of variables during evaluation.
// Change "b" to "a" to see this in action!
context.insert("b".to_owned(), int(3));
assert_eq!(lhs.evaluate(context), Ok(rhs));
}
请注意,目前savage_core
的主要目的是为Savage REPL提供动力,因此第三方crate的使用应被视为实验性的。另外,和Savage的其他部分一样,savage_core
也遵循AGPL许可证的条款,该许可证对依赖软件施加的条件超出了更常见的许可协议的要求。在将savage_core
作为依赖项添加到您的crate之前,请确保您理解AGPL及其影响。
致谢
Savage站在Rust生态系统的巨人的肩膀上。在Savage所依赖的众多第三方crate中,我想强调两个在特别重要的角色
num
是Savage中所有数值计算的基础crate。它提供了关键的BigInt
类型,使标准算术运算能够以任意精度执行。num
的代码质量高,测试极其严格。chumsky
是Savage表达式解析器背后的魔力。我已经查看了目前可用的每个解析器crate,发现Chumsky的API是最直观的。此外,Chumsky的作者在问题跟踪器上反应迅速,并亲自帮助我理解和解决在Savage解析器开发过程中出现的两个主要问题。
许可证
版权所有 © 2021-2022 Philipp Emanuel Weidmann ([email protected])
本程序是免费软件:您可以按照自由软件基金会发布的GNU Affero通用公共许可证的条款重新分发和/或修改它,许可证版本为3,或(根据您的选择)任何较新版本。
本程序分发时附带希望它对您有用,但没有任何保证;甚至没有关于其适销性或特定用途的适当性的暗示性保证。有关详细信息,请参阅GNU Affero通用公共许可证。
您应该已收到本程序的GNU Affero通用公共许可证副本。如果没有,请参阅https://www.gnu.org/licenses/。
通过为本项目做出贡献,您同意在相同的许可证下发布您的贡献。
依赖项
~13–26MB
~364K SLoC