找出所有的生日素数!
比如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 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:52
算出上面的ccc,
然后用正则表达式把结果中的19000103替换成1900-01-03,然后粘贴到Excel中,
Excel对于 ...
上面有个错误日期
1900/02/29
这个是由于Excel的bug导致的! 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个正确的日期都是素数 from sympy import isprime
import pandas as pd
date_list = if isprime(d)]
print(date_list,len(date_list))
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个结果*)
这个也可以得到所有的结果,如果你喜欢还可以写成一行,
但是我写成多行,因为多行好写注释,且容易懂!还好维护! northwolves 发表于 2022-10-12 16:41
out=Select[(#[]*10^4+#[]*100+#[])&/@DateRange[{1900,1,1},{2023,12,31}],PrimeQ[#]&]
无耻的一行代码,我很讨厌写这样的代码,具体注释参考我楼上的代码 自己真愚蠢,忽略了mathematica自身也有日期计算函数,且他们的函数可靠度比我的高多了! northwolves 发表于 2022-10-12 16:41
Select[(#[]*10^4 + #[]*100 + #[]) & /@ DateRange[{1900}, {2023}], PrimeQ[#] &] 还能短一些
你的这个代码有问题 本帖最后由 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