hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 558|回复: 9

找出所有的生日素数!

[复制链接]

523

主题

523

帖子

1599

积分

大司空

Rank: 5Rank: 5

积分
1599
发表于 2023-9-26 21:41:33 | 显示全部楼层 |阅读模式
比如19491001这个1949年10月1日(星期六),这天出生的是素数,现在要找出所有的这样的生日素数,
时间从1900年到2023年
  1. Clear["Global`*"];(*Clear all variables*)(*生成生日素数的所有可能,从1900年开始到2023年,day必然是奇数,需要删选掉部分不存在的日期*)aaa=Table[year*10000+month*100+day,{year,1900,2023},{month,1,12},{day,1,31,2}]bbb=Flatten@aaa;(*压平,成一个列表*)ccc=Select[bbb,PrimeQ[#]&](*选出所有的素数*)ddd=Select[ccc,Mod[#,10^4]==1111&](*选出光棍节的生日*)
复制代码

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

大家继续上!


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

使用道具 举报

0

主题

182

帖子

76

积分

关内侯

Rank: 2

积分
76
发表于 2023-9-26 21:41:58 | 显示全部楼层
算出上面的ccc,
然后用正则表达式把结果中的19000103替换成1900-01-03,然后粘贴到Excel中,
Excel对于准确的日期,自动右对齐,
然后不合格的日期,自动当成文本,自动左对齐
然后利用Excel的排序功能,正确的日期自动在前,错误的日期自动在后!
最后求解结果如下:
  1. 1900/01/031900/01/231900/02/131900/02/291900/04/091900/04/111900/05/11删除很多结果,因为结果太长影响阅读-------------------------错误日期以下-------------------------1901-11-311902-04-311904-04-311907-11-31删除很多结果,因为结果太长影响阅读1921-02-29删除很多结果,因为结果太长影响阅读2022-06-31
复制代码
回复

使用道具 举报

0

主题

173

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-26 21:42:22 | 显示全部楼层
上面有个错误日期
1900/02/29

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

使用道具 举报

0

主题

174

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-26 21:43:15 | 显示全部楼层
  1. Clear["Global`*"];(*Clear all variables*)(*生成生日素数的所有可能,从1900年开始到2023年,day必然是奇数,需要删选掉部分不存在的日期*)aaa=Table[year*10000+month*100+day,{year,1900,2023},{month,1,12},{day,1,31,2}];bbb=Flatten@aaa;(*压平,成一个列表*)ccc=Select[bbb,PrimeQ[#]&];(*选出所有的素数*)(*子函数,判别8位日期(比如19010203)是否是正确日期,正确返回1,错误返回0*)fun[n_]:=Module[{lst,year,month,day,leap},    lst=IntegerDigits[n,10];(*十进制下每位上的数字*)    year=FromDigits[lst[[1;;4]]];(*得到年*)    month=FromDigits[lst[[5;;6]]];(*得到月*)    day=FromDigits[lst[[7;;8]]];(*得到日*)    If[MemberQ[{1,3,5,7,8,10,12},month]&&(1<=day<=31),Return[1]];(*大月天数不超过31*)    If[MemberQ[{4,6,9,11},month]&&(1<=day<=30),Return[1]];(*平月天数不超过30*)    leap=0;(*是否润年,0不是,1是闰年*)    If[(Mod[year,4]==0&&Mod[year,100]!=0)||(Mod[year,400]==0),leap=1];(*判别闰年*)    If[(month==2)&&Or[leap==0&&(1<=day<=28),leap==1&&(1<=day<=29)],Return[1]];(*二月情况判别*)    Return[0](*其余情况一概返回错误0*)]ddd=Select[ccc,fun[#]==1&];(*从这些素数中选择日期正确的日期*)
复制代码

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

使用道具 举报

275

主题

454

帖子

1014

积分

大司空

Rank: 5Rank: 5

积分
1014
发表于 2023-9-26 21:43:20 | 显示全部楼层
  1. from sympy import isprimeimport pandas as pddate_list = [d for d in [int(d) for d in pd.date_range('1900-1-1', '2023-12-31').strftime("%Y%m%d").tolist()] if isprime(d)]print(date_list,len(date_list))
复制代码
回复

使用道具 举报

0

主题

168

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-9-26 21:44:14 | 显示全部楼层
  1. Clear["Global`*"];(*Clear all variables*)aaa=DateRange[{1900,1,1},{2023,12,31}];(*生成这个时间段内的所有日期*)bbb=(#[[1]]*10000+#[[2]]*100+#[[3]])&/@aaa;(*映射得到日期的八位数*)ccc=Select[bbb,PrimeQ[#]&](*选择八位数是素数的*)ddd=Length[ccc](*得到2770个结果*)
复制代码

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

使用道具 举报

0

主题

170

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-26 21:44:21 | 显示全部楼层
  1. out=Select[(#[[1]]*10^4+#[[2]]*100+#[[3]])&/@DateRange[{1900,1,1},{2023,12,31}],PrimeQ[#]&]
复制代码

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

使用道具 举报

0

主题

184

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-26 21:44:51 | 显示全部楼层
自己真愚蠢,忽略了mathematica自身也有日期计算函数,且他们的函数可靠度比我的高多了!
回复

使用道具 举报

948

主题

1162

帖子

3655

积分

超级版主

Rank: 8Rank: 8

积分
3655

论坛头条论坛元老谋士数据帝优秀版主超级版主见习版主论坛版主

发表于 2023-9-26 21:45:14 | 显示全部楼层
Select[(#[[1]]*10^4 + #[[2]]*100 + #[[3]]) & /@ DateRange[{1900}, {2023}], PrimeQ[#] &] 还能短一些

你的这个代码有问题
回复

使用道具 举报

0

主题

180

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2023-9-26 21:45:31 | 显示全部楼层
  1. a=Select[(#[[1]]*10^4+#[[2]]*100+#[[3]])&/@DateRange[{1900},{1902}],PrimeQ[#]&]b=Select[FromDigits[DatePlus[{1900},#],100]&/@Range[365*2],PrimeQ]c=Select[FromDigits[{#,#2,#3},100]&@@@DateRange[{1900},{1902}],PrimeQ]d=Select[Round[DateRange[{1900},{1902}]].{10000,100,1,0,0,0},PrimeQ]e=Select[DateRange[{1900},{1902}][[;;,;;3]].{10000,100,1},PrimeQ]f=Select[Take[DateRange[{1900},{1902}],;;,3].{10000,100,1},PrimeQ]
复制代码

感谢 wayne 和  chy 两位版主提供的代码,测试通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-25 11:35 , Processed in 0.067980 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表