『数字的魅力』数学中那些美丽的巧...

物理
『数字的魅力』数学中那些美丽的巧合

用户头像
芥. 更新于2026-5-2 16:08:08

$最新版$

题外话:感谢诸位的投稿,白芥真心赞美每一位愿意分享的朋友,也欢迎大家继续讨论。

(为方便打字,迁移到这个帖子上了)


白芥并非数学竞赛生,对于帖中提到的不少知识点——其实说起来是大部分——都只是停留在“听说过”的阶段,因此在更新这个帖子的时候,确实感到有些吃力。我计划在五一期间集中学习一下,争取能整理出一个像样的汇报,如果中间有错误,还请大家不吝指出,我会认真改正。


如果哪位朋友愿意就某个知识点提供详细的讲解,白芥会非常感激。我也很清楚自己的能力有限,所以如果有人愿意加入帖子管理工作或直接接管这个帖子,我会全力支持,绝无二话。


---


数学是一门理性的学科,它的抽象美时常让我着迷。零零散散记下一些,与君共赏。


---


一、142857


这个六位数看上去并不起眼。我们很容易发现它能被3整除,稍加技巧也能看出它能被11整除,如果观察力更敏锐一些,还会发现它同时也是37和13的倍数。

但如果它的魅力仅止于此,恐怕还谈不上“美”。于是,试着把它乘2——

285714

似乎也没有太多特别之处。

再乘3——

428571

隐隐觉得有些眼熟,却说不上来。

继续乘4、乘5、乘6:

571428

714285

857142

这时候,或许已经隐约意识到了什么。把这些结果排在一起看:

1 → 142857

2 → 285714

3 → 428571

4 → 571428

5 → 714285

6 → 857142

每个结果都用到了完全相同的六个数字,只是顺序在轮转,像一盏走马灯。

忍不住再算一下乘7——

999999

看着屏幕上这行数字,此刻“艺术已成”

解析:142857的这些倍数确实只是数字顺序的循环,这种走马灯般的规律已经足够奇妙。而更让人意外的是,任意一个结果的前三位与后三位相加,和也总是999。比如142+857=999,285+714=999……

(评论区里还有朋友提到1/13的循环节076923、1/19的超长循环节,也有类似的对称性。白芥目前还理解得不够透彻,争取五一期间弄明白后再补充上来。)


---


二、斐波那契数列与黄金分割比

(整理自评论区“羽落繁星”和“即未用户9223”的投稿)

斐波那契数列是这样一串数:1, 1, 2, 3, 5, 8, 13, 21, 34……从第三项开始,每一项都是前两项之和。

这个数列有一个很有趣的性质:前一项除以后一项,得到的比值会越来越接近0.618……也就是黄金分割比。

举例来说:

3÷5 = 0.6

5÷8 = 0.625

8÷13 ≈ 0.6154

13÷21 ≈ 0.6190

34÷55 ≈ 0.6182

越往后越靠近0.618033…。

更神奇的是,无论你从哪两个正数开始(只要不同时为零),按照同样的规则递推下去,前后项的比值最终都会收敛到黄金分割比。这种不依赖于起点的普适性,让人觉得数学在安静地统一着什么。

---

三、从圆到球的“求导奇迹”

(整理自“即未用户9223”等朋友的评论)

圆的面积公式是 S = \pi R^2 。如果对半径 R 求导,得到 \frac{dS}{dR} = 2\pi R ——这不正是圆的周长公式吗?

球的体积公式是 V = \frac{4}{3}\pi R^3 。同样对 R 求导,得到 \frac{dV}{dR} = 4\pi R^2 ——这正是球的表面积公式。

为什么会这样?直观地想:当半径增加一点点时,面积或体积的增量,恰好等于“边界”的长度乘以那一小段半径。微分在这里像是搭了一座桥,把整体和边界联系在了一起。这种简洁和深刻,真的很美。

---

4、走马灯数的推导

(直接来自落叶如坤)以下是对落叶如坤两段回复的整理,在保留原文核心内容、公式和推导逻辑的前提下,将断开或跳跃的句子连接成更通顺的完整段落,方便大家阅读。


---


整理自落叶如坤的回复(保留原文意思,语序略作调整)


走马灯数的充要条件是:10 是它的原根,即对于奇素数 p , p-1 是最小的满足 10^x \equiv 1 \pmod{p} 的 x 。这一点是显然的。特别地,由二次剩余的欧拉判别法可知,10 必须是模 p 的二次非剩余,即不存在整数 x 使得 p \mid x^2 - 10 。这对于大于 3 的奇素数是显然的,而 10 不是 3 的原根,从而也可以得到。这是一个必要不充分条件。


