文章摘要
Deepseek-v3.2

C++ 原根知识详解

前言:为什么要学原根?

可能你会问,“原根” 听起来这么陌生,学它有啥用?其实它在生活中藏得很深 —— 比如你手机支付时的加密、网上传输文件的安全保障,背后都有原根的影子。而且它

像看起来那么难,就像学骑自行车,一开始觉得复杂,掌握规律后就很简单。这篇文章会用大白话,从最基础的内容讲起,让你轻松搞懂原根。

一、先搞懂两个 “预备知识”

在说原根之前,得先明白两个简单概念,不然就像学数学没学过加减,直接学乘法一样费劲。

1.1 什么是 “互质”?

“互质” 就是两个数的 “最大公约数只有 1”。比如:

  • 3 和 7:它们的公约数只有 1,所以互质;不

  • 4 和 6:公约数有 1、2,最大公约数是 2,所以不互质。

你可以这么记:两个数除了 1 之外,没有其他 “共同的除数”,就是互质。

1.2 什么是 “欧拉函数 φ(m)”?

欧拉函数 φ(m)(读作 “斐 (m)”),简单说就是 “小于 m 且和 m 互质的正整数的个数”。举几个例子:

  • 当 m=7 时:小于 7 的正整数是 1、2、3、4、5、6,这些数都和 7 互质(因为 7 是质数,除了 1 和自己,和其他数都互质),所以 φ(7)=6;

  • 当 m=8 时:小于 8 的正整数是 1、2、3、4、5、6、7,其中和 8 互质的是 1、3、5、7(这些数和 8 的最大公约数都是 1),所以 φ(8)=4;

  • 当 m=4 时:小于 4 的正整数是 1、2、3,和 4 互质的是 1、3,所以 φ(4)=2。

记住:欧拉函数就是 “数个数”,数那些 “比 m 小、还和 m 互质” 的数有多少个。

二、原根到底是什么?(核心定义)

有了上面的基础,咱们就能说原根了。先看定义,我会拆成 “人话” 来讲:

原根定义:设 a 和 m 是互质的正整数,如果满足两个条件:

  1. 存在一个最小的正整数 d,使得 a^d 除以 m 的余数是 1(写成数学式就是 a^d ≡ 1 mod m,“mod” 就是 “除以取余数”);

  2. 这个最小的 d,刚好等于 φ(m)(就是前面说的欧拉函数值)。

    那咱们就说 a 是 m 的 “原根”。

用例子帮你理解:判断 3 是不是 7 的原根?

咱们一步一步来,就像拆快递一样,慢慢看:

  1. 先确认 a=3 和 m=7 是否互质:3 和 7 的最大公约数是 1,满足 “互质” 条件;

  2. 计算 φ(7):前面算过,φ(7)=6,所以咱们要找的 d 得是 “最小的、能让 3^d mod 7=1” 的数,而且这个 d 得等于 6;

  3. 验证 d 是不是最小的 6:

  • 算 3^1=3,3 除以 7 余 3,不是 1;

  • 3^2=9,9 除以 7 余 2,不是 1;

  • 3^3=27,27 除以 7 余 6,不是 1;

  • 3^4=81,81 除以 7 余 4(7×11=77,81-77=4),不是 1;

  • 3^5=243,243 除以 7 余 5(7×34=238,243-238=5),不是 1;

  • 3^6=729,729 除以 7 余 1(7×104=728,729-728=1),刚好是 1!

  1. 结论:没有比 6 更小的 d 能让 3^d mod 7=1,而且 d=φ(7)=6,所以 3 是 7 的原根。

再举个反例:2 是不是 8 的原根?

  1. 先确认 2 和 8 是否互质:2 和 8 的最大公约数是 2,不互质,直接不符合第一个条件,所以 2 肯定不是 8 的原根(而且后面会说,8 本身就没有原根)。

三、不是所有数都有原根!(原根存在的条件)

就像不是所有花都会结果一样,不是所有正整数 m 都有原根。只有以下 3 种情况的 m,才有原根:

  1. m=1、2、4(这三个是特殊的小数字);

  2. m 是 “奇质数的 k 次方”,比如 3²=9(3 是奇质数,k=2)、5³=125(5 是奇质数,k=3);

  3. m 是 “2 乘以奇质数的 k 次方”,比如 2×3=6(3 是奇质数,k=1)、2×5²=50(5 是奇质数,k=2)。

用例子验证:哪些数有原根?

  • m=9:属于 “奇质数的 k 次方”(3²),有原根(前面算过 2 是 9 的原根);

  • m=6:属于 “2 乘以奇质数的 k 次方”(2×3),有原根(比如 5 是 6 的原根,后面可以自己验证);

  • m=8:不属于上面任何一种情况,没有原根;

  • m=12:12=2²×3,不是 “2 乘以奇质数的 k 次方”(因为 2 的次数是 2,超过 1 了),没有原根。

记住:先看 m 是不是这三种情况,不是的话,直接不用找原根了,肯定没有。

四、原根的 “小脾气”:几个重要性质(大白话版)

原根有几个特殊的 “脾气”,理解了这些,后面用原根会更方便。

4.1 一个数的原根不止一个(如果有的话)

比如 m=7,前面知道 3 是它的原根,其实 5 也是它的原根(可以自己算:5^6 mod 7=1,而且没有比 6 更小的 d)。那原根有多少个呢?答案是 φ(φ(m)) 个。

  • 比如 m=7,φ(7)=6,φ(6)=2(小于 6 且和 6 互质的数是 1、5,共 2 个),所以 7 有 2 个原根,刚好是 3 和 5。

