质因数计算器
结果
质因数分解
- 质因数个数
- 6
- 正因数个数
- 24
质因数分解是把一个整数写成若干个质数相乘,重复出现的用指数合并起来。质数是大于 1、除了 1 和它自己以外没有别的数能整除它的那些数:2、3、5、7、11、13 等等。每一个大于 1 的整数都能这样写出来,而且写法只有一种,整个学科就架在这条事实上。12 是 2² × 3;360 是 2³ × 3² × 5,页面把它印成 2^3 * 3^2 * 5,让指数在纯文本里也不会看错。页面同时给出两个容易混的个数。第一个数的是质因数的个数,重复的算进去:12 = 2 · 2 · 3 一共三个。第二个数的是正因数的个数,也就是能整除它的那些数:12 有 1、2、3、4、6、12 六个。对 12 来说这两个答案是 3 和 6,谁都没错,它们数的是两样东西。中文教材里手算分解通常用短除法:拿最小的质数去试除,除得尽就把商写在下面继续除,直到商是质数为止,把这些除数和最后的商乘起来就是分解式——页面做的就是这件事,只是把顺序固定成从小到大。当这个数本身就是质数时,分解式就是它自己,指数 1 不印出来,两个个数也同时落到最小:一个质因数、两个正因数。
四个数、它们的分解式,以及两个个数并排对照
| 数值 | 质因数分解 | 质因数个数 | 正因数个数 |
|---|---|---|---|
| 12 | 2^2 * 3 | 3 | 6 |
| 60 | 2^2 * 3 * 5 | 4 | 12 |
| 360 | 2^3 * 3^2 * 5 | 6 | 24 |
| 720720 | 2^4 * 3^2 * 5 * 7 * 11 * 13 | 10 | 240 |
这张表存在的理由就是那两个个数列,它们越往下差得越开。12 是 3 与 6;60 是 4 与 12;360 是 6 与 24;720720 是 10 与 240。每一行两列都是对的,而它们之间越拉越大的差距就是重点。左列把指数加起来,所以只有当出现新的质数或者已有的质数重复时才增长;右列把每个指数加一再连乘,所以质数每重复一次它就乘一次——这就是为什么由许多小质数、且指数很高的数,收集正因数的速度远超过它的大小给人的印象。最后一行把这件事摆得很清楚:720720 远不到一百万,却有两百四十个正因数,比一百万以内任何别的数都多。它也解释了输入上界为什么取在这里而不是更小——讲分解的一页,本来就应该覆盖自己范围内最能分解的那个数。
公式
360 = 2^3 * 3^2 * 5;质因数个数 Ω(360) = 3 + 2 + 1 = 6;正因数个数 d(360) = (3+1) × (2+1) × (1+1) = 24
- n
- 被拆开的那个数,取 1 到 1000000 之间的整数。这个范围是内核数字论模块一路用的那一个,所以它与因数计算器完全一致,两页之间来回看的读者看到的是同一组边界。小数一律拒绝而不是四舍五入;0 与负数也拒绝,因为质因数分解是关于正整数的一句话
- p
- 质因数,也就是能整除 n 的质数。页面按从小到大试除,所以最小的质数总是先被拿出来,印出来的分解式永远从最小的质数排到最大的。360 的质因数是 2、3、5,再没有别的质数能整除它
- e
- 指数,也就是这个质数在乘积里出现了几次。360 是 2 × 2 × 2 × 3 × 3 × 5,所以 2 出现三次、3 出现两次。只出现一次的质数不印指数:360 里那个 5 写作光秃秃的 5 而不是 5^1,这是通用写法,也让短的分解式好读
- 2^3 * 3^2 * 5
- 360 的分解式印出来的样子,也是默认输入。^ 表示指数、* 表示乘法,整串东西因此可以直接复制进纯文本框或者搜索框。大于 1 的每个整数都只有这一个式子,这正是它值得印出来的原因:360 不可能被写成另一组质数的乘积
- Ω(360) = 3 + 2 + 1 = 6
- 带重数的质因数个数:三个 2、两个 3、一个 5,一共六个。这个数最容易让人意外,因为 360 感觉上是三个质数搭起来的,不是六个。做法是把指数加起来,而不是数有几个不同的质数;只要某个指数大于 1,两个答案就会不一样
- d(360) = (3+1) × (2+1) × (1+1) = 24
- 正因数的个数,用同一批指数算出来:每个指数加一再连乘。清单是 1、2、3、4、5、6、8、9、10、12、15、18、20、24、30、36、40、45、60、72、90、120、180、360,一共二十四个。这跟上面那个不是同一个问题:它数的是能整除 360 的数,不是搭出 360 的质数
当问题问的是一个数的乘法结构而不是它多大时,就要用分解式。约分与化简根式是最日常的两处:√72 = 6√2 是因为 72 = 2³ × 3²,每个质数的指数告诉你它能从根号里出来多少个,而根式化简那一页读的正是这份分解。求两个数的最大公因数或最小公倍数也是这件事,只是每个数各做一次:公有的质数取指数小的那个连乘得到前者,全部质数取指数大的那个连乘得到后者。整除问题同样如此,因为一个数能整除另一个数,当且仅当它的每个质数与指数在对方那里都够用。数论里这份分解还能一次性回答一个数是不是质数、有多少个正因数、是不是完全平方数(每个指数都是偶数)、是不是完全立方数。方法的边界也值得知道:试除法算一百万很快,算一个一百位数毫无希望,而这个「易与难」之间的落差正是公开密钥密码学的立足点。当你要问的是哪些数能整除它而不是哪些质数搭出它,因数计算器把清单列出来;当你要问的是它到底是不是质数,质数计算器直接回答。
算例
默认那一格:360
- 360 是偶数,拿 2 去除:360 ÷ 2 = 180,再 ÷ 2 = 90,再 ÷ 2 = 45,一共除了三次
- 45 不是偶数;下一个质数是 3,45 ÷ 3 = 15,再 ÷ 3 = 5,除了两次
- 5 是质数,于是分解式是 2 × 2 × 2 × 3 × 3 × 5,记作 2^3 * 3^2 * 5
- 带重数数一遍质因数:3 + 2 + 1 = 6
- 用指数算正因数个数:(3 + 1) × (2 + 1) × (1 + 1) = 4 × 3 × 2 = 24
默认输入,也是这一页为什么把两个个数都印出来的那一格。6 与 24 并排摆着,期待它们相等的人会以为其中一个坏了。并没有:6 是这个数在保留每一个重复的前提下由几块质数拼成,24 是有几个数能整除它。两者的差距来自指数——质数每重复一次,正因数个数就乘一次,而质因数个数只是加一。随便挑一个用手核一遍都不长;两个都核一遍,你就不会再记混了。
差距最小的那一格:12
- 12 ÷ 2 = 6,6 ÷ 2 = 3,所以 2 出现两次
- 3 是质数,分解式是 2^2 * 3
- 带重数数质因数:2 + 1 = 3,也就是 2、2、3
- 列出正因数:1、2、3、4、6、12,一共六个
- 用算法核对:(2 + 1) × (1 + 1) = 3 × 2 = 6,与清单一致
这一页围绕的那处混淆,在最小的数上看得最清楚,因为两个个数都小到能在几秒内手工核对。12 由三个质数搭成——2、2、3——而有六个数能整除它。把它读成「3 个正因数」或者「6 个质因数」听起来都像那么回事,两个都是错的。因数清单还露出了让 6 成为偶数的那种配对:1 配 12、2 配 6、3 配 4。12 不是完全平方数,所以没有哪个因数跟自己配对,这正是个数为偶的原因。
必须单独决定的那一格:1
- 1 不能被任何质数整除——除以 2、3、5 或别的质数都会得到分数
- 所以它一个质因数也没有,个数是 0
- 能整除 1 的正数只有 1 自己,所以正因数个数是 1
- 分解式印成一个数字 1,而不是留空
这一格是「必须决定」而不是「能推出来」的,而决定是印出 1。留空会读成没算出来,那是结果面板最不该有的样子。两个个数随后都老老实实落下来:一个质数也没有,一个正因数。1 既不是质数也不是合数——它是乘法单位元,乘上它什么都不变——页面不去假装它是别的什么。它被接受而不是被拒绝,因为输入范围的下界就是 1,而把自己范围的下界拒之门外,解释起来比回答它更费劲。
局限
输入必须是 1 到 1000000 之间的整数。0 会被拒绝:每个质数都整除 0,乘积得是无穷大才写得完。负数出于相近的理由也被拒绝——质数照样整除它们,但符号得单独带着走,而唯一分解那句话是就正数说的。小数一律拒绝而不是四舍五入,因为四舍五入等于悄悄回答另一个数的问题。一百万这个上界来自共用的数字论模块,它是成本问题而不是正确性问题:拿不超过平方根的质数逐个试除,算一百万是瞬间的事,算一个二十位数则毫无希望。这是方法本身的边界,而公开密钥密码学正架在同一条边界上。页面只给分解式与两个个数:不列出因数清单本身,不跨多个数求最大公因数或最小公倍数,也不化简根式或分数。指数为 1 时不印,所以只出现一次的质数就是个光秃秃的数;乘法号一律用星号,于是输出是纯 ASCII,也不会出现千位分隔符。最后,下面对照表里的四个数是固定的,不跟着你的输入走。
常见问题
- 页面上那两个「个数」有什么区别?
- 第一个数的是质因数个数,重复的算进去;第二个数的是正因数个数。12 的答案是 3 和 6,两个都对。12 是 2 × 2 × 3,由三块质数拼成;而 1、2、3、4、6、12 都能整除它,所以它有六个正因数。在小数上两个数挨得近,混起来很自然。前者的做法是把指数相加,后者的做法是每个指数加一再连乘。连乘这一步正是后者跑得快得多的原因——质数每多重复一次,正因数个数就乘一次,而前者只是加一。
- 一个数的质因数分解只有一种吗?
- 是,而且这是一条定理而不是约定。每个大于 1 的整数都能写成质数的乘积,并且在不计顺序的前提下写法只有一种。360 永远只是 2³ × 3² × 5,不会同时还是另一组质数的乘积。这条结论叫算术基本定理,没有它,印出一个分解式就只是一种趣闻而不是答案。它也解释了页面为什么可以从最小的质数开始印——顺序是为了好读而定的,定死它不会丢掉任何信息。
- 输入 1 会得到什么?
- 分解式印成 1,质因数个数是 0,正因数个数是 1。1 既不是质数也不是合数:它没有通常意义上的质因数分解,上面那条定理也是就大于 1 的数说的。但结果面板留空会读成没算出来,所以页面把那个数字印出来,两个个数照实给。1 的正因数确实是 1 个,因为能整除 1 的正数只有它自己;质因数个数确实是 0 个。1 被接受而不是被拒绝,因为输入范围的下界就是 1,而把自己范围的下界拒掉,比回答它更难解释。
- 为什么上界是一百万?
- 因为方法是试除法,而它的代价随数字的平方根增长。找一个接近一百万的数的质因数,要试到一千为止,瞬间就有结果;找一个二十位数的质因数,要试到一百亿,那就没底了。这道差距不是实现细节,它是问题本身的性质,也正是公开密钥密码学的立足点——大数分解难,才让一条消息保得住密。在一百万以内每个答案都立刻回来,而上界写在输入里,不是藏在某个超时里。
- 什么时候需要分解式,而不是一份因数清单?
- 当问题问的是结构而不是成员的时候。化简 √72 需要 72 = 2³ × 3²,因为指数告诉你每个质数能从根号里出来多少个,出来之后是 6√2。求两个数的最大公因数需要两份分解式,因为答案是公有的质数取指数小的那个。判断一个数是不是完全平方数,看一眼指数就行——全是偶数就是。列因数清单是另一个问题,而且按数的大小它可能长得离谱:720720 有 240 个正因数,印出来一大片,能看出来的信息却不多。要清单的时候去因数计算器那一页。
- 为什么质数只出现一次时不印指数?
- 因为给单独一个 5 写 5^1 是噪音。数学里的写法是只在指数大于 1 时才印出来,所以 360 写成 2^3 * 3^2 * 5,最后那一项是光秃秃的。省掉它不会丢东西:不写指数就意味着指数是 1,没有第二种读法;而一个完全由单次质数搭成的数——也就是无平方因数的数——读起来就是一串普通的乘积,一个 ^ 都没有。同一条约定也解释了为什么 97 这个质数印出来就是 97,而不是 97^1。
参考资料
- Prime Factorization —— 把一个整数写成质数连乘,以及找出那些质数的算法 — Wolfram MathWorld(美国)
- Fundamental Theorem of Arithmetic —— 每个大于 1 的整数都只有唯一一种质因数分解,这正是把分解式印出来值得的原因 — Wolfram MathWorld(美国)
- Divisor Function —— 正因数个数、由指数算出它的那条公式,以及它在单一质数的幂上的表现 — Wolfram MathWorld(美国)
- 教育部关于印发义务教育课程方案和课程标准(2022 年版)的通知——附件清单第 5 项为《义务教育数学课程标准(2022 年版)》;分解质因数与因数、倍数是小学高年级数与代数领域的内容,原文与学段要求以该附件为准 — 中华人民共和国教育部