1个不稳定版本
0.1.0 | 2022年3月13日 |
---|
#46 在 #third-party
在 3 个包中使用(通过 savage_core)
19KB
97 行
Savage计算机代数系统
Savage是一个从头开始用纯Rust编写的全新计算机代数系统。其目标是正确性、简洁性和可用性,依次排列。整个系统编译成一个单一的、无依赖的可执行文件,大小仅为2.5 MB。虽然这个可执行文件随着Savage的成熟将不断增长,但计划是最终交付一个5 MB或更小的有用计算机代数系统。
"Savage"这个名字是对Sage(领先的开源计算机代数系统)的引用/致敬。由于Sage已经存在并且工作得非常好,尝试创建它的克隆是没有意义的。相反,Savage旨在成为Sage的一种对立面:Sage是一个统一的前端,可以访问几十个数学包,而Savage是一个紧密集成的、单一的系统。Sage涵盖了数学的许多领域,包括尖端的研究课题,而Savage将专注于工程师和其他使用数学概念的人使用的“家常”数学。Sage具有对无数函数的令人难以置信的复杂实现,而Savage有代码是原始的,简单但正确地完成任务,而不担心当输入是一百万位数时性能是否仍然是最优的。
Savage处于早期开发阶段,还不适合用于严肃的工作。 然而,它已经准备好用于实验,并乐于接受贡献以推进项目。
特性
这是Savage今天提供的:
- 任意精度整数、有理数和复数算术
- 符号表达式的输入、简化和评估
- 对向量和矩阵的一等支持,系数为任意表达式
- 具有语法和括号高亮、持久历史和自动多行输入的REPL
- 基于宏的系统,用于定义具有元数据和自动类型检查的函数
- 可作为库 从任何Rust程序中使用
以下特性是**计划中的**,其中一些基础工作已经完成
- 用户定义的变量和函数
- 内置帮助系统
- 来自数学各个领域的更多函数
- 更强大的表达式简化
- Jupyter 内核
相比之下,以下内容被视为 Savage 的 非特性,并且目前和将来都没有计划添加它们
- 高级/研究级数学:一般来说,如果它不属于典型的本科生课程,那么它很可能不属于 Savage。
- 物理/金融/机器学习/数学相邻领域:范围将无限扩大,这正是 Savage 力图避免的。
- 实现的形式化验证:所需的技术还不够成熟,Savage 不是一个研究项目。
- 以牺牲简单性为代价的性能:是的,我知道可以使用一些复杂的傅里叶技巧更快地进行乘法。不,我不会实现它。
- 通用编程:过于复杂,并不是这个项目的重点。
- 文件/网络 I/O:Savage 仅执行计算,不执行其他任何事情。函数没有副作用。
- 模块/包/扩展/插件:世界已经足够复杂。要么内置,要么Savage 根本没有。
- 图形用户界面:虽然可以使用
savage_core
crate 创建一个基于的图形用户界面前端,但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
crate 支持。将来将在Savage 中添加更多数论函数。
Savage 作为库
Savage 的所有实际计算机代数功能都包含在 savage_core
crate 中。该crate公开了构建利用符号数学功能软件所需的一切。假设 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
crate 的主要目的是为 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/。
通过向本项目做出贡献,您同意在相同的许可证下发布您的贡献。
依赖项
~2MB
~43K SLoC