楼主: 〇〇

求200万以内质数的个数

 关闭 [复制链接]
论坛徽章:
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
11#
 楼主| 发表于 2009-12-10 06:10 | 只看该作者
学习

使用道具 举报

回复
论坛徽章:
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
12#
 楼主| 发表于 2009-12-10 08:17 | 只看该作者
去掉order by,加rule 提示
SQL> with t as(select level*2+1 l from dual connect by level<=1E4),
  2  t1 as(select l from t where l<=sqrt(2)*1E2 and l>=11)
  3  select count(t.l) from (select l from t where mod(l,3)<>0 and mod(l,5)<>0 and mod(l,7)<>0)t
  4  where not exists(select t1.l from t1
  5  where t1.l<=sqrt(t.l) and mod(t.l,t1.l)=0)
  6  /

COUNT(T.L)
----------
      2258

Elapsed: 00:00:36.11
SQL> with t as(select level*2+1 l from dual connect by level<=1E4),
  2  t1 as(select l from t where l<=sqrt(2)*1E2 and l>=11)
  3  select count(t.l) from (select /*+rule*/ l from t where mod(l,3)<>0 and mod(l,5)<>0 and mod(l,7)<>0)t
  4  where not exists(select t1.l from t1
  5  where t1.l<=sqrt(t.l) and mod(t.l,t1.l)=0)
  6  /

COUNT(T.L)
----------
      2258

Elapsed: 00:00:05.11

不过我的试除取余法本来就比不上筛法

使用道具 举报

回复
论坛徽章:
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
13#
 楼主| 发表于 2009-12-10 08:22 | 只看该作者
8楼有个小问题,t中有偶数,直接用t_odd更快


SQL> WITH t AS (
  2     SELECT ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000-1
  3     )
  4  ,t_odd AS (
  5     SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000-1
  6     )
  7  SELECT COUNT(*)+1
  8    FROM (SELECT rn from t_odd
  9          MINUS
10          SELECT t1.rn * t2.rn
11            FROM t t1, t t2
12           WHERE t1.rn <= t2.rn
13                 AND t1.rn <= (SELECT SQRT(20000) FROM DUAL)
14                 AND t1.rn * t2.rn <20000
15         )
16  /

COUNT(*)+1
----------
      2262

Elapsed: 00:00:01.20
SQL> WITH t AS (
  2     SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000-1
  3     )
  4  SELECT COUNT(*)+1
  5    FROM (SELECT rn from t
  6          MINUS
  7          SELECT t1.rn * t2.rn
  8            FROM t t1, t t2
  9           WHERE t1.rn <= t2.rn
10                 AND t1.rn <= (SELECT SQRT(20000) FROM DUAL)
11                 AND t1.rn * t2.rn <20000
12         )
13  /

COUNT(*)+1
----------
      2262

Elapsed: 00:00:00.53

使用道具 举报

回复
论坛徽章:
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
14#
 楼主| 发表于 2009-12-10 08:35 | 只看该作者
排除几个明显的还是更快
SQL> WITH t0 AS (
  2     SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000-1
  3     ),
  4  t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0)
  5  SELECT COUNT(*)+1+3 --2,3,5,7
  6    FROM (SELECT rn from t
  7          MINUS
  8          SELECT t1.rn * t2.rn
  9            FROM t t1, t t2
10           WHERE t1.rn <= t2.rn
11                 AND t1.rn <= (SELECT SQRT(20000) FROM DUAL)
12                 AND t1.rn * t2.rn <20000
13         )
14  /

COUNT(*)+1+3
------------
        2262

Elapsed: 00:00:00.18

使用道具 举报

回复
论坛徽章:
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
15#
 楼主| 发表于 2009-12-10 08:48 | 只看该作者
ibm 570 aix 11g:
SQL> WITH t0 AS (
  2     SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 1000000-1
  3     ),
  4  t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0)
  5  SELECT COUNT(*)+1+3
  6    FROM (SELECT rn from t
  7          MINUS
  8          SELECT t1.rn * t2.rn
  9            FROM t t1, t t2
10           WHERE t1.rn <= t2.rn
11                 AND t1.rn <= SQRT(2000000)
12                 AND t1.rn * t2.rn <2000000
13         )
14  /

COUNT(*)+1+3
------------
      148933