4.2 原根的 “幂次” 也能当原根

如果 a 是 m 的原根,那么只要 k 和 φ(m) 互质,a^k 除以 m 的余数也是 m 的原根。

  • 比如 m=7,原根 a=3,φ(7)=6,和 6 互质的数是 1、5;

  • 当 k=1 时,3^1 mod 7=3,是原根;

  • 当 k=5 时,3^5=243,243 mod 7=5,也是原根(和前面的例子一致)。

4.3 原根的幂次有 “周期性”

比如 a 是 m 的原根,那么 a^n 除以 m 的余数,和 a^(n 除以 φ(m) 的余数) 除以 m 的余数一样。

  • 比如 m=7,原根 a=3,φ(7)=6;

  • 算 3^7 mod 7:7 除以 6 余 1,所以 3^7 mod 7=3^1 mod 7=3;

  • 实际计算 3^7=2187,2187 除以 7 余 3,和上面的结果一样,是不是很方便?不用算很大的数了。

五、怎么判断一个数是不是原根?(判定方法)

前面咱们用例子验证过,现在总结成 “步骤”,像查字典一样,一步一步来就能判断。

判定步骤(以判断 a 是不是 m 的原根为例):

  1. 第一步:查 “资格”:先看 a 和 m 是不是互质,如果不互质,直接排除,不是原根;

  2. 第二步:算 “目标 d”:计算 φ(m),咱们要找的 d 就是 φ(m);

  3. 第三步:拆 “φ(m)”:把 φ(m) 分解成质因数(比如 φ(m)=6,分解成 2×3);

  4. 第四步:验证 “最小性”:对于每个质因数 p,计算 a^(φ(m)/p) 除以 m 的余数,如果所有余数都不是 1,那 a 就是 m 的原根;如果有一个余数是 1,就不是。

举个例子:判断 2 是不是 9 的原根?

  1. 第一步:2 和 9 互质(最大公约数 1),有资格;

  2. 第二步:φ(9)=6(小于 9 且和 9 互质的数是 1、2、4、5、7、8,共 6 个);

  3. 第三步:分解 φ(9)=6 的质因数,是 2 和 3;

  4. 第四步:验证:

  • 算 2(6/2)=23=8,8 mod 9=8≠1;

  • 算 2(6/3)=22=4,4 mod 9=4≠1;

  • 两个余数都不是 1,所以 2 是 9 的原根。

六、原根有啥用?(实际应用场景)

学了这么多,总得知道原根能干嘛吧?它的应用主要在 “安全” 和 “计算” 方面:

6.1 密码学:保护你的信息安全

比如手机支付、网上银行转账时,需要把信息加密,防止被偷改。原根是 “离散对数加密” 的核心 —— 简单说,就是利用 “知道 a 和 m,求 a^k mod m 很容易,但知道 a、m 和 a^k mod m,求 k 很难” 这个特点,让加密变得安全。像 Diffie-Hellman 密钥交换(两个人在网上安全交换密码的方法),就用到了原根。

6.2 简化数论计算

比如解 “高次同余方程”(比如 x^5 ≡ 3 mod 7 这样的方程),直接解很难,但用原根把 x 换成原根的幂次,就能把高次方程变成一次方程,轻松求解。

6.3 生成伪随机数

咱们平时用的随机数(比如游戏里的随机掉落),很多是 “伪随机数”(用公式算出来的)。用原根的幂次可以生成 “均匀分布” 的伪随机数,比如根据 3^n mod 7 的结果,能生成 3、2、6、4、5、1、3、2…… 这样的序列,看起来很随机。

七、小白常见问题解答

  1. Q:原根一定要是比 m 小的数吗?

    A:不一定,但通常我们找的是比 m 小的原根,因为大于 m 的数除以 m 会有余数,这个余数肯定比 m 小,而且和原数的效果一样。比如找 10 的原根(10=2×5,有原根),17 是 10 的原根,但 17 mod 10=7,7 也是 10 的原根,所以找小的更方便。

  2. Q:欧拉函数算错了怎么办?

    A:欧拉函数有个简单算法:如果 m 分解成质数的乘积,比如 m=p1^k1 × p2^k2 × … × pn^kn,那么 φ(m)=m×(1-1/p1)×(1-1/p2)×…×(1-1/pn)。比如 m=12=2²×3,φ(12)=12×(1-1/2)×(1-1/3)=12×1/2×2/3=4,和前面算的一致,用这个公式不容易错。

  3. Q:找不到原根怎么办?

    A:先检查 m 是不是符合 “有原根的 3 种情况”,如果不符合,肯定找不到;如果符合,就从 2 开始依次试,比如找 10 的原根,试 2:2 和 10 不互质,排除;试 3:3 和 10 互质,φ(10)=4,分解 4=2,算 3^(4/2)=3²=9 mod 10=9≠1,所以 3 是 10 的原根。

总结

原根其实就是 “和 m 互质、且幂次能生成所有与 m 互质数” 的数,核心是 “互质” 和 “最小周期等于欧拉函数值”。记住 3 个关键点:

  1. 先看 m 有没有原根(3 种情况);

  2. 判断 a 是不是原根,分 4 步走(查资格、算目标、拆因数、验最小);

  3. 原根主要用在加密、计算和生成随机数。

只要多拿几个例子练一练(比如找 5、6、9 的原根),你很快就能掌握原根的知识,下次再听到 “原根”,就不会觉得陌生啦!