📝 docs(0037.TruncatablePrimes):添加readme.md文档解释截断素数只有11个的原因 ✨ feat(euler_38.py):新增全数字倍数问题的解决方案,包含优化算法和详细注释
截断素数
截断素数为什么只有11个? 我看到很多人有这个疑问,我自己也是思考了很久,才恍然的。
首先,向左向右分别截断一个素数,得到的依然是素数,这有多难呢?最右的数位显然只能是3、7。 2、5,会让这个向右截断的数编程可以合数,并且截断到最后只有一位数时,只能是2、3、5、7,在排除前面说的2和5,那么最右的数位只能是3、7。 相似的向左截断时,最左的数位显然只能是2、3、5、7。 中间的数,在向左截断时,显然不能时双数,那只能从1、3、5、7、9中选取,而5结尾的数必然可以被5整除,所以中间的数不能有5结尾。 这也就导致中间只有1、3、7、9这四个数可选。 到这我们了解了这个最基本的数字约束。
其次,由于截断的每一步都是一个素数,这就导致在高位数时可满足上述条件的素数会更为稀疏, 简单尝试验证就能发现,从7位数开始,满足上述约束的截断素数会更少,且不会超过6位数的情况,而6位数只有一个截断素数,739397。 由于素数的分布是高度不均匀的,所以,而偏向连续位数的素数出现概率本身就会随素数本身的不均匀分布而更难出现。 这也能很好的解释,为什么没有五位数的截断素数。
总之,需要严格证明的话,我们可以根据 【Angell & Godwin,1977】 简单扩展得到,右截断素数在文章中以证明有83个,且最大的为73939133。那么,就可以简单枚举到这个最大的右截断素数中所有的左截断素数,就是结果了。
MiroMind的模型真的不错,很好的总结了截断素数相关的论文研究 【分享链接】 。