已用时间:  00: 01: 05.61
windows
10g xe
SQL> WITH t0 AS (
  2     SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 1000000-1
  3     ),
  4  t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0)
  5  SELECT COUNT(*)+1+3
  6    FROM (SELECT rn from t
  7          MINUS
  8          SELECT t1.rn * t2.rn
  9            FROM t t1, t t2
10           WHERE t1.rn <= t2.rn
11                 AND t1.rn <= SQRT(2000000)
12                 AND t1.rn * t2.rn <2000000
13         )
14  /

COUNT(*)+1+3
------------
      148933

Elapsed: 00:01:19.75

使用道具 举报

回复
论坛徽章:
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
16#
发表于 2009-12-11 00:10 | 只看该作者
你这一改确实管用,现在200万也只需要半分钟了:

WITH t0 AS (
    SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1
    ),
t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0)
SELECT COUNT(*)+1+3 --2,3,5,7
   FROM (SELECT rn from t
         MINUS
         SELECT t1.rn * t2.rn
           FROM t t1, t t2
         WHERE t1.rn <= t2.rn
               AND t1.rn BETWEEN 9 AND (SELECT SQRT(:n) FROM DUAL)
               AND t1.rn * t2.rn <:n
       )
/


COUNT(*)+1+3
-----------------------
                 148933

Elapsed: 00:00:29.63

使用道具 举报

回复
论坛徽章:
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
17#
 楼主| 发表于 2009-12-11 08:19 | 只看该作者

回复 #16 newkid 的帖子

你的计算机速度比power 570还快!

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
18#
发表于 2009-12-11 08:56 | 只看该作者
学习.

使用道具 举报

回复
论坛徽章:
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
19#
 楼主| 发表于 2009-12-12 16:05 | 只看该作者
xe
SQL> var n number;
SQL> exec :n:=2000000;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.81
SQL> WITH t0 AS (
  2      SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1
  3      ),
  4  t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0)
  5  SELECT COUNT(*)+1+3 --2,3,5,7
  6     FROM (SELECT rn from t
  7           MINUS
  8           SELECT t1.rn * t2.rn
  9             FROM t t1, t t2
10           WHERE t1.rn <= t2.rn
11                 AND t1.rn BETWEEN 9 AND (SELECT SQRT(:n) FROM DUAL)
12                 AND t1.rn * t2.rn <:n
13         )
14  /

COUNT(*)+1+3--2,3,5,7
------------------------
                  148933

Elapsed: 00:01:06.32
SQL> 11
11*                AND t1.rn BETWEEN 9 AND (SELECT SQRT(:n) FROM DUAL)
SQL> c/BETWEEN 9 AND/<=
11*                AND t1.rn <= (SELECT SQRT(:n) FROM DUAL)
SQL> /

COUNT(*)+1+3--2,3,5,7
------------------------
                  148933

Elapsed: 00:00:49.07
SQL> 11
11*                AND t1.rn <= (SELECT SQRT(:n) FROM DUAL)
SQL> c/(SELECT SQRT(:n) FROM DUAL)/SQRT(:n)
11*                AND t1.rn <= SQRT(:n)
SQL> /

COUNT(*)+1+3--2,3,5,7
------------------------
                  148933

Elapsed: 00:00:40.39

使用道具 举报

回复
论坛徽章:
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
20#
 楼主| 发表于 2009-12-12 18:57 | 只看该作者
9i
14  /
    SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1
                                       *
ERROR 位于第 2 行:
ORA-01652: 无法通过2048(在表空间LTTEMPTS中)扩展 temp 段


已用时间:  00: 00: 54.03
SQL> conn sys/sys as sysdba
已连接。
SQL> var n number;
SQL> exec :n:=2000000;

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00
SQL> WITH t0 AS (
  2      SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1
  3      ),
  4  t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0)
  5  SELECT COUNT(*)+1+3 --2,3,5,7
  6     FROM (SELECT rn from t
  7           MINUS
  8           SELECT t1.rn * t2.rn
  9             FROM t t1, t t2
10           WHERE t1.rn <= t2.rn
11                 AND t1.rn <= SQRT(:n)
12                 AND t1.rn * t2.rn <:n
13         )
14  /
    SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1
                              *
ERROR 位于第 2 行:
ORA-00028: 您的会话己被删去


已用时间:  00: 13: 47.01

使用道具 举报

回复

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

本版积分规则 发表回复

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