整除理论(三)带余除法与算数基本定理

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

带余除法及其基本性质

昨天我们已经介绍了最大公约数与最小公倍数的基本定义和性质,下面我们来学习带余除法。带余除法是初等数论证明中最重要、最基本、最直接的工具。

带余除法

带余除法a,ba,b 是两个给定的整数,a0a\neq 0,那么,一定存在唯一的一对整数 qqrr,使得 b=qa+r,0r<ab=qa+r,0\le r<|a|。另外,abr=0a\mid b\Leftrightarrow r=0

证明如下:

(1)唯一性

假设还有整数 q1q_1r1r_1 满足

b=q1a+r1,0r1<ab=q_1a+r_1,0\le r_1<|a|

rr1r\le r_1,则

0r1r<ar1r=(bq1a)(bqa)=(qq1)a0\le r_1-r<|a|\\ r_1-r=(b-q_1a)-(b-qa)=(q-q_1)a

如果 r<r1r<r_1,即 r1r>0r_1-r>0

r1r=(qq1)ar_1-r=(q-q_1)a

r1r=xa(xN+)r_1-r=xa(x\in N^+)

r1r>ar_1-r>|a|

0r1<a0\le r_1<|a| 不符

r>r1r> r_1,同理可得

rr1>ar-r_1>|a|

0r1<a0\le r_1<|a| 不符

综上所述,必有 r1=rr_1=r,进而有 q1=qq_1=q,即满足条件的整数 qqrr 唯一

(2)存在性

aba\mid b 时,q=b/a,r=0q=b/a,r=0

aba\nmid b 时,

构造集合 T={bkakZ}T=\{b-ka|k\in Z\},易知 TT 中存在最小的正整数,记作 t0=bk0>0t0=b-k_0>0

因为 aba\nmid b,所以 t0at_0\neq |a|

t0>at_0>|a|,显然 t1=t0a>0,t1Tt_1=t_0-|a|>0,t_1\in T,与 t0t_0TT 中的最小正整数矛盾

所以 t0<at_0<|a|,取 q=k0,r=t0q=k_0,r=t_0 即可满足要求

综上所述,满足条件的整数 qqrr 一定存在

推广a,b,da,b,d 是给定的整数,a0a\neq 0,则一定存在唯一的一对整数 q1q_1r1r_1,满足b=q1a+r1,dr1<a+db=q_1a+r_1,d\le r_1<|a|+d

一些性质

  1. a>0a>0 ,任意整数被 aa 除后所得的最小非负余数是且仅是 0,1,...,a10,1,...,a-1 中的一个。
  2. 相邻的 aa 个整数被 aa 除后,恰好取到这 aa 个余数。
  3. a2a\geq 2,则任一正整数 nn 必定可以唯一表示为
n=rkak+rk1ak1+...+r1a+r0n=r_ka^k+r_{k-1}a^{k-1}+...+r_1a+r_0
  1. aa 为正奇数且 a1a\neq 1,一定存在正整数 da1d\le a-1,使得 a2d1a|2^d-1

证明如下:

易知 a2j(0j<a)a\nmid 2^j(0\le j<a)

所以 2j=qja+rj,0<rj<a2^j=q_ja+r_j,0<r_j<a

所以 r0,r1,...,ra1r_0,r_1,...,r_{a-1} 可能的取值仅有 a1a-1 个,

即一定存在 rx=ry,0x<ya1r_x=r_y,0\le x<y\le a-1

可得 a(qyqx)=2y2x=2x(2yx1)a(q_y-q_x)=2^y-2^x=2^x(2^{y-x}-1)

因为 aa(qyqx),(a,2x)=1a\mid a(q_y-q_x),(a,2^x)=1

所以 a2yx1a\mid 2^{y-x}-1

即存在正整数 da1d\le a-1,使得 a2d1a|2^d-1

  1. aa 为正奇数且 a1a\neq 1,一定存在正整数 da1d\le a-1,使得 a2d1a|2^d-1
  2. 必有正整数 dd 使得 (2d3,a)=1(2^d-3,a)=1

辗转相除法

辗转相除法u0,u1u_0,u_1 是两个整数,u10,u1u0u_1\neq 0,u_1\nmid u_0,则

u0=q0u1+u2,0<u2<u1u1=q1u2+u3,0<u3<u2u2=q2u3+u4,0<u4<u3...uk2=qk2uk1+uk,0<uk<uk1uk1=qk1uk+uk+1,0<uk+1<ukuk=qkuk+1u_0=q_0u_1+u_2,0<u_2<|u_1|\\ u_1=q_1u_2+u_3,0<u_3<u_2\\ u_2=q_2u_3+u_4,0<u_4<u_3\\ ...\\ u_{k-2}=q_{k-2}u_{k-1}+u_k,0<u_k<u_{k-1}\\ u_{k-1}=q_{k-1}u_k+u_{k+1},0<u_{k+1}<u_k\\ u_k=q_ku_{k+1}

该算法称为辗转相除法。

在上述条件下,

  1. uk+1=(u0,u1)u_{k+1}=(u_0,u_1)
  2. du0du1duk+1d\mid u_0\wedge d\mid u_1\Leftrightarrow d|u_{k+1}
  3. 存在整数 x0,x1x_0,x_1,使得 uk+1=x0u0+x1u1u_{k+1}=x_0u_0+x_1u_1
    即两个整数的最大公约数一定可以表示为这两个整数的整系数线性组合。

用辗转相除法求两个数的最大公约数的C语言代码实现如下。

#include <stdio.h>
int gcd(int a,int b)
{
	if (b==0) return a;
	return gcd(b,a%b);
}
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",gcd(a,b));
    return 0;
}

算数基本定理

算数基本定理a>1a>1,那么必有a=p1×p2×...×psa=p_1\times p_2\times ...\times p_s,其中 pj(1js)p_j(1\le j\le s) 是素数,且不计顺序的情况下,该表示唯一。