#代数 #计算机 #原语 #表达式 #REPL #计算

应用 savage

原语计算机代数系统(REPL)

2 个不稳定版本

0.2.0 2022年3月13日
0.1.0 2021年11月28日

#833 in 数学

AGPL-3.0-or-later

135KB
2.5K SLoC

野蛮计算机代数系统

野蛮是一个从头开始用纯 Rust 编写的新的计算机代数系统。其目标是正确性、简洁性和可用性,按照这个顺序。整个系统编译成一个仅2.5MB大小的单一代执行文件,没有任何依赖。虽然这个执行文件会随着野蛮的成熟而增长,但计划是最终以5MB或更小的体积交付一个有用的计算机代数系统。

Screenshot

“野蛮”这个名字是对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