nyy 发表于 2022-10-11 12:29:49

找出所有的生日素数!

比如19491001这个1949年10月1日(星期六),这天出生的是素数,现在要找出所有的这样的生日素数,
时间从1900年到2023年

Clear["Global`*"];(*Clear all variables*)
(*生成生日素数的所有可能,从1900年开始到2023年,day必然是奇数,需要删选掉部分不存在的日期*)
aaa=Table
bbb=Flatten@aaa;(*压平,成一个列表*)
ccc=Select&](*选出所有的素数*)
ddd=Select==1111&](*选出光棍节的生日*)


我筛选出了所有的光棍节那天的素数
{19051111,19181111,19321111,19421111,19541111,19591111,19631111,19771111,19931111,20051111,20141111}

大家继续上!


百度告诉我最孤独的质数
https://bbs.emath.ac.cn/thread-18619-1-1.html

nyy 发表于 2022-10-11 12:52:08

本帖最后由 nyy 于 2022-10-11 13:26 编辑

算出上面的ccc,
然后用正则表达式把结果中的19000103替换成1900-01-03,然后粘贴到Excel中,
Excel对于准确的日期,自动右对齐,
然后不合格的日期,自动当成文本,自动左对齐
然后利用Excel的排序功能,正确的日期自动在前,错误的日期自动在后!
最后求解结果如下:
1900/01/03
1900/01/23
1900/02/13
1900/02/29
1900/04/09
1900/04/11
1900/05/11

删除很多结果,因为结果太长影响阅读
-------------------------错误日期以下-------------------------
1901-11-31
1902-04-31
1904-04-31
1907-11-31
删除很多结果,因为结果太长影响阅读
1921-02-29
删除很多结果,因为结果太长影响阅读
2022-06-31

nyy 发表于 2022-10-11 12:56:02

nyy 发表于 2022-10-11 12:52
算出上面的ccc,
然后用正则表达式把结果中的19000103替换成1900-01-03,然后粘贴到Excel中,
Excel对于 ...

上面有个错误日期
1900/02/29

这个是由于Excel的bug导致的!

nyy 发表于 2022-10-11 13:25:10

Clear["Global`*"];(*Clear all variables*)
(*生成生日素数的所有可能,从1900年开始到2023年,day必然是奇数,需要删选掉部分不存在的日期*)
aaa=Table;
bbb=Flatten@aaa;(*压平,成一个列表*)
ccc=Select&];(*选出所有的素数*)
(*子函数,判别8位日期(比如19010203)是否是正确日期,正确返回1,错误返回0*)
fun:=Module[{lst,year,month,day,leap},
    lst=IntegerDigits;(*十进制下每位上的数字*)
    year=FromDigits]];(*得到年*)
    month=FromDigits]];(*得到月*)
    day=FromDigits]];(*得到日*)
    If&&(1<=day<=31),Return];(*大月天数不超过31*)
    If&&(1<=day<=30),Return];(*平月天数不超过30*)
    leap=0;(*是否润年,0不是,1是闰年*)
    If[(Mod==0&&Mod!=0)||(Mod==0),leap=1];(*判别闰年*)
    If[(month==2)&&Or,Return];(*二月情况判别*)
    Return(*其余情况一概返回错误0*)
]
ddd=Select==1&];(*从这些素数中选择日期正确的日期*)


最后结果2770个正确的日期都是素数

northwolves 发表于 2022-10-12 16:41:11

from sympy import isprime
import pandas as pd
date_list = if isprime(d)]
print(date_list,len(date_list))

nyy 发表于 2022-10-13 09:17:50

northwolves 发表于 2022-10-12 16:41


Clear["Global`*"];(*Clear all variables*)
aaa=DateRange[{1900,1,1},{2023,12,31}];(*生成这个时间段内的所有日期*)
bbb=(#[]*10000+#[]*100+#[])&/@aaa;(*映射得到日期的八位数*)
ccc=Select&](*选择八位数是素数的*)
ddd=Length(*得到2770个结果*)


这个也可以得到所有的结果,如果你喜欢还可以写成一行,
但是我写成多行,因为多行好写注释,且容易懂!还好维护!

nyy 发表于 2022-10-13 16:20:23

northwolves 发表于 2022-10-12 16:41


out=Select[(#[]*10^4+#[]*100+#[])&/@DateRange[{1900,1,1},{2023,12,31}],PrimeQ[#]&]


无耻的一行代码,我很讨厌写这样的代码,具体注释参考我楼上的代码

nyy 发表于 2022-10-13 16:23:16

自己真愚蠢,忽略了mathematica自身也有日期计算函数,且他们的函数可靠度比我的高多了!

nyy 发表于 2022-10-14 10:15:46

northwolves 发表于 2022-10-12 16:41


Select[(#[]*10^4 + #[]*100 + #[]) & /@ DateRange[{1900}, {2023}], PrimeQ[#] &] 还能短一些

你的这个代码有问题

northwolves 发表于 2022-10-15 00:12:30

本帖最后由 northwolves 于 2022-10-15 00:16 编辑

nyy 发表于 2022-10-14 10:15
Select[(#[]*10^4 + #[]*100 + #[]) & /@ DateRange[{1900}, {2023}], PrimeQ[#] &] 还能短一些 ...

a=Select[(#[]*10^4+#[]*100+#[])&/@DateRange[{1900},{1902}],PrimeQ[#]&]
b=Select,100]&/@Range,PrimeQ]
c=Select&@@@DateRange[{1900},{1902}],PrimeQ]
d=Select].{10000,100,1,0,0,0},PrimeQ]
e=Select[[;;,;;3]].{10000,100,1},PrimeQ]
f=Select,;;,3].{10000,100,1},PrimeQ]

感谢 wayne 和chy 两位版主提供的代码,测试通过
页: [1] 2
查看完整版本: 找出所有的生日素数!