上一页

ⓘ 带余除法




带余除法
                                     

ⓘ 带余除法

带余除法 (也称为 欧几里德除法 )是数学中的一种基本算术计算方式。给定一个 被除数 a 和一个 除数 b ,带余除法给出一个整数 q 和一个介于一定范围的 余数 r ,使得下面等式成立:

a = b q + r {\displaystyle a=bq+r}

一般限定余数的范围在0与 b 之间,也有限定在 -b/2 与 b/2 之间。这样的限定都是为了使得满足等式的 q 有且仅有一个。这时候的 q 称为带余除法的 商 。带余除法一般表示为:

a ÷ b = q … r {\displaystyle a\div b=q\dots r}

表达为:" a 除以 b 等于 q ,余 r ”。最常见的带余除法是整数与整数的带余除法(被除数 a 和除数 b 都是整数),但实数与整数乃至实数与实数的带余除法也有应用。对一般的抽象代数系统,能够进行带余除法的都是具有欧几里德性质的系统。如果余数为零,则称 b 整除 a 。一般约定除数 b 不能为0.

带余除法的计算有长久的历史,有各种计算工具和计算方法。最常用的是长除法(竖式除法)。带余除法在数论中有不少用途,比如说辗转相除法的基本步骤就是带余除法。

                                     

1. 例子

以下是整数带余除法的例子:依照公历,一年中的四月份有30天。每星期有7天,从四月的第一天开始,可以数出有四个星期,此外还有2天。如果要数出5个星期,则还差了5天。带余除法表示,就是:

30 ÷ 7 = 4 … 2 {\displaystyle 30\div 7=4\dots 2}

里面的30是被除数,7是除数,4是带余除法得到的商,2是带余除法得到的余数。日常生活中说:" 四月份有四个多星期”,是带余除法的结果。

另一个例子是分配问题。假设有30个苹果要分给7个人,每人分的要一样多,那么可以使用带余除法:

30 ÷ 7 = 4 … 2 {\displaystyle 30\div 7=4\dots 2}

这说明每人可以分到4个,还剩余2个。如果每人分5个,则是不够的。每人如果只分3个,则还剩余9个,可以继续分。带余除法说明了在人人分到的要一样多的条件下,每人可以分到的最多苹果数目。

                                     

1.1. 例子 不同的带余除法

最基本的带余除法是整数与整数的带余除法,这时商和余数都是整数。实数与整数的带余除法,或实数与实数的带余除法,余数是实数,但不一定是整数。比如说讨论使用正弦函数构造的数列 { sin ⁡ n ∣ n ∈ Z } {\displaystyle \{\sin {n}\mid n\in \mathbb {Z} \}} 时,就需要使用除数为 2 π {\displaystyle 2\pi } 的带余除法,来讨论每一项具体的取值。

                                     

2. 基本定理

带余除法限定了余数的范围,使得商唯一存在。整数与整数的带余除法中,余数的范围通常是 { 0, 1, …, | b | − 1 } {\displaystyle \{0.1,\dots,|b|-1\}} 这样的 b 个元素的集合。被除数为实数的带余除法中,常常会使用介于0和除数| b |之间(大于等于0,严格小于| b |)的半开闭区间作为余数的范围;另一种常见的范围是大于等于-| b |/2,严格小于| b |/2。带余除法的基本定理说明:整数与整数的带余除法中,只要余数的范围是| b |个整数,并且任何两个数之差都不是 b 的倍数,那么带余除法的商唯一存在;被除数为实数的除法中,只要余数的范围是一个如同长度为| b |的半开半闭区间,那么带余除法的商唯一存在。: 25

最常见的带余除法中用到的是整数除以整数的一个版本:

                                     

2.1. 基本定理 证明

定理的证明是将整数集合或实数轴分割成长度为| b |的区间段。證明由兩部分組成 - 首先證明 q 和 r 的存在性,其次證明 q 和 r 的唯一性。

                                     

3. 计算

