Swifty Algebra

一个用于抽象代数的 Swift Playground。 这个项目的目的是通过实现抽象概念和使用具体对象(如数字、矩阵、多项式等)来理解代数。

如何构建 / 运行

打开 SwiftyAlgebra.xcworkspace 并按下▶️来构建框架。 你可以在项目下运行 Playground。  

ss2.png

使用数学符号

我们使用数学符号,例如集合 𝐙、𝐐、𝐑、𝐂 和运算符 ⊕、⊗ 等。 将 CodeSnippets 文件夹复制到 ~/Library/Xcode/UserData/,然后你可以通过 Xcode 的代码补全功能快速输入这些符号。

ss3.png

示例

有理数

let a = 𝐐(4, 5)  // 4/5
let b = 𝐐(3, 2)  // 3/2

a + b  // 23/10
a * b  // 6/5
b / a  // 15/8

矩阵 (类型安全)

typealias M = Matrix<_2, _2, 𝐙> // Matrix of integers with fixed size 2×2.

let a = M(1, 2, 3, 4)  // [1, 2; 3, 4]
let b = M(2, 1, 1, 2)  // [2, 1; 1, 2]

a + b  // [3, 3; 4, 6]
a * b  // [4, 5; 10, 11]

a + b == b + a  // true: addition is commutative
a * b == b * a  // false: multiplication is noncommutative

置换 (对称群)

typealias S_5 = Permutation<_5>

let s = S_5(cyclic: 0, 1, 2) // cyclic notation
let t = S_5([0: 2, 1: 3, 2: 4, 3: 0, 4: 1]) // two-line notation

s[1]  // 2
t[2]  // 4

(s * t)[3]  // 3 -> 0 -> 1
(t * s)[3]  // 3 -> 3 -> 0

多项式

typealias P = Polynominal<𝐐>

let f = P(0, 2, -3, 1) // x^3 − 3x^2 + 2x
let g = P(6, -5, 1)    // x^2 − 5x + 6
    
f + g  // x^3 - 2x^2 - 3x + 6
f * g  // x^5 - 8x^4 + 23x^3 - 28x^2 + 12x
f % g  // 6x - 12
    
gcd(f, g) // 6x - 12

整数商,有限域

typealias Z_4 = IntegerQuotientRing<_4>
Z_4.printAddTable()
+	|	0	1	2	3
----------------------
0	|	0	1	2	3
1	|	1	2	3	0
2	|	2	3	0	1
3	|	3	0	1	2
typealias F_5 = IntegerQuotientField<_5>
F_5.printMulTable()
*	|	0	1	2	3	4
--------------------------
0	|	0	0	0	0	0
1	|	0	1	2	3	4
2	|	0	2	4	1	3
3	|	0	3	1	4	2
4	|	0	4	3	2	1

代数扩张

// Construct an algebraic extension over 𝐐:
// K = 𝐐(√2) = 𝐐[x]/(x^2 - 2).

struct p: _Polynomial {                            // p = x^2 - 2, as a struct
    typealias K = 𝐐
    static let value = Polynomial<𝐐>(-2, 0, 1)
}

typealias I = PolynomialIdeal<p>                   // I = (x^2 - 2)
typealias K = QuotientField<Polynomial<𝐐>, I>      // K = 𝐐[x]/I

let a = Polynomial<𝐐>(0, 1).asQuotient(in: K.self) // a = x mod I
a * a == 2                                         // true!

同调,上同调

let S2 = SimplicialComplex.sphere(dim: 2)
let H = Homology(S2, 𝐙.self)
print("H(S^2; 𝐙) =", H.detailDescription, "\n")
H(S^2; 𝐙) = {
  0 : 𝐙,    [(v1)],
  1 : 0,    [],
  2 : 𝐙,    [-1(v0, v2, v3) + -1(v0, v1, v2) + (v1, v2, v3) + (v0, v1, v3)]
}
let RP2 = SimplicialComplex.realProjectiveSpace(dim: 2)
let H = Homology(RP2, 𝐙.self)
print("H(RP^2; 𝐙₂) =", H.detailDescription, "\n")
H(RP^2; 𝐙₂) = {
  0 : 𝐙₂,    [(v1)],
  1 : 𝐙₂,    [(v0, v1) + (v1, v2) + (v0, v3) + (v2, v3)],
  2 : 𝐙₂,    [(v0, v2, v3) + (v3, v4, v5) + (v2, v3, v5) + (v1, v2, v5) + (v0, v4, v5) + (v1, v3, v4) + (v0, v1, v5) + (v1, v2, v4) + (v0, v2, v4) + (v0, v1, v3)]
}

参考

  1. Swift で代数学入門
  2. Swift で数学のススメ

许可

Swifty Algebra 根据 CC0 1.0 Universal 许可发布。