楼主: 〇〇

求200万以内质数的个数

 关闭 [复制链接]
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
31#
发表于 2010-12-25 11:57 | 只看该作者
newkid ,OO 兄,你们真是太强了; 那就把一些常见的数论和概率论问题都让你们解决吧;
关键看你们有没有这么多时间研究,比如把几个最经典的问题用SQL接一下:
1.哥德巴赫猜想
  任意一个充分大的偶数=一个素数+另一个素数 (200万以内的)
2.四色问题
  就是地图上,有很多接壤的国家;只需要最少4种颜色就可以把这些国家区分下来;

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
32#
 楼主| 发表于 2024-10-29 10:04 | 只看该作者
14年后写的还不如以前的
--duckdb
with
a as (select value from generate_series(3,1000,2)_(value)) --all odds divider
,t as(select * from a
except
select a.value*b.value from a,a b where a.value <=sqrt(1000) and b.value <=1000/3+1)
,a2 as(select value from generate_series(3,1000000,2)_(value)) --all odds
,t2 as(select * from a2
except
select a.value*b.value from a,a2 b where a.value <=sqrt(1000000) and b.value <=1000000/3+1)
select 2+sum(value) from t2;

37550402023
Run Time (s): real 7.116 user 25.537364 sys 1.700411

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
33#
 楼主| 发表于 2024-10-29 10:22 | 只看该作者
本帖最后由 〇〇 于 2024-10-29 11:03 编辑

27楼的duckdb语法改写,差了几万,不知问题出在哪
with t0 as
(select level*2+1 l from range(1,1+(sqrt(1000000)/2)::int) _(level)),
t1 as (select level*2+1 l from range(1,1+(sqrt(1000000)/3)::int) _(level))
,p1k as(select l from t0
except
select t1.l*t2.l from t1,t1 t2 where t1.l<=sqrt(sqrt(1000000))
and t1.l<=t2.l and t1.l*t2.l<=1000000
)
,t as
(select level*6+1 l from range(1,1+(1000000/6)::int) _(level)
union all
select level*6+5 l from range(1,1+(1000000/6)::int) _(level)
)
,p2m as(select l from t
except
select /*+ USE_MERGE (t1 t2) */ t1.l*t2.l from p1k t1,t t2 where t1.l<=sqrt(1000000)
and t1.l<=t2.l and t1.l*t2.l<=1000000 and t2.l<=(1000000/19)
except
select level*5 from range(1,1+(1000000/5)::int) _(level)
except
select level*7+7 from range(1,1+(1000000/7)::int) _(level)
except
select level*11+11 from range(1,1+(1000000/11)::int) _(level)
except
select level*13+13 from range(1,1+(1000000/13)::int) _(level)
except
select level*17+17 from range(1,1+(1000000/17)::int) _(level)
)
select sum(l) from p2m;

37553402024

Run Time (s): real 0.200 user 0.343202 sys 0.296402


溢出了
D select * from t24 order by l desc limit 10;

1000007
1000003
1000001

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
34#
 楼主| 发表于 2024-10-29 15:48 | 只看该作者
递归版本

with recursive a as(select value from generate_series(3,1000000,2)_(value))
,t as(select 3 lv, value from a
union all
select min(case when value>lv then value end) over(),t.value from t where (t.value<=lv or (t.value>lv and t.value % lv<>0)) and lv< sqrt(1000000) )
select 2+sum(value) from t where lv=(select max(lv)from t);

37550402023

Run Time (s): real 3.479 user 3.463222 sys 0.015600

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
35#
发表于 2024-10-29 23:23 | 只看该作者
你是想用筛法,但是中间数据太多了,都是垃圾。当N=两百万时ORACLE的递归WITH好几分钟都出不来。

with  a as(SELECT 2*ROWNUM+1 value FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1)
,t(lv,value)
as(select 3 lv, value from a
union all
select min(case when value>lv then value end) over(),t.value from t where (t.value<=lv or (t.value>lv and mod(t.value,lv)<>0)) and lv< sqrt(:n) )
select 2+sum(value) from t where lv=(select max(lv)from t);

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
36#
 楼主| 发表于 2024-10-30 07:32 | 只看该作者
oracle没duckdb快,N=200w
142913828922

Run Time (s): real 10.451 user 9.843663 sys 0.608404

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
37#
 楼主| 发表于 2024-11-1 08:13 | 只看该作者
本帖最后由 〇〇 于 2024-11-1 08:14 编辑

看到一个快速筛算法 https://ask.csdn.net/questions/7850344


# 返回所有素数(小于n)的数量
n=int(input('请输入一个整数:'))
n -= 1
if n < 2:
    print(0)
r = int(n ** 0.5)
V = [n//d for d in range(1, r + 1)]
V += list(range(V[-1] - 1, 0, -1))            
S = {v: v - 1 for v in V}
#print(S)
for p in range(2, r + 1):
    if S[p] == S[p - 1]:
        continue
    p2 = p * p
    sp_1 = S[p - 1]
    for v in V:
        if v < p2:
            break
        S[v] -= S[v//p] - sp_1
print(S[n])


没懂

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
38#
 楼主| 发表于 2024-11-1 08:23 | 只看该作者
本帖最后由 〇〇 于 2024-11-1 14:15 编辑

这个欧拉筛好懂一些 https://www.cnblogs.com/Judge/p/11690114.html
def getPrime(n):
    v=[0 for i in range(n+3)]
    p=[]
    for i in range(2,n+1):
        if v[ i]==0:
            p.append(i)
#            print(i)
        for j in p:
            if i*j>n:
                break
            v[i*j]=1
            if i%j==0:
                break
    return p

其实也没少筛很多
如果把原始算法的偶数排除,就和它差不多

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
39#
 楼主| 发表于 2024-12-4 22:06 来自手机 | 只看该作者
sqlite版本 https://github.1git.de/PlummersSoftwareLLC/Primes/blob/drag-race/PrimeSQL/solution_1/sqlite_runner.py

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表