^.?$|^(..+?)\1+$ 为啥能召唤质数?

Description
翻译&时轴:贰鼠
额外翻译、审核、时轴、后期处理:Origami Alice

本视频“How on Earth does ^.?$|^(..+?)\1+$ produce primes?” (https://www.youtube.com/watch?v=5vbk0TwkokM)
于2024年10月30日上传至油管
-----------------------------------------------------
^.?$|^(..+?)\1+$

<道具已售完>

Illya Gerasymchuk 的精彩博文:“揭秘检查数字是否为素数的正则表达式”:https://illya.sh/the-codeumentary-blog/regular-expression-check-if-number-is-prime/

感谢所有分享此正则表达式历史记录的人。它似乎是 25 年前由一位名叫 Abigail 的 Perl 程序员编写的。

向观众 Dave Cross 致敬,他在 2000 年的一篇博客文章中发现了这一已知最早的提及:http://test.neilk.net/blog/2000/06/01/abigails-regex-to-test-for-prime-numbers/

感谢观众 Chris Lawrence 和 Jimmy Diep 提出这个主题。

特别感谢我的 Patreon 支持者。他们为我提供了所有质数。https://www.patreon.com/standupmaths

更正:(已在B站上修改)
- 有几个人纠正我,说正则表达式是零索引的,只是 \0 指的是整个匹配的字符串。
- Mike Salisbury 等人指出,重复通配符表的最左列不应该被包含进去。否则字符串的长度可能会匹配单个素数的长度。
- 在6:07,我把“以m开头和结尾”写成了“以m开头和结尾”,而我的意思是以“s”结尾。没有人比 Timur Sultanov 更积极地纠正这个错误的观众了。
- 有些人担心我对"rejex"的发音。
- 如果还有发现错误,请联系

摄影、特效、以及编辑来自于 Alex Genn-Bash
写作和表演者是 Matt Parker
Sam Hartburn 提供了额外的材料
乱扔数字是 Lucie Green 干的事
诡异的灯光等出品员是 Nicole Jacobus
音乐来源于 Howard Carter
设计来自 Simon Wright 和 Adam Robinson

马特·帕克:讲脱口秀的数学家
网页: http://standupmaths.com/

Comments

OnyxAmber 2025-04-26

当我想对正则表达式破口大骂的时候,正则表达式精准匹配并屏蔽掉了我的脏话

♥ 1435 ↩ 8

2025-04-26

我有一个问题,我打算用正则表达式解决它。很好,现在我有两个问题了。

♥ 851 ↩ 16

苦莫kvmeo 2025-04-26

我一直不知道那些异世界的平民,看见一个人叽里咕噜一大堆,最后变出了个大火球是个什么心情。 …… 现在我知道了……

♥ 470 ↩ 5

Sunchy321 2025-04-26

[笑哭]什么正则表达式入门。。 话说回来这个效率应该跟暴力搜索差不多

♥ 377 ↩ 10

四方霸主 2025-04-26

省流:九九乘法表不要第一列(一几得几)后,判断这个数字在不在剩下的结果里,在就是合数,不在就是质数。(别较真问我81之后的数字,问就是你自己去扩写九九乘法表成不可思议不可思议乘法表)[doge]

♥ 243 ↩ 11

icai 2025-04-26

(($:@(<#]),=#,~$:@(>#])){~?@#)^:1<# 这行能实现排序

♥ 447 ↩ 15

不是鲈鱼 2025-04-26

[doge]都归功于后引(back reference),加上它以后正则表达式的表达力已经超过正则语言了,甚至上下文无关文法都没办法匹配长度为质数的字符串(泵引理可证)。之前有篇论文证了不限数量的后引的正则表达式的匹配问题是 NP 完全。

♥ 170 ↩ 7

野人学派 2025-05-01

省流: 一、输入一个自然数n; 二、生成length为n、字符全为"1"(别的字符也行)的字符串; 三、匹配正则表达式: 1、竖线|表示或; 2、竖线左边^.?$匹配length为0或1的字符,若匹配到返回true,即n为0或1; 3、竖线右边^(..+?)\1+$ a、先找到字符串开头2个字符,用这2个字符往后比对,在之后要找到一组以上的对应,一直找到字符串末尾刚好没有剩余字符,即为匹配,返回true——即两个两个数,数出两组以上,最后刚好数完,即n为2的2以上倍数; b、若不然,再找到字符串开头3个字符,用这3个字符往后比对,…没有剩余字符,即为匹配,返回true…即n为3的2以上倍数; c、若不然,再找到字符串开头4个字符,用这4个字符往后比对,…没有剩余字符,即为匹配,返回true…即n为4的2以上倍数; ⋮ n、若不然,再找到字符串开头n个字符,刚好取到字符串末尾,其后不可能再找到一组字符与其对应,表达式匹配过程终止,未找到匹配,返回false——即确定n不是2、3、4、…、n的2以上倍数; 四、取反,则质数返回true,非质数返回false。 评价:算法效率极低,但也是一种可行的方法。

♥ 132 ↩ 4

Peruny 2025-04-26

用正则表达式实现某些数学运算(比如将匹配到的数字结果+1)确实挺有意思的,但是太难读懂和维护了。只能在shell或者编辑器里临时用一用,或者拿来锻炼一下大脑[笑哭]

♥ 160 ↩ 6

EnderGZM 2025-04-26

其实就是一般人对正则表达式不熟悉罢了,其他的都很明显,不过正则表达式这玩意真的一个月不用就忘光了,真有人天天用吗

♥ 83 ↩ 8

Ace_Snow 2025-04-26

学计算机就像学魔法,要使用什么魔法的时候要念招式名字(声明函数名称)确认魔法属性(用什么类型的数据)修改魔法回路(改bug)

♥ 79 ↩ 1

area7 2025-04-28

思路很精妙,效率嘛……怪不得用1000为例就已经是“相当大”的数字了[滑稽]

♥ 55 ↩ 3

Cath 2025-04-27

ai大爆发之后正则才变得好用,不然他那反人类的可读性性真的难以使用

♥ 73 ↩ 8

GTX1090Ti 2025-04-26

好的,我们来详细解释一下这个正则表达式 ^.?$|^(..+?)\1+$ 是如何用来判断一个数是否为质数的。 这个技巧的核心在于表示方式和正则表达式的匹配...

♥ 56 ↩ 4

DaBaiGoose 2025-04-26

正则表达式这种邪恶的东西到底是多缺德的人才能发明出来啊[doge]

♥ 44 ↩ 8

天下第三月五 2025-04-26

就是纯粹的穷举所有乘积然后和这个数比较是吧,但是能在正则表达式里面找到这种方法真的nb

♥ 24

九万个不知道 2025-04-28

孩子们是真的有用[doge_金箍]

♥ 28 ↩ 8

寒の飞扬 2025-04-26

这是。。。智慧型德爷?

♥ 20

窝窝头刨手手 2025-04-27

感觉正则表达式是一个图灵完备的语言[箱庭少女之梦表情包_我有一计]

♥ 16 ↩ 6

老王吖-cxzlw 2025-04-26

草,左边匹配{0,1}这俩不是质数也不是合数的,右边匹配合数 匹配合数原理是:匹配可以被x+kx(xk都是整数,x≥2,k≥1)表示的数,也就是可以被表示为大于等于二的两个整数相乘的数字 这样正整数排除01和合数,就是质数了

♥ 16