数论基础(一)

数学符号

整除 / 同余理论常见符号

  1. 整除符号:xy,表示 x 整除 y
  2. 取模符号:xmody,表示 xy 取模。
  3. 互质符号:xy,表示 xy 互质。
  4. 同余:nk(modm),表示nk 在模 m 意义下同余。
  5. 最大公约数:gcd(x,y),也可记作 (x,y)
  6. 最小公倍数:lcm(x,y),也可记作 [x,y]

数论函数常见符号

  1. 求和符号: 符号,表示满足特定条件的数的和。
  2. 求积符号: 符号,表示满足特定条件的数的积。

逻辑符号

  1. 合取:pq 表示 pq
  2. 析取:pq 表示 pq
  3. 否定:¬¬p 表示 p 的否定。
  4. 蕴含:pq 表示 p 蕴含 q,即若 p 为真,则 q 为真。
  5. 等价:pq 表示 pq 等价。
  6. 存在:;任意:

集合符号

  1. 属于:xA 表示 x 为集合 A 中的元素。
  2. 不属于:
  3. 空集:
  4. {x1,x2,,xn},表示含元素 x1,x2,,xn 的集合。
  5. {xA | p(x)},表示 A 中使命题 p(x) 为真的所有元素组成的集合。
  6. 包含:BA,表示 BA 的子集。
  7. 真包含:BA,表示 BA 的真子集。
  8. 并集:AB,表示 AB 的并集。
  9. 交集:AB,表示 AB 的交集。
  10. 多个集合的并集:i=1nAi 表示集合 A1,A2,,An 的并集。
  11. 多个集合的交集:i=1nAi 表示集合 A1,A2,,An 的交集。

标准数集和区间符号

  1. 自然数集:N,表示所有自然数构成的集合,使用 N+ 来表示所有正整数。
  2. 整数集:Z,表示所有整数构成的集合。
  3. 有理数集:Q,表示所有有理数构成的集合。
  4. 实数集:R,表示所有实数构成的集合。
  5. 复数集:C,表示所有复数构成的集合。
  6. (正)素数集:P,表示所有(正)素数构成的集合。

关系符号

  1. 正比:ab,表示 ab 成正比。
  2. 远大于:ab,表示 a 远大于 b
  3. 远小于:ab,表示 a 远小于 b
  4. 无限大:
  5. 趋近:xa,表示 x 趋近于 a,常用于极限表达式中。

其他常见符号

  1. 阶乘符号:!n! 表示 1×2×3××n。特别的,0!=1
  2. 向下取整符号:x,表示不超过 x 的最大整数。
  3. 向上取整符号:x,表示大于等于 x 的最大整数。
  4. 组合数:(xy),表示从 x 个数中选出 y 个数的方案数。
  5. 第一类斯特林数:[xy];第二类斯特林数:{xy}

整除

定义

a,bZ,a0qZ,使得 b=aq,那么 b 可被 a 整除,记作 ab

性质

  • ababa1|a||b|
  • abbcac
  • abbab=±a
  • m 不为 0,则 abmamb
  • b 不为 0,则 ab|a||b|

其他概念

因数(约数):若 ab,则 ba 的倍数, ab 的因数。
平凡因数:对于整数 b0±1±b 称为 b 的平凡因数。
素数(质数):只有平凡因数作为因数的数称为素数。

通常而言,约数指的是正约数

最大公约数与最小公倍数

定义

最大公约数,即为 Greatest Common Divisor,缩写为 gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数,而最大公约数是其中最大的一个。
最小公倍数,即为 Least Common Multiple,缩写为 lcm。定义可以参考 gcd。

求法

如何求出一组整数的最大公约数与最小公倍数呢?我们可以先从两个整数 ab(a>b) 开始考虑。处理这个问题的经典算法是欧几里得算法,又名辗转相除法。

具体而言,我们可以分两种情况讨论。假如 ba,那么 b 即为 ab 的最大公约数;但如果 ba 又该如何?这时候,就要用到辗转相除法的精髓:gcd(a,b)=gcd(b,amodb)

证明:
a=kb+c,那么 c=amodb。又令 ab 的最大公约数为 d,显然有 dc。考虑反证法:如果 gcd(b,c)d,那么 gcd(a,b)=gcd(kb+c,b)d,与我们的假设 dab 的最大公约数矛盾,因此“gcd(b,c)d”不成立,即 gcd(a,b)=gcd(b,amodb)

那么,我们该如何利用这个性质求出 gcd(a,b) 呢?我们可以考虑临界情况:当 bmoda=0 时,显然 b 即为我们要求的最大公约数。那么我们可以进行递归求解,只要其中一个数为 0 即可停止。

不难写出这样的代码:

// 正常版本
int gcd(int a, int b) {
    if (b == 0) return a;
    else return gcd(b, a % b);
}

// 三位运算符版本
int gcd(a, b) { return b ? gcd(b, a % b) : a; }

那么,要求一组数的最大公约数,我们可以先求出前两个数的最大公约数,再求这个数与第三个数的最大公约数,以此类推即可。

那么 lcm 呢?我们可以用到这样一个性质:a×b=gcd(a,b)×lcm(a,b)

证明:
a=p1ka1p2ka2pskasb=p1kb1p2kb2pskbs。显然 gcd(a,b)=p1min(ka1,kb1)p2min(ka2,kb2)psmin(kas,kbs)lcm=p1max(ka1,kb1)p2max(ka2,kb2)psmax(kas,kbs)。不难看出,a×b=gcd(a,b)×lcm(a,b)

那么,我们只需要类比上面的思路,求出最大公约数之后再求出最小公倍数即可。

posted @   Floze3  阅读(354)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示