计算带余除法和计算除法的手段基本相同。手工计算时常常使用长除法,与除法不同之处是到个位即停止,剩余的即是余数。计算机运算中使用的带余除法一般耗费的时间比相同位数的乘法更久,所以编程时为了减少机器运算量,常常会尽力避免除法运算。一般的编程语言和数学、统计软件中,带余除法运算符(指令)和取模运算符(指令)可能是分开的,也可能是合并的。如在进行带余除法时尽管默认返回的是商,但实际上余数也储存在运算结果中。除数是2的幂次的时候,可以使用右移的位移运算代替带余除法。这是因为计算机储存数据使用的是二进制,取一个长度为 n 的二进制数的前 k 位,实际上就是它除以2的 n-k 次幂後的商,而後 n-k 位则是其余数。

                                     

3.1. 计算 原始算法

原始的带余除法算法可以视为是重复使用减法的过程。设要计算 a 除以 b ,则在 a 里面不断地扣除 b ,直到不能继续扣除(满足余数范围)为止。以 a 、 b 都是正整数,余数范围为 { 0, 1, …, b − 1 } {\displaystyle \{0.1,\dots,b-1\}} 的除法为例,伪代码如下:

这样的算法复杂度是 a/b 的级别。

                                     

3.2. 计算 使用二分法

更为优化的算法是使用二进制以及二分法的结合。算法大致分为两个部分:首先用不断倍增的方式找出一个 a 所属的区间,然后用二分法不断收窄区间,直到将 a 限制在一个长度为 b 的区间为止。举例来说,要计算237除以9,可以首先列出如下表格:

也就是从小到大逐个列出2的幂次与9的乘积,直到超过237为止。其中,2 4 × 9 = 144 是小于等于237的最大数,之後的288就比237更大了。接下来反过来利用2的幂次与9的乘积来计算237除以9。过程如下:

  • 最后得到 q 的值为26,这就是237除以9的商,237减去234剩余的3就是余数。伪代码如下:
  • 237介于144与288之间,而144和288的平均数是216,比237小,令 q = 16 + 32/2 = 24, p = 32;
  • 234和252的平均数是243,比237大,令 q = 26, p = 26 + 28/2 = 27;
  • 216和288的平均数是252,比237大,令 q = 24, p = 24 + 32/2 = 28;
  • 216和252的平均数是234,比237小,令 q = 24 + 28/2 = 26, p = 28;
  • 设 q = 16, p = 32;

以上的算法的复杂度在 log 2 ⁡ a b {\displaystyle \log _{2}\left{\frac {a}{b}}\right} 级别,当 a b {\displaystyle {\frac {a}{b}}} 较大时,远远比原始的算法快捷。

                                     

4.1. 推广 多项式的带余除法

以域 K {\displaystyle \mathbb {K} } 为系数的多项式构成的多项式整环 K } 中也可以定义带余除法。设有 A 、 B 两个多项式,其中 B 不是零多项式。则存在由 A 和 B 唯一确定的多项式 Q 和 R ,使得:

A = B Q + R {\displaystyle A=BQ+R}

并且多项式 R 是零多项式或者它的次数严格小于 B 的次数,称为多项式带余除法的 余元 。: 10

                                     

4.2. 推广 欧几里德整环

普通的整数或实数之间的带余除法可以良好定义。在更广泛的代数结构中,能够定义带余除法的代数结构被称为欧几里德整环。定义如下:

设有整环 D {\displaystyle D} 和从 D {\displaystyle D} 到自然数的映射 v: D ∖ { 0 D } → N ∪ { 0 } {\displaystyle v:D\setminus \{0_{D}\}\to \mathbb {N} \cup \{0\}} ,使得: 若 a, b ∈ D {\displaystyle a,b\in D} 而 b ≠ 0 D {\displaystyle b\neq 0_{D}} ,则存在 q, r ∈ D {\displaystyle q,r\in D} 使得 a = b q + r {\displaystyle a=bq+r} ,而且要么有 r = 0 D {\displaystyle r=0_{D}} ,或者 v r < v b {\displaystyle vr