Stein 算法

来自GSXAB的知识库
Stein算法
术语名称 Stein算法
英语名称 Stein's algorithm
别名 binary Euclidean algorithm, binary GCD algorithm

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

Stein算法(Stein's algorithm),是辗转相除法在进行大数运算时的一种工程实现。

主要思想是由于大数的高精度带余除法是一个复杂度较高的计算,约去只在一个操作数中含有的质因数。由于硬件上用移位代替除法是常见且高效的手段,且容易判定是否整除,通常的优化中仅对 2 进行处理,单步内也用减法代替辗转相除单步的带余除法转化成带 2 的,因此也称为二进制最大公因数算法。

算法

原理

[math]\displaystyle{ \operatorname{gcd}(a, b) = \begin{cases} 2 \operatorname{gcd}\left(\frac{a}{2}, \frac{b}{2}\right) &, 2 \mid a, 2 \mid b \\ \operatorname{gcd}\left(\frac{a}{2}, b\right) &, 2 \mid a, 2 \not\mid b \\ \operatorname{gcd}\left(a, \frac{b}{2}\right) &, 2 \not\mid a, 2 \mid b \\ \operatorname{gcd}\left(a, a - b\right) &, 2 \not\mid a, 2 \not\mid b \end{cases} }[/math]

伪代码

过程 Stein算法
别名 steins_algorithm
参数 a, b : 整数 // 被求最大公因数的两个数
返回 : 自然数 // 最大公因数

令 r ← 1

循环
当 b ≠ 0 时
执行
    如果 2 | a 且 2 | b 那么
        令 a ← a / 2, b ← b / 2, r ← 2 r
    如果 2 | a 且 非 2 | b 那么
        令 a ← a / 2
    如果 非 2 | a 且 2 | b 那么
        令 b ← b / 2
    如果 非 2 | a 且 非 2 | b 那么
        令 b ← b - a
继续循环

令 r ← r a

返回 r

实现中,判断整除 2 使用按位与运算实现,除以 2 使用右移运算, r 也处理成左移运算,此外只有减法运算,和普通的运算相同。


整除理论
整除关系 整除、倍数、因数 带余除法
正整数的分类 1质数、合数
质数测试 试除法埃氏筛线性筛
最大公约数理论 公倍数、最小公倍数 [math]\displaystyle{ \operatorname{lcm} }[/math]公因数、最大公因数 [math]\displaystyle{ \operatorname{gcd} }[/math] 辗转相除法
互质
算术基本定理 算术基本定理 标准质因数分解