欧拉定理 —— 数论四大定理之手

欧拉定理 —— 数论四大定理之手

前言

在了解完欧拉函数以后,我们就仔细来看下 欧拉定理 的概念、证明 和 应用。

一、欧拉定理

na 为正整数,且 n, a 互素,即 gcd(a,n) = 1,则:a^{\phi(n)} \equiv 1 (mod \ n)\\

    证明过程如下:
    1、令 1 \to n 中与 n 互素的数(总共 \phi(n) 个)按顺序排列为:

x_1,x_2,...,x_{\phi(n)}\\

    2、将这些数分别乘上a,得到如下序列: y_i = ax_i \ (1 \le i \le \phi(n))\\

    3、取其中任意两个数相减,得到: \begin{aligned} y_i - y_j &= ax_i - ax_j \\ &= a(x_i - x_j) \\ &= ab\end{aligned}\\

    上面的式子中 gcd(a, n)=1,且 |b| = |x_i - x_j| \lt n,所以 ab 不可能是 n 的倍数。从而得知 y_iy_jn 不同余。即 y_i \ mod \ n\phi(n) 种余数。

    4、由欧几里得算法 (辗转相除法),可以得到: \begin{aligned} gcd(n, y_i \ mod \ n) &= gcd(y_i, n) \\ &= gcd(ax_i, n) \\ &= 1\end {aligned}\\

    所以得出,y_i \ mod \ nn 互素;

    5、综合 1、3 和 4,x_iy_i \ mod \ n 必然是一一映射。所以将所有的 x_i 连乘,y_i \ mod \ n 连乘,两者必然模 n 同余。即: \begin{aligned} x_1 \times x_2 \times ... \times x_{\phi(n)} &\equiv y_1 \times y_2 \times ... \times y_{\phi(n)} \ mod \ n \\ &\equiv ax_1 \times ax_2 \times ... \times ax_{\phi(n)} \ mod \ n \\ &\equiv a^{\phi(n)} \times x_1 \times x_2 \times ... \times x_{\phi(n)} \ mod \ n \end{aligned} \\

    令 X = x_1 \times x_2 \times ... \times x_{\phi(n)},原式可以简化为: X \equiv a^{\phi(n)} X \ mod \ n\\

表示成更加直观的等式为:

( a^{\phi(n)} - 1 )X= kn\\

    由于 gcd(X, n) = 1,则 a^{\phi(n)} - 1 必然得是 n 的倍数,才能满足等式条件。所以 a^{\phi(n)}1n 同余,即: a^{\phi(n)} \equiv 1 (mod \ n)\\

欧拉定理,得证。

二、欧拉定理的应用

求十进制表示都是 8,且是 L (1 \le L \le 2 * 10^9) 倍数的数的最小的长度,不存在则输出 0;

    我们假设这个最小长度为 x,则可以把这个数表示成如下形式:

n = 8 * \frac {10^x - 1}{9}\\

    由于是 L 的倍数,则有: n = kL\\

    等式联立如下: kL = 8 * \frac {10^x - 1}{9}\\

    等式两边同时乘上 9,可得: 9kL = 8 * (10^x - 1)\\

    等式两边同时除上 gcd(L, 8), 得到: \frac {9kL}{gcd(L,8)} = \frac {8} {gcd(L, 8)} (10^x - 1)\\

    我们发现等式右边的 \frac {8} {gcd(L, 8)} 部分,如果不为 1,肯定是能用 左边的 k 来抵消的,因为他是任意正整数。所以进一步化简等式如下: \frac {9k'L}{gcd(L,8)} = 10^x - 1\\

    从而转换成同余式有: 10^x \equiv 1(\ mod \ \frac {9L}{gcd(L,8)}) \\


    转化成了欧拉定理的形式,这时候,如果 gcd(10, \frac {9L}{gcd(L,8)}) \neq 1,则无解,否则通过求 \frac {9L}{gcd(L,8)} 的欧拉函数,就能得到 x 的一个可行解,然后再枚举 x 的因子,套入上面的等式,利用二分快速幂判定,求得最小的满足等式成立的 x 的值即可。

三、思考题

    求十进制表示都是 7,且是 L (1 \le L \le 2 * 10^9) 倍数的数的最小的长度,不存在则输出 0。

编辑于 2021-12-31 19:22