于是我们需要勒让德符号 \left(\frac{10}{p}\right) = -1 。分解 10 = 2 \times 5 ,得 \left(\frac{2}{p}\right)\left(\frac{5}{p}\right) = -1 。已知 \left(\frac{2}{p}\right) = 1 当且仅当 p \equiv \pm 1 \pmod{8} (常用形式是 p \equiv 1 \pmod{8} 时值为 1, p \equiv 3,5 \pmod{8} 时值为 -1)。下面分类讨论:


1. 若 p \equiv 1 \pmod{8} ,则 \left(\frac{2}{p}\right)=1 ,所以 \left(\frac{5}{p}\right) = -1 。利用二次互反律:

   \left(\frac{5}{p}\right) = (-1)^{\frac{5-1}{2}\cdot\frac{p-1}{2}} \left(\frac{p}{5}\right) = \left(\frac{p}{5}\right),

   \]  

   因此 \left(\frac{p}{5}\right) = -1 。由于模 5 的二次剩余是 1 和 4,非剩余是 2 和 3,所以 p \equiv 2,3 \pmod{5} 。结合 p \equiv 1 \pmod{8} ,得到 p \equiv 7, 17, 23 \pmod{40} 。

2. 若 p \equiv 3 \pmod{8} ,则 \left(\frac{2}{p}\right) = -1 ,所以 \left(\frac{5}{p}\right) = 1 。同理可得 p \equiv 1,4 \pmod{5} ,结合 p \equiv 3 \pmod{8} ,得到 p \equiv 11, 19, 21 \pmod{40} 。


综上,走马灯数除以 40 的余数只能是以下 8 个数之一:7, 11, 17, 19, 21, 23, 29, 33。注意,这是一个必要不充分条件——余数在这些值中的奇素数不一定是走马灯数。最简单的反例是 p = 11 (余数 11),10 模 11 的原根是 2 而非 11,但 10 确实是模 11 的二次非剩余。


---


下面给出更实用的充要判定方法。奇素数 p ( p \neq 5 )是走马灯数当且仅当 10 是模 p 的原根。这意味着对所有 1 \leq x \leq p-2 , p \nmid 10^x - 1 。由费马小定理, p \mid 10^{p-1} - 1 。假设 10 不是原根,则存在某个 x ( 1 \leq x \leq p-2 )使得 p \mid 10^x - 1 。由 Bézout 定理,存在整数 m,n 使得 m(p-1) + nx = \gcd(p-1, x) 。于是


10^{\gcd(p-1,x)} \equiv (10^{p-1})^m \cdot (10^x)^n \equiv 1 \pmod{p}.


显然 \gcd(p-1,x) \mid p-1 ,且因为 x \leq p-2 ,有 \gcd(p-1,x) < p-1 。因此存在整数 k \geq 2 使得 k \cdot \gcd(p-1,x) = p-1 。设 q 是 k 的任意一个素因子,则 \gcd(p-1,x) \mid \frac{p-1}{q} 。令 \frac{p-1}{q} = l \cdot \gcd(p-1,x) ,则有


10^{\frac{p-1}{q}} \equiv (10^{\gcd(p-1,x)})^l \equiv 1 \pmod{p}.


由此得出:若 p 不是走马灯数,则存在 p-1 的一个素因子 q 使得 10^{\frac{p-1}{q}} \equiv 1 \pmod{p} 。取逆否命题,即:若对 p-1 的每一个素因子 q 都有 10^{\frac{p-1}{q}} \not\equiv 1 \pmod{p} ,则 p 是走马灯数。这就是一个可以实际验证的充要条件。


以 p = 19 为例: p-1 = 18 ,素因子只有 2 和 3。我们只需计算 10^9 和 10^6 模 19 的余数。


10^3 \equiv 1000 \equiv 12 \pmod{19},\quad

10^6 \equiv 12^2 = 144 \equiv 11 \pmod{19},\quad

10^9 \equiv 11 \times 12 = 132 \equiv 18 \pmod{19}.


两者均不为 1,因此 19 是走马灯数。对于更大的数,这种方法比直接观察循环节快得多,并且可以用于编写程序(时间复杂度约为 O(\sqrt{p}) ,主要消耗在分解 p-1 的素因子上,快速幂的时间要小得多)。


---


一点诚恳的求助

上面这三个例子,已经是白芥尽最大努力理解之后能够写出来的内容了...评论区后面还有关于“原根”、“外微分”、“高斯绝妙定理”、“走马灯数的充要条件”等等,白芥不知道了......

真诚地希望大家能帮帮白芥(这个五一真的不想爆改成数学特训呐!!)


1. 如果哪位朋友有能力且愿意直接接管这个帖子(甚至成为主楼的维护者),请随时联系白芥,我会非常感激并全力配合。

2. 如果不愿意为自己带来太多的麻烦,但愿意针对某一个具体知识点写一段通俗易懂的讲解(比如“为什么1/19也是走马灯数”或“外微分如何统一四大定理”),也请不吝赐教。我会将您的讲解汇总到主楼,并清楚署名致谢。

五一期间白芥尽可能地多学一点,尽力补上一些缺漏吧,但是太过高深的点白芥真的学不明白..这就不得不依靠大家的讨论啦!

再次感谢每一位阅读、留言、分享智慧的朋友。

收起
10
5
共2条回复
时间正序
用户头像
白芥呀~
1月前

快来看看呐!!

@羽落繁星

@即未用户9223

@本列列车开往翡翠公园方向(@不出来...)

@落叶如坤

1条评论
用户头像
即未用户9223
1月前

$\LaTeX$是不是两端没有加dollar符号🤔

周四的时候花了一个小时写的C程序(“翡翠公园”是我大号),求n以内的全部base进制走马灯数(一般我们令base=10)

(没有AI参与,注释是我为了看着方便发到这的时候加的):

(不想看程序的直接翻到最底)

#include <stdio.h>

#define N (1000000+10) //默认n不超过10^6

#define FILENAME "CycleNumber.txt" //输出文件名

int prime[N];

int v[N];

int div[32];

long long rest[32];

int calc[32];

int main() {

    int n, base;

    scanf ("%d%d", &n, &base); //输入n,base

    FILE *out = fopen (FILENAME, "w+");

    if (!out) return 0;

    int count = 0; //计数素数个数

    int numbers = 0;

    for (int i = 0 ; i < n ; ++i) {

        prime[i] = 0;

        v[i] = 0;

    } //素数列表初始化

    for (int i = 2 ; i < n ; ++i) {

        if (!v[i]) {

            prime[count++] = i;

            v[i] = i;

        }

        for (int j = 0 ; ; ++j) {

            if (prime[j] && prime[j] <= v[i] && i * prime[j] < n)

                v[i * prime[j]] = prime[j];

            else break;

        }

    } //线性筛法求n以内的素数

    for (int try = 0 ; try < count ; ++ try) {

        int p = prime[try]; //遍历n以内的素数p

        if (!(base % p)) continue; //跳过base的约数

        for (int i = 0 ; i < 32 ; ++i) {

            rest [i] = 0;

            calc [i] = 0;

            div [i] = 0;

        } //初始化

        rest [0] = base % p;

        for (int i = 1 ; i < 32 ; ++i)

            rest [i] = (rest [i-1] * rest[i-1]) % p; //求base^(2^i)模p的约数,用于快速幂计算

        int n0 = p - 1;

        int ncount = 0; //计数n0素因子个数

        int temp = n0;

        for (int i = 0 ; i < try ; ++i) {

            int p0 = prime[i];

            if (!(n0 % p0)) {

                div[ncount++] = p0;

                while (!(temp % p0))

                    temp /= p0;

            }

            if (temp == 1) break;

            if (p0 * p0 > n0) {

                div[ncount++] = temp;

                break;

            }

        } //试除法求n0的全部素因子

        int valid = 1;

        for (int i = 0 ; i < ncount ; ++i) { //遍历n0的素因子

            int nq = n0/div[i];

            int tmp = nq;

            int j = 0;

            while (tmp) {

                calc [j++] = tmp % 2;

                tmp /= 2;

            } //写出nq的二进制表示

            int prod = 1;

            for (int j = 0 ; j < 32 ; ++j)

                if (calc [j]) prod = (prod * rest[j]) % p; //求快速幂

            if (prod == 1) {

                valid = 0;

                break; //base模p的阶不超过nq,base不是p的原根,不符合条件,且跳出循环

            }

        }

        if (valid) {

            fprintf (out, "%d\n", p);

            ++numbers; //输出“走马灯数”到文件,并计数

        }

    }

    fprintf (out, "%d numbers in total", numbers); //输出小于n的“走马灯数”个数

    fclose (out);

    return 0;

}

输入:

100 10

我们在输出可以得到所有100以内的10进制“走马灯数”:

7

17

19

23

29

47

59

61

97

9 numbers in total

用这一程序,我们求得,1000000以内的10进制“走马灯数”共有36187个。在调试过程中可以查看count(不知道为啥不支持scanf,所以必须将scanf输入注释掉然后将第一句改为int n = 1000000, base = 10;),知1000000以内共有78498个素数。“走马灯数”个数略小于素数个数的一半。

我们注意到, $\varphi(40)=40\times\frac{1}{2}\times\frac{4}{5}=16$ ,也就是说素数(除了2和5)除以40共有16种不同的余数,其中8种使得10为其平方剩余,8种使得10为其平方非剩余。由此可以估计,使得10为其平方非剩余的素数大约为全部素数的一半。删去全部平方剩余后,还有少数素数使得10不是其原根。从而可以从定性的角度大致解释“走马灯数”个数为何略小于素数个数的一半。至于定量的解释,可能需要更高深的知识,估计已经超出了我能理解的范围,因此不作深入研究。