最大公约数 greatest common divisor number

  • math.gcd()
  • sympy.gcd
  • numpy.gcd

实现方法参考:

最大公倍数

  • least common denominator
  • lowest common multiple

工具:

  • numpy.lcm
  • sympy.lcm

简单实现:

1
2
3
4
import math

def get_lcm(x, y):
    return x * y / math.gcd(x, y)

解线性方程组

nullspace 方法

使用限制: 适合无常亮参数的线性方程组

步骤:

  1. 组建方程组
  2. 调整所有参数到方程左边,变成齐次方程
  3. 构建参数矩阵
  4. 通过 nullspace (零向量空间)求解

工具:

  • sympy.Matrix(your_mat).nullspace()
  • scipy.linalg.null_space(np.array(your_mat))

零向量空间参数全部变成整数

方法:所有参数除以绝对值最小的参数。

eg:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import numpy as np
from scipy import linalg
mat = np.array([
    [1, 2, 2, 0],
    [0, 0, 2, 0],
    [0, 2, 0, 0],
    [1, 3, 3, 0]])

nullspace = linalg.null_space(np.transpose(mat))
In [40]: nullspace
Out[40]:
array([[ 0.63245553],
       [ 0.31622777],
       [ 0.31622777],
       [-0.63245553]])

# 参数变成整数

In [39]: nullspace = nullspace/np.min(np.abs(ret)); nullspace
Out[39]:
array([[ 2.],
       [ 1.],
       [ 1.],
       [-2.]])

解非齐次线性方程组

参考:

方法和工具:

  • scipy.linalg.solve

3*x_1 + x_2 - 2x_3 = 5

x_1 - x_2 + 4x_3 = -2

2*x_1 + 3x_3 = 2.5

1
2
3
4
5
import numpy as np
from scipy.linalg import solve
a = np.array([[3, 1, -2], [1, -1, 4], [2, 0, 3]])
b = np.array([5, -2, 2.5])
x = solve(a, b)