跳转到内容

Advertising:

Kuṭṭaka 法

来自GSXAB的知识库
Kuṭṭaka法
术语名称 Kuṭṭaka法
英语名称 Kuṭṭaka
别名 Kuttaka法, 库塔卡法, Kuttaka

本条目没有一致可信的中文译名。

Kuṭṭaka 法(梵 कुट्टक, kuṭṭaka ,意为“粉碎”)/Kuttaka 法,也音译为库塔卡法,是印度数学中用于求解一次不定方程 [math]\displaystyle{ ax + by = c, \operatorname{gcd}(a,b)=1 }[/math] 的算法。算法本质是将辗转相除法得到的部分商序列看作连分数的渐近分数形式,从而获得方程的特解。其本质等价于扩展 Euclid 算法

这一算法本身是为了解决源自天文问题的同余方程组 [math]\displaystyle{ \begin{cases}x\equiv a\pmod m \\ x\equiv b\pmod n \end{cases} }[/math] 。原始方法中将这一方程组化为 [math]\displaystyle{ \begin{cases}x=mu+a\\x=nv+b\end{cases} }[/math] 的不定方程组,并通过求解满足 [math]\displaystyle{ mu - nv = a - b }[/math] 完成。

算法

原理

对于互质的正整数 [math]\displaystyle{ a, b }[/math](设 [math]\displaystyle{ a \gt b }[/math]),将分数 [math]\displaystyle{ a/b }[/math] 展开为有限连分数 [math]\displaystyle{ \frac{a}{b} = [a_0; a_1, a_2, \dots, a_n] = a_0 + \cfrac{1}{a_1 + \cfrac{1}{a_2 + \cfrac{1}{\ddots + \cfrac{1}{a_n}}}} }[/math],则其中不完全商 [math]\displaystyle{ a_0, a_1, \dots, a_n }[/math] 正是对 [math]\displaystyle{ a, b }[/math] 进行辗转相除所得的各次商。

考虑渐近分数列 [math]\displaystyle{ p_k / q_k }[/math][math]\displaystyle{ k = -2, -1, 0, 1, \dots, n }[/math]),其中 [math]\displaystyle{ \begin{cases} p_{-2} &= 0,\quad p_{-1} = 1; \\ q_{-2} &= 1,\quad q_{-1} = 0; \\ p_k &= a_k p_{k-1} + p_{k-2}, \\ q_k &= a_k q_{k-1} + q_{k-2}. \end{cases} }[/math]

则最终 [math]\displaystyle{ p_n / q_n = a / b }[/math],且连分数的基本性质保证 [math]\displaystyle{ p_n q_{n-1} - p_{n-1} q_n = (-1)^{n-1} }[/math]

将上式代入 [math]\displaystyle{ p_n = a, q_n = b }[/math] 得到 [math]\displaystyle{ a \cdot q_{n-1} - b \cdot p_{n-1} = (-1)^{n-1} }[/math] , 因此, [math]\displaystyle{ (-1)^{n-1} a q_{n-1} + (-1)^{n} b p_{n-1} = 1 }[/math]

于是方程 [math]\displaystyle{ ax + by = 1 }[/math] 的一组特解为 [math]\displaystyle{ x_0 = (-1)^{n-1} q_{n-1}, y_0 = (-1)^n p_{n-1} }[/math] 。通过乘以 [math]\displaystyle{ c }[/math] 并调整可得到一般方程 [math]\displaystyle{ ax + by = c }[/math] 的特解。

伪代码

过程 Kuttaka法
别名 kuttaka_algorithm
参数 a, b : 正整数
返回 : x, y : 整数 // 满足 a x + b y = 1

// 辗转相除,记录部分商列表 q₀ 、 q₁ 、……、 qₖ
令 r₀ ← a
令 r₁ ← b
循环 k ← 1
执行
    记 qₖ, rₖ₊₁ ← rₖ divmod rₖ₋₁
继续循环 k ← k + 1
直到 rₖ = 0 为止
此时记 n ← k

// 回代过程,也就是“粉碎”的过程
令 s₋₂ ← 0 , s₋₁ ← 1
令 t₋₂ ← 1 , t₋₁ ← 0
循环 k ← 1
执行
    记 sₖ ← rₖ sₖ₋₁ + sₖ₋₂
    记 tₖ ← rₖ tₖ₋₁ + tₖ₋₂
继续循环 k ← k + 1
直到 k = n 为止

// 调整符号得到特解
令 x₀ = (-1)ⁿ⁻¹tₙ₋₁ , y₀ = (-1)ⁿsₙ₋₁

返回 x₀ , y₀


同余理论
同余 剩余类 互质剩余类
完全剩余系 简化剩余系Euler 函数
Fermat 小定理 Euler 定理
一元同余方程
一次 一次同余方程大衍求一术
中国剩余定理
二次 二次同余方程二次剩余
Euler 准则Legendre 符号二次互反律Jacobi 符号
高次 二项同余方程[math]\displaystyle{ n }[/math] 次剩余
质数模高次同余方程Lagrange 定理等价同余方程

琐事

历史

在印度古代天文学中,行星位置计算常归结为求解一次同余方程,等价于不定方程 [math]\displaystyle{ ax + by = c }[/math]。 Kuṭṭaka 法最早见于印度数学家阿耶波多आर्यभट, Āryabhaṭa ,约公元 499 年)的《阿耶波多书》(आर्यभटीय, Āryabhaṭīya),后由婆罗摩笈多ब्रह्मगुप्त, Brahmagupta)、婆什迦罗भास्कर, Bhāskara)等人加以完善。

其名称 kuṭṭaka 意为“粉碎”或“研磨”,指算法中系数被辗转相除过程“碾碎”为更小的数,直到可以目测求解。

Advertising: