乌岚素数螺旋 (Ulam Spiral)

1963 年,数学家 斯坦尼斯瓦夫·乌岚 在一个冗长的学术报告上无聊至极, 随手在一张纸条上把整数写成螺旋,然后圈出素数——他惊讶地发现, 素数的分布并非随机散落,而是呈现出神秘的斜向条纹

半个多世纪过去,这些条纹的成因依然没有完全解释清楚。 这里用 61×61 的螺旋实测一遍,看看乌岚当年看到了什么。

螺旋长什么样

# 是素数,空白是合数,外框 · 是螺旋的边界(1 在正中心):

·······························································
·        #         # #         #           # #         #     #·
·     # #           #   #           # #     #   #     #     # ·
·  #               # #         #                   #     #   #·
·   #       #     #     #         #       #                   ·
·          #     #   # #   #     #     #       #   # #     #  ·
·                             #   #     #       #         #   ·
·#   #         #   #     #     #       #   # #                ·
· #   #     # #           #         # #   # #               # ·
·            # #                 #     #     #               #·
· #             #     #     #     #       #         # # # # # ·
·    # #   #   #             #   #       #   #           #    ·
·                 #     #   # #   #             #   #         ·
·#   # #     #     # #     #   # #                 # # #     #·
·   #       #     # #                     #     #             ·
·                  # #     #   #           #     #           #·
·                             #   # #   #             # # #   ·
·#         # #               #   #       #   # #           #  ·
·           #     #   #           # #     #                   ·
·    #     # #   # #     # #     #     #           #          ·
·       #   # #           #           #   #     # #     #     ·
·        #     #     #   #       #     #               #      ·
·       # #     #   #         #   # #   # # #                 ·
·#       # # # #       #     #         # #   #     # #     #  ·
·                 #     #   # #               #     #     #   ·
·                              # #     #   #   # #   # # #   #·
· # # #     #   #   #   # #   #       #   # #         #       ·
·                              # #   #                 #      ·
· #     # #   #       #   # #     # # #     # # #             ·
·  # #     #   # # # # # # # #   #       #         # #        ·
·                             # # #           #           #   ·
·#   #     #             #   #  ## # # #   # # #     #       #·
·       # #       #       # # #                               ·
·  #                       #   #                              ·
·       # #     #   # #   # #   #   # #   #   # #   #   # #   ·
·  #   #     #     #   #   #     #     # #   #       #     #  ·
·     #                     #           #           #         ·
·#         # #         # #     #   #   #       # #       #    ·
·           # #     #   #           #       #     #         # ·
·              #     #     #   # #                            ·
·   #                     # #   #     #   #     #   # # #     ·
·    # #       # # # #         # #     #     # #   # #   #    ·
·                 #   #           # #                         ·
·#     #     #   # #     #     #   # #           #     #   # #·
· # # # #     # #       #         #       #     #             ·
·        #               # #   # #         #     #            ·
·         #           #   #     #     #         # #     #     ·
·  #       #       # #     #                 #             #  ·
·     #     #   #       #           #   #     #           #   ·
·    # #                                 #     #   #     #    ·
· # #       #   # #   #     #           #             #     # ·
·        #                 #     #   # #               #     #·
·       #     #           #       #               #   #     # ·
·  # # #       #     #   # #   #       #     #                ·
·     #                 #                       #   #         ·
·          #             #     #   # #     #   #     #        ·
·   # #     #                     #           # #           # ·
·  #           #         #           # #     #   # #          ·
·   #                           # #         #       #   #   # ·
·#           #     #       #   #       #                      ·
·           #               #       #   # #   # #             ·
·          # #   #             #     #   #       #         #  ·
·······························································

实测数据(61×61,共 3721 个数)

对象素数个数密度
整个螺旋51913.9%
主对角线 x=y(穿过 1 与 9、25、49…)21 / 6134.4%
副对角线 x=−y(穿过 1 与 3、13、31…)13 / 6121.3%
全螺旋最密对角线 x+y=1822 / 4351.2%
第二密 x+y=−227 / 5945.8%
第三密 x+y=−625 / 5545.5%

最密的斜线素数密度是平均值的 3.6 倍——这正是乌岚当年瞥见的”条纹”。

为什么会有条纹?

一个已知的数学解释是:螺旋中每一条直线上出现的数, 恰好都是一个二次多项式的值(比如副对角线是 4n²−2n+1)。 而某些二次多项式(如欧拉的 n²+n+41)能持续输出很多素数, 于是它们对应的斜线就格外”亮”。

顺手的验证:欧拉多项式

欧拉 1772 年发现 n²+n+41 对 n=0..39 连续 40 个值全是素数。 本脚本实测:✅ 40 个值全部为素数,无一例外。

我原本还想当然地以为这 40 个点会恰好躺在螺旋的一条直线上——实测并没有: 它们从坐标 (−3,−1) 沿一条弧线爬到 (20,−18),落在同一条对角线上的最多只有 5 个。 条纹的真正来源是”整条线上的数都是某个二次多项式的值”,而不是单个多项式的一小段。 这个想当然被数据纠正了,挺好。

怎么玩

python3 ulam_spiral.py 61   # 任意奇数尺寸,比如 101 更大更密

源码:ulam_spiral.py