logo
0
0
Login
feat: 添加复数支持

Go CAS - 计算机代数系统

一个用Go语言实现的计算机代数系统(Computer Algebra System),支持符号运算和精确的数学表达式处理。

特性

  • 精确有理数运算: 使用分数表示,避免浮点数误差
  • 根式化简: 自动化简根式到最简形式 (如 √8 → 2√2)
  • 幂运算: 支持整数幂和分数幂
  • 符号表达式: 保持无理数的精确符号形式,不进行近似计算
  • 自动化简: 表达式自动化简到最简形式
  • 表达式解析: 支持从字符串解析数学表达式
  • 复数运算: 支持虚数单位 i 和复数的四则运算、共轭、倒数等

支持的运算

1. 有理数运算

  • 加法、减法、乘法、除法
  • 自动约分到最简分数形式

2. 根式运算

  • 平方根 (√)
  • n次方根 (∛, ∜, ...)
  • 自动提取完全幂次
  • 根式乘法和化简
  • 同类根式合并 (如 2√3 + 3√3 = 5√3)

3. 幂运算

  • 整数幂: a^n
  • 分数幂: a^(m/n)
  • 自动转换为根式形式

4. 四则混合运算

  • 支持复杂表达式的自动展开和化简
  • 分配律自动应用 (如 3*(5+2) = 21)
  • 嵌套表达式化简 (如 (√2+√3)² = 5+2√6)
  • 同类项自动合并

5. 复数运算

  • 虚数单位 i (i² = -1)
  • 复数加法、减法、乘法、除法
  • 复数共轭和倒数
  • 复数模的平方
  • 支持带根式的复数 (如 √2 + √3i)

安装

go get cnb.cool/hakurei/go-cas

使用示例

方式一:使用表达式解析器(推荐)

package main import ( "fmt" "cnb.cool/hakurei/go-cas" ) func main() { // 直接解析字符串表达式 result := cas.MustParseExpr("3 + (5 * 2) * 2 * √2") fmt.Println(result) // 输出: (3 + 20√2) // 更多示例 fmt.Println(cas.MustParseExpr("√8")) // 2√2 fmt.Println(cas.MustParseExpr("2 * √3 + 3 * √3")) // 5√3 fmt.Println(cas.MustParseExpr("(√2 + √3)^2")) // (5 + 2√6) fmt.Println(cas.MustParseExpr("4^(1/2)")) // 2 }

方式二:使用 API 构建表达式

package main import ( "fmt" "cnb.cool/hakurei/go-cas" ) func main() { // 有理数运算 r1 := cas.NewRational(1, 2) // 1/2 r2 := cas.NewRational(1, 3) // 1/3 sum := cas.Add(r1, r2) // 5/6 fmt.Println(sum) // 平方根 sqrt2 := cas.Sqrt(cas.NewRational(2, 1)) // √2 sqrt8 := cas.Sqrt(cas.NewRational(8, 1)) // 2√2 fmt.Println(sqrt2, sqrt8) // 根式乘法 result := cas.Mul(sqrt2, sqrt8) // √2 * 2√2 = 4 fmt.Println(result) // 幂运算 pow := cas.Pow(cas.NewRational(2, 1), cas.NewRational(3, 2)) // 2^(3/2) = 2√2 fmt.Println(pow) // 立方根 cbrt8 := cas.Root(cas.NewRational(8, 1), 3) // ∛8 = 2 fmt.Println(cbrt8) // 四则混合运算 // 3 * (5 + 2) * √2 = 21√2 expr := cas.Mul( cas.NewRational(3, 1), cas.Add(cas.NewRational(5, 1), cas.NewRational(2, 1)), sqrt2, ) fmt.Println(expr) // 输出: 21√2 // (√2 + √3)² = 5 + 2√6 sqrt3 := cas.Sqrt(cas.NewRational(3, 1)) sum23 := cas.Add(sqrt2, sqrt3) square := cas.Mul(sum23, sum23) fmt.Println(square) // 输出: (5 + 2√6) // 2√3 + 3√3 = 5√3 combined := cas.Add( cas.Mul(cas.NewRational(2, 1), sqrt3), cas.Mul(cas.NewRational(3, 1), sqrt3), ) fmt.Println(combined) // 输出: 5√3 }

表达式解析器

支持从字符串解析数学表达式,语法如下:

支持的运算符

  • 加法: +
  • 减法: -
  • 乘法: *
  • 除法: /
  • 幂运算: ^
  • 括号: ()

支持的函数

  • 平方根: sqrt()
  • n次方根: root(n, x) (暂未实现)

数字格式

  • 整数: 5, 123
  • 分数: 1/2, 3/4
  • 负数: -5, -1/2

示例表达式

3 + (5 * 2) * 2 * √2 (√2 + √3)^2 2 * √3 + 3 * √3 4^(1/2) √8 / √2 (1 + √2) * 3

运行示例

# 运行完整示例 cd example go run main.go # 运行表达式解析演示 go run demo_parser.go # 运行复数演示 go run demo_complex.go

运行测试

go test -v

核心类型

Expr 接口

所有表达式类型的基础接口:

type Expr interface { Simplify() Expr String() string Equals(other Expr) bool }

主要类型

  • Rational: 有理数 (分数)
  • Radical: 根式 (如 2√3)
  • Power: 幂运算 (如 x^(2/3))
  • Complex: 复数 (如 3 + 4i)
  • Sum: 和式
  • Product: 积式
  • Quotient: 商式

设计原则

  1. 精确性: 所有运算保持符号形式,不进行浮点近似
  2. 自动化简: 表达式自动化简到最简形式
  3. 类型安全: 使用Go的类型系统确保运算正确性
  4. 可扩展: 易于添加新的表达式类型和运算

示例输出

√4 = 2 √8 = 2√2 √18 = 3√2 2^3 = 8 4^(1/2) = 2 2^(3/2) = 2√2 √2 * √8 = 4 ∛8 = 2 ∛16 = 2√[3]2 四则混合运算: 3 * (5 + 2) = 21 3 * (5 + 2) * √2 = 21√2 (2 + 3) * (4 + 5) = 45 2√3 + 3√3 = 5√3 (1 + √2) * 3 = (3 + 3√2) 3 * (√2 + √3) = (3√2 + 3√3) (√2 + √3)² = (5 + 2√6) 2(3 + √5) + 4(1 + √5) = (10 + 6√5) 复数运算: i² = -1 i³ = -i i⁴ = 1 (3 + 4i) + (1 + 2i) = (4 + 6i) (3 + 4i) * (1 + 2i) = (-5 + 10i) (2 + 3i) * (2 - 3i) = 13 1/i = -i |(3 + 4i)|² = 25 (1 + i)² = 2i (1 + i)⁴ = -4

限制

  • 偶数次根的负数会引发panic(除非使用复数)
  • 大数幂运算有大小限制以避免溢出

未来计划

  • 复数支持
  • 支持更多代数运算
  • 表达式展开和因式分解
  • 三角函数
  • 对数和指数函数
  • 微分和积分
  • 复数的极坐标表示和欧拉公式

许可证

MIT License