2 个不稳定版本
0.2.0 | 2022年3月13日 |
---|---|
0.1.0 | 2021年11月28日 |
#1886 in 算法
用于 2 crates
115KB
2.5K SLoC
野蛮计算机代数系统
野蛮是一个从头开始用纯 Rust 编写的计算机代数系统。其目标是正确性、简洁性和可用性,依次排序。整个系统编译成一个单一的、无依赖的可执行文件,大小仅为 2.5 MB。虽然该可执行文件的大小会随着野蛮的成熟而增长,但计划最终在 5 MB 或更小的情况下交付一个有用的计算机代数系统。
“野蛮”这个名字是对Sage(领先的开放源代码计算机代数系统)的参考/致敬。由于 Sage 已经存在并且工作得非常好,因此尝试创建它的克隆是没有意义的。相反,野蛮旨在成为 Sage 的某种反义词:Sage 是一个面向数十个数学包的统一前端,而野蛮是一个紧密集成的、单一的系统。Sage 涵盖了许多数学领域,包括尖端的研究主题,而野蛮将专注于工程师和其他使用数学概念而不是开发数学概念的人所使用的“基本功”数学。Sage 特征了无数函数的惊人复杂的实现,而野蛮有代码是野蛮原始的,天真但正确地完成任务,而不用担心当输入是一百万位数字时性能是否仍然最优。
野蛮处于早期开发阶段,尚不适合用于严肃的工作。 然而,它已经准备好进行探索,并且非常欢迎为推动项目前进做出贡献。
特性
这是 Savage 今天提供的内容:
- 任意精度整数、有理数和复数算术
- 符号表达式的输入、简化和评估
- 对向量、矩阵的一等支持,系数为任意表达式
- 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
计算第十亿个素数
in: nth_prime(10^7)
out: 179424673
计算到一千万的素数数量
in: prime_pi(10^7)
out: 664579
这些处理素数的函数由超快的 primal
包提供。Savage 未来将添加更多数论函数。
Savage 作为库
所有Savage的实际计算机代数功能都包含在savage_core
包中。这个包暴露了构建利用符号数学能力软件所需的一切。假设savage_core
已经被添加到包的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提供动力,因此第三方包的使用应被视为实验性质的。另外,像Savage的其他部分一样,savage_core
在AGPL许可协议下发布,该协议对任何依赖软件施加的条件超出了更常见的宽松许可协议所需的条件。在将savage_core
作为依赖项添加到您的包之前,请确保您理解AGPL及其影响。
致谢
Savage站在Rust生态系统这个巨人的肩膀上。在Savage所依赖的众多第三方包中,我想强调两个在特别重要的角色
num
是Savage中所有数值计算的基本包。它提供了至关重要的BigInt
类型,使得可以以任意精度执行标准算术运算。num
的代码质量很高,并且经过极其严格的测试。chumsky
是Savage表达式解析器的魔法所在。我已经查看过目前可用的所有解析器包,并发现Chumsky的API是最直观的。此外,Chumsky的作者在问题跟踪器上反应迅速,并亲自帮助我理解和解决在Savage解析器开发过程中出现的两个重大问题。
许可证
版权所有 © 2021-2022 Philipp Emanuel Weidmann ([email protected])
本程序是免费软件:您可以按照自由软件基金会发布的GNU Affero通用公共许可证的条款重新分发和/或修改它,许可证版本为3,或者(根据您的选择)任何更新版本。
本程序的分发是希望它会有用,但没有提供任何保证;甚至没有关于适销性或特定用途适用性的暗示性保证。有关详细信息,请参阅GNU Affero通用公共许可证。
您应已收到本程序的GNU Affero通用公共许可证副本。如果没有,请参阅https://www.gnu.org/licenses/。
通过向本项目做出贡献,您同意在相同的许可证下发布您的贡献。
依赖项
~6MB
~123K SLoC