算术基本定理

欧几里得提出并证明:对于任何一个大于 1 的自然数 n,如果 n 不是 质数(素数),那么 n 可以唯一分解成有限个质数的乘积。
该定理名为:Fundamental Theorem of Arithmetic,译为算数基本定理。
该定理的两个要点:存在性唯一性,即一定存在且唯一。
举例:如 分解质因数 - 图1%22%20aria-hidden%3D%22true%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-34%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-3D%22%20x%3D%22778%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-32%22%20x%3D%221834%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-D7%22%20x%3D%222557%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-32%22%20x%3D%223558%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fsvg%3E#card=math&code=4%20%3D%202%20%5Ctimes%202&id=DQi23),分解质因数 - 图2

算法实现

思想:因为存在且唯一,所以可以从质因数 2 开始尝试分解 n,若 n / 2 之后是质数,则直接写成两者的乘积;否则继续用 2 对 n / 2 进行分解,直至 n / 2 为质数或者不能再用 2 来分解,继续用 3 来分解,直至最终 n 变为 1 或者质因数都用完了。
小技巧:遍历一个数 n 的所有因数,只需要遍历到 分解质因数 - 图3
实现:

  1. package main
  2. import "fmt"
  3. func main() {
  4. x := 112
  5. // 尝试分解质因数
  6. for i := 2; i * i <= x; i++ {
  7. for x % i == 0 {
  8. fmt.Println(i)
  9. x /= i
  10. }
  11. }
  12. // 分解后 x 一定是质数
  13. fmt.Println(x)
  14. }
  15. 输出:
  16. 2
  17. 2
  18. 2
  19. 2
  20